diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AssertAdminProductAttributeByCodeOnProductFormActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AssertAdminProductAttributeByCodeOnProductFormActionGroup.xml
new file mode 100644
index 0000000000000..2432c974b79f4
--- /dev/null
+++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AssertAdminProductAttributeByCodeOnProductFormActionGroup.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+ Requires the navigation to the Product page. Provided dropdown attribute presents on the page.
+
+
+
+
+
+
+
+
diff --git a/app/code/Magento/Swatches/Controller/Adminhtml/Product/Attribute/Plugin/Save.php b/app/code/Magento/Swatches/Controller/Adminhtml/Product/Attribute/Plugin/Save.php
index 72d27152d639a..c264614b1a0cf 100644
--- a/app/code/Magento/Swatches/Controller/Adminhtml/Product/Attribute/Plugin/Save.php
+++ b/app/code/Magento/Swatches/Controller/Adminhtml/Product/Attribute/Plugin/Save.php
@@ -3,18 +3,33 @@
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
+declare(strict_types=1);
namespace Magento\Swatches\Controller\Adminhtml\Product\Attribute\Plugin;
use Magento\Catalog\Controller\Adminhtml\Product\Attribute;
use Magento\Framework\App\RequestInterface;
-use Magento\Swatches\Model\Swatch;
+use Magento\Swatches\Model\ConvertSwatchAttributeFrontendInput;
/**
* Plugin for product attribute save controller.
*/
class Save
{
+ /**
+ * @var ConvertSwatchAttributeFrontendInput
+ */
+ private $convertSwatchAttributeFrontendInput;
+
+ /**
+ * @param ConvertSwatchAttributeFrontendInput $convertSwatchAttributeFrontendInput
+ */
+ public function __construct(
+ ConvertSwatchAttributeFrontendInput $convertSwatchAttributeFrontendInput
+ ) {
+ $this->convertSwatchAttributeFrontendInput = $convertSwatchAttributeFrontendInput;
+ }
+
/**
* Performs the conversion of the frontend input value.
*
@@ -23,30 +38,12 @@ class Save
* @return array
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
- public function beforeDispatch(Attribute\Save $subject, RequestInterface $request)
+ public function beforeDispatch(Attribute\Save $subject, RequestInterface $request): array
{
$data = $request->getPostValue();
+ $data = $this->convertSwatchAttributeFrontendInput->execute($data);
+ $request->setPostValue($data);
- if (isset($data['frontend_input'])) {
- switch ($data['frontend_input']) {
- case 'swatch_visual':
- $data[Swatch::SWATCH_INPUT_TYPE_KEY] = Swatch::SWATCH_INPUT_TYPE_VISUAL;
- $data['frontend_input'] = 'select';
- $request->setPostValue($data);
- break;
- case 'swatch_text':
- $data[Swatch::SWATCH_INPUT_TYPE_KEY] = Swatch::SWATCH_INPUT_TYPE_TEXT;
- $data['use_product_image_for_swatch'] = 0;
- $data['frontend_input'] = 'select';
- $request->setPostValue($data);
- break;
- case 'select':
- $data[Swatch::SWATCH_INPUT_TYPE_KEY] = Swatch::SWATCH_INPUT_TYPE_DROPDOWN;
- $data['frontend_input'] = 'select';
- $request->setPostValue($data);
- break;
- }
- }
return [$request];
}
}
diff --git a/app/code/Magento/Swatches/Model/ConvertSwatchAttributeFrontendInput.php b/app/code/Magento/Swatches/Model/ConvertSwatchAttributeFrontendInput.php
new file mode 100644
index 0000000000000..698d0fcc4aea2
--- /dev/null
+++ b/app/code/Magento/Swatches/Model/ConvertSwatchAttributeFrontendInput.php
@@ -0,0 +1,46 @@
+convertSwatchAttributeFrontendInput = $convertSwatchAttributeFrontendInput;
+ }
+
+ /**
+ * Performs the conversion of the frontend input value.
+ *
+ * @param ProductAttributeRepository $subject
+ * @param ProductAttributeInterface $attribute
+ * @return array
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ */
+ public function beforeSave(
+ ProductAttributeRepository $subject,
+ ProductAttributeInterface $attribute
+ ): array {
+ $data = $attribute->getData();
+ $data = $this->convertSwatchAttributeFrontendInput->execute($data);
+ $attribute->setData($data);
+
+ return [$attribute];
+ }
+}
diff --git a/app/code/Magento/Swatches/Test/Mftf/Data/SwatchAttributeData.xml b/app/code/Magento/Swatches/Test/Mftf/Data/SwatchAttributeData.xml
index b05c9cc9e7a9a..6070ae25f570f 100644
--- a/app/code/Magento/Swatches/Test/Mftf/Data/SwatchAttributeData.xml
+++ b/app/code/Magento/Swatches/Test/Mftf/Data/SwatchAttributeData.xml
@@ -18,4 +18,7 @@
TextSwatchAttr
text_swatch_attr
+
+ swatch_text
+
diff --git a/app/code/Magento/Swatches/Test/Mftf/Test/AdminCheckTextSwatchAttributeAddedViaApiTest.xml b/app/code/Magento/Swatches/Test/Mftf/Test/AdminCheckTextSwatchAttributeAddedViaApiTest.xml
new file mode 100644
index 0000000000000..5e5515aa25a74
--- /dev/null
+++ b/app/code/Magento/Swatches/Test/Mftf/Test/AdminCheckTextSwatchAttributeAddedViaApiTest.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/code/Magento/Swatches/Test/Unit/Controller/Adminhtml/Product/Attribute/Plugin/SaveTest.php b/app/code/Magento/Swatches/Test/Unit/Controller/Adminhtml/Product/Attribute/Plugin/SaveTest.php
deleted file mode 100644
index c9c826b3a7831..0000000000000
--- a/app/code/Magento/Swatches/Test/Unit/Controller/Adminhtml/Product/Attribute/Plugin/SaveTest.php
+++ /dev/null
@@ -1,70 +0,0 @@
-createMock(\Magento\Catalog\Controller\Adminhtml\Product\Attribute\Save::class);
- $request = $this->createPartialMock(\Magento\Framework\App\RequestInterface::class, [
- 'getPostValue',
- 'setPostValue',
- 'getModuleName',
- 'setModuleName',
- 'getActionName',
- 'setActionName',
- 'getParam',
- 'setParams',
- 'getParams',
- 'getCookie',
- 'isSecure'
- ]);
-
- $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
- $controller = $objectManager->getObject(
- \Magento\Swatches\Controller\Adminhtml\Product\Attribute\Plugin\Save::class
- );
-
- $request->expects($this->once())->method('getPostValue')->willReturn($dataRequest);
- $request->expects($this->exactly($runTimes))->method('setPostValue')->willReturn($this->returnSelf());
-
- $controller->beforeDispatch($subject, $request);
- }
-
- /**
- * @return array
- */
- public function dataRequest()
- {
- return [
- [
- ['frontend_input' => 'swatch_visual'],
- 1
- ],
- [
- ['frontend_input' => 'swatch_text'],
- 1
- ],
- [
- ['frontend_input' => 'select'],
- 1
- ],
- [
- [],
- 0
- ],
- [
- null,
- 0
- ],
- ];
- }
-}
diff --git a/app/code/Magento/Swatches/Test/Unit/Model/ConvertSwatchAttributeFrontendInputTest.php b/app/code/Magento/Swatches/Test/Unit/Model/ConvertSwatchAttributeFrontendInputTest.php
new file mode 100644
index 0000000000000..1d27a33e5c244
--- /dev/null
+++ b/app/code/Magento/Swatches/Test/Unit/Model/ConvertSwatchAttributeFrontendInputTest.php
@@ -0,0 +1,86 @@
+convertSwatchAttributeFrontendInput =
+ $objectManager->getObject(ConvertSwatchAttributeFrontendInput::class);
+ }
+
+ /**
+ * @dataProvider attributeData
+ */
+ public function testExecute($inputData, $outputData)
+ {
+ $result = $this->convertSwatchAttributeFrontendInput->execute($inputData);
+ $this->assertEquals($outputData, $result);
+ }
+
+ /**
+ * @return array
+ */
+ public function attributeData()
+ {
+ return [
+ [
+ [
+ 'frontend_input' => 'swatch_visual'
+ ],
+ [
+ 'frontend_input' => 'select',
+ Swatch::SWATCH_INPUT_TYPE_KEY => Swatch::SWATCH_INPUT_TYPE_VISUAL,
+ ]
+ ],
+ [
+ [
+ 'frontend_input' => 'swatch_text'
+ ],
+ [
+ 'frontend_input' => 'select',
+ Swatch::SWATCH_INPUT_TYPE_KEY => Swatch::SWATCH_INPUT_TYPE_TEXT,
+ 'use_product_image_for_swatch' => 0
+ ]
+ ],
+ [
+ [
+ 'frontend_input' => 'select'
+ ],
+ [
+ 'frontend_input' => 'select',
+ Swatch::SWATCH_INPUT_TYPE_KEY => Swatch::SWATCH_INPUT_TYPE_DROPDOWN,
+ ]
+ ],
+ [
+ [],
+ []
+ ],
+ [
+ null,
+ null
+ ],
+ ];
+ }
+}
diff --git a/app/code/Magento/Swatches/etc/webapi_rest/di.xml b/app/code/Magento/Swatches/etc/webapi_rest/di.xml
new file mode 100644
index 0000000000000..f05b9727db28a
--- /dev/null
+++ b/app/code/Magento/Swatches/etc/webapi_rest/di.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+