Skip to content

Commit 8a73ec6

Browse files
author
Mykola Palamar
committed
MAGETWO-63988: Remove usages of serialize/unserilize from Swatches module
1 parent 0c7b1e4 commit 8a73ec6

File tree

8 files changed

+127
-21
lines changed

8 files changed

+127
-21
lines changed

app/code/Magento/Swatches/Block/Adminhtml/Product/Attribute/Edit/Form.php

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,45 @@
66

77
namespace Magento\Swatches\Block\Adminhtml\Product\Attribute\Edit;
88

9+
use Magento\Framework\Data\Form\Element\CollectionFactory as ElementCollectionFactory;
10+
use Magento\Framework\Data\Form\Element\Factory;
11+
use Magento\Framework\Data\Form\FormKey;
912
use Magento\Swatches\Model\Swatch;
13+
use Magento\Framework\Serialize\Serializer\Json;
14+
use Magento\Framework\App\ObjectManager;
1015

1116
/**
1217
* Class Form
1318
*/
1419
class Form extends \Magento\Framework\Data\Form
1520
{
21+
/**
22+
* Serializer that allow convert arrays to string.
23+
*
24+
* @var Json
25+
*/
26+
private $serializer;
27+
28+
/**
29+
* Form constructor.
30+
*
31+
* @param Factory $factoryElement
32+
* @param ElementCollectionFactory $factoryCollection
33+
* @param FormKey $formKey
34+
* @param array $data
35+
* @param Json|null $serializer
36+
*/
37+
public function __construct(
38+
Factory $factoryElement,
39+
ElementCollectionFactory $factoryCollection,
40+
FormKey $formKey,
41+
array $data = [],
42+
Json $serializer = null
43+
) {
44+
parent::__construct($factoryElement, $factoryCollection, $formKey, $data);
45+
$this->serializer = $serializer ?: ObjectManager::getInstance()->get(Json::class);
46+
}
47+
1648
/**
1749
* @param array $values
1850
* @return $this
@@ -43,7 +75,7 @@ protected function getAdditionalData(array $values)
4375
{
4476
$additionalData = [];
4577
if (isset($values['additional_data'])) {
46-
$additionalData = unserialize($values['additional_data']);
78+
$additionalData = $this->serializer->unserialize($values['additional_data']);
4779
if (!is_array($additionalData)) {
4880
$additionalData = [];
4981
}

app/code/Magento/Swatches/Helper/Data.php

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,16 @@
88
use Magento\Catalog\Helper\Image;
99
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
1010
use Magento\ConfigurableProduct\Model\Product\Type\Configurable;
11-
use Magento\Framework\App\Helper\Context;
1211
use Magento\Catalog\Api\Data\ProductInterface as Product;
1312
use Magento\Catalog\Model\Product as ModelProduct;
1413
use Magento\Store\Model\StoreManagerInterface;
1514
use Magento\Swatches\Model\ResourceModel\Swatch\CollectionFactory as SwatchCollectionFactory;
1615
use Magento\Swatches\Model\Swatch;
1716
use Magento\Catalog\Model\ResourceModel\Eav\Attribute;
18-
use Magento\Framework\Exception\InputException;
1917
use Magento\Catalog\Api\ProductRepositoryInterface;
2018
use Magento\Catalog\Model\ResourceModel\Product\Collection as ProductCollection;
19+
use Magento\Framework\Serialize\Serializer\Json;
20+
use Magento\Framework\App\ObjectManager;
2121

2222
/**
2323
* Class Helper Data
@@ -81,25 +81,35 @@ class Data
8181
'use_product_image_for_swatch'
8282
];
8383

84+
/**
85+
* Serializer to/from JSON.
86+
*
87+
* @var Json
88+
*/
89+
private $serializer;
90+
8491
/**
8592
* @param CollectionFactory $productCollectionFactory
8693
* @param ProductRepositoryInterface $productRepository
8794
* @param StoreManagerInterface $storeManager
8895
* @param SwatchCollectionFactory $swatchCollectionFactory
8996
* @param Image $imageHelper
97+
* @param Json|null $serializer
9098
*/
9199
public function __construct(
92100
CollectionFactory $productCollectionFactory,
93101
ProductRepositoryInterface $productRepository,
94102
StoreManagerInterface $storeManager,
95103
SwatchCollectionFactory $swatchCollectionFactory,
96-
Image $imageHelper
104+
Image $imageHelper,
105+
Json $serializer = null
97106
) {
98107
$this->productCollectionFactory = $productCollectionFactory;
99108
$this->productRepository = $productRepository;
100109
$this->storeManager = $storeManager;
101110
$this->swatchCollectionFactory = $swatchCollectionFactory;
102111
$this->imageHelper = $imageHelper;
112+
$this->serializer = $serializer ?: ObjectManager::getInstance()->create(Json::class);
103113
}
104114

105115
/**
@@ -111,7 +121,7 @@ public function assembleAdditionalDataEavAttribute(Attribute $attribute)
111121
$initialAdditionalData = [];
112122
$additionalData = (string) $attribute->getData('additional_data');
113123
if (!empty($additionalData)) {
114-
$additionalData = unserialize($additionalData);
124+
$additionalData = $this->serializer->unserialize($additionalData);
115125
if (is_array($additionalData)) {
116126
$initialAdditionalData = $additionalData;
117127
}
@@ -125,7 +135,7 @@ public function assembleAdditionalDataEavAttribute(Attribute $attribute)
125135
}
126136
}
127137
$additionalData = array_merge($initialAdditionalData, $dataToAdd);
128-
$attribute->setData('additional_data', serialize($additionalData));
138+
$attribute->setData('additional_data', $this->serializer->serialize($additionalData));
129139
return $this;
130140
}
131141

@@ -135,7 +145,7 @@ public function assembleAdditionalDataEavAttribute(Attribute $attribute)
135145
*/
136146
private function populateAdditionalDataEavAttribute(Attribute $attribute)
137147
{
138-
$additionalData = unserialize($attribute->getData('additional_data'));
148+
$additionalData = $this->serializer->unserialize($attribute->getData('additional_data'));
139149
if (isset($additionalData) && is_array($additionalData)) {
140150
foreach ($this->eavAttributeAdditionalDataKeys as $key) {
141151
if (isset($additionalData[$key])) {

app/code/Magento/Swatches/Model/Plugin/EavAttribute.php

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
use Magento\Catalog\Model\ResourceModel\Eav\Attribute;
99
use Magento\Swatches\Model\Swatch;
1010
use Magento\Framework\Exception\InputException;
11+
use Magento\Framework\Serialize\Serializer\Json;
12+
use Magento\Framework\App\ObjectManager;
1113

1214
/**
1315
* Plugin model for Catalog Resource Attribute
@@ -50,19 +52,29 @@ class EavAttribute
5052
*/
5153
protected $isSwatchExists;
5254

55+
/**
56+
* Serializer from arrays to string.
57+
*
58+
* @var Json
59+
*/
60+
private $serializer;
61+
5362
/**
5463
* @param \Magento\Swatches\Model\ResourceModel\Swatch\CollectionFactory $collectionFactory
5564
* @param \Magento\Swatches\Model\SwatchFactory $swatchFactory
5665
* @param \Magento\Swatches\Helper\Data $swatchHelper
66+
* @param Json|null $serializer
5767
*/
5868
public function __construct(
5969
\Magento\Swatches\Model\ResourceModel\Swatch\CollectionFactory $collectionFactory,
6070
\Magento\Swatches\Model\SwatchFactory $swatchFactory,
61-
\Magento\Swatches\Helper\Data $swatchHelper
71+
\Magento\Swatches\Helper\Data $swatchHelper,
72+
Json $serializer = null
6273
) {
6374
$this->swatchCollectionFactory = $collectionFactory;
6475
$this->swatchFactory = $swatchFactory;
6576
$this->swatchHelper = $swatchHelper;
77+
$this->serializer = $serializer ?: ObjectManager::getInstance()->create(Json::class);
6678
}
6779

6880
/**
@@ -135,10 +147,10 @@ protected function convertSwatchToDropdown(Attribute $attribute)
135147
if ($attribute->getData(Swatch::SWATCH_INPUT_TYPE_KEY) == Swatch::SWATCH_INPUT_TYPE_DROPDOWN) {
136148
$additionalData = $attribute->getData('additional_data');
137149
if (!empty($additionalData)) {
138-
$additionalData = unserialize($additionalData);
150+
$additionalData = $this->serializer->unserialize($additionalData);
139151
if (is_array($additionalData) && isset($additionalData[Swatch::SWATCH_INPUT_TYPE_KEY])) {
140152
unset($additionalData[Swatch::SWATCH_INPUT_TYPE_KEY]);
141-
$attribute->setData('additional_data', serialize($additionalData));
153+
$attribute->setData('additional_data', $this->serializer->serialize($additionalData));
142154
}
143155
}
144156
}

app/code/Magento/Swatches/Setup/UpgradeData.php

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
use Magento\Swatches\Model\Swatch;
1515
use Zend_Db;
1616
use Zend_Db_Expr;
17+
use Magento\Framework\DB\FieldDataConverterFactory;
18+
use Magento\Framework\DB\DataConverter\SerializedToJson;
19+
use Magento\Framework\App\ObjectManager;
1720

1821
/**
1922
* Upgrade Data script
@@ -28,14 +31,23 @@ class UpgradeData implements UpgradeDataInterface
2831
*/
2932
private $eavSetupFactory;
3033

34+
/**
35+
* @var FieldDataConverterFactory
36+
*/
37+
private $fieldDataConverterFactory;
38+
3139
/**
3240
* Init
33-
*
3441
* @param EavSetupFactory $eavSetupFactory
42+
* @param FieldDataConverterFactory|null $fieldDataConverterFactory
3543
*/
36-
public function __construct(EavSetupFactory $eavSetupFactory)
37-
{
44+
public function __construct(
45+
EavSetupFactory $eavSetupFactory,
46+
FieldDataConverterFactory $fieldDataConverterFactory = null
47+
) {
3848
$this->eavSetupFactory = $eavSetupFactory;
49+
$this->fieldDataConverterFactory = $fieldDataConverterFactory
50+
?: ObjectManager::getInstance()->get(FieldDataConverterFactory::class);
3951
}
4052

4153
/**
@@ -61,10 +73,20 @@ public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface
6173
if (version_compare($context->getVersion(), '2.0.2', '<')) {
6274
$this->updateAdminTextSwatchValues($setup);
6375
}
76+
if (version_compare($context->getVersion(), '2.0.3', '<')) {
77+
$this->convertAddDataToJson($setup);
78+
}
6479

6580
$setup->endSetup();
6681
}
6782

83+
/**
84+
* Add fallback for default scope.
85+
*
86+
* @param ModuleDataSetupInterface $setup
87+
*
88+
* @return void
89+
*/
6890
private function updateAdminTextSwatchValues(ModuleDataSetupInterface $setup)
6991
{
7092
$storeData = $setup->getConnection()
@@ -107,4 +129,21 @@ private function updateAdminTextSwatchValues(ModuleDataSetupInterface $setup)
107129
);
108130
}
109131
}
132+
133+
/**
134+
* Convert additional data column from serialized view to JSON for swatch attributes.
135+
*
136+
* @param ModuleDataSetupInterface $setup
137+
* @return void
138+
*/
139+
private function convertAddDataToJson(ModuleDataSetupInterface $setup)
140+
{
141+
$fieldConverter = $this->fieldDataConverterFactory->create(SerializedToJson::class);
142+
$fieldConverter->convert(
143+
$setup->getConnection(),
144+
$setup->getTable('catalog_eav_attribute'),
145+
'attribute_id',
146+
'additional_data'
147+
);
148+
}
110149
}

app/code/Magento/Swatches/Test/Unit/Block/Adminhtml/Product/Attribute/Edit/FormTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public function dataForAddValues()
5050
],
5151
[
5252
[
53-
'additional_data' => serialize($additionalData),
53+
'additional_data' => json_encode($additionalData),
5454
'frontend_input' => 'select',
5555
]
5656
],

app/code/Magento/Swatches/Test/Unit/Helper/DataTest.php

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,12 @@ protected function setUp()
118118
'',
119119
false
120120
);
121+
122+
$serializer = $this->getMock(
123+
\Magento\Framework\Serialize\Serializer\Json::class,
124+
null
125+
);
126+
121127
$this->swatchHelperObject = $this->objectManager->getObject(
122128
\Magento\Swatches\Helper\Data::class,
123129
[
@@ -127,6 +133,7 @@ protected function setUp()
127133
'storeManager' => $this->storeManagerMock,
128134
'swatchCollectionFactory' => $this->swatchCollectionFactoryMock,
129135
'imageHelper' => $this->imageHelperMock,
136+
'serializer' => $serializer,
130137
]
131138
);
132139
$this->objectManager->setBackwardCompatibleProperty(
@@ -145,7 +152,7 @@ public function dataForAdditionalData()
145152
];
146153
return [
147154
[
148-
serialize($additionalData),
155+
json_encode($additionalData),
149156
[
150157
'getData' => 1,
151158
'setData' => 3,
@@ -196,7 +203,7 @@ public function dataForAssembleEavAttribute()
196203
];
197204
return [
198205
[
199-
serialize($additionalData),
206+
json_encode($additionalData),
200207
[
201208
'swatch_input_type' => 'visual',
202209
'update_product_preview_image' => 1,
@@ -833,7 +840,7 @@ public function dataForIsVisualSwatchType()
833840
];
834841
return [
835842
[
836-
serialize($additionalData),
843+
json_encode($additionalData),
837844
[
838845
'getData' => 1,
839846
'setData' => 3,
@@ -889,7 +896,7 @@ public function dataForIsTextSwatchType()
889896
];
890897
return [
891898
[
892-
serialize($additionalData),
899+
json_encode($additionalData),
893900
[
894901
'getData' => 1,
895902
'setData' => 3,

app/code/Magento/Swatches/Test/Unit/Model/Plugin/EavAttributeTest.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,19 @@ protected function setUp()
7878
false
7979
);
8080

81+
$serializer = $this->getMock(
82+
\Magento\Framework\Serialize\Serializer\Json::class,
83+
null
84+
);
85+
8186
$objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
8287
$this->eavAttribute = $objectManager->getObject(
8388
\Magento\Swatches\Model\Plugin\EavAttribute::class,
8489
[
8590
'collectionFactory' => $this->collectionFactory,
8691
'swatchFactory' => $this->swatchFactory,
8792
'swatchHelper' => $this->swatchHelper,
93+
'serializer' => $serializer,
8894
]
8995
);
9096

@@ -283,13 +289,13 @@ public function testBeforeSaveNotSwatch()
283289
['additional_data']
284290
)->willReturnOnConsecutiveCalls(
285291
Swatch::SWATCH_INPUT_TYPE_DROPDOWN,
286-
serialize($additionalData)
292+
json_encode($additionalData)
287293
);
288294

289295
$this->attribute
290296
->expects($this->once())
291297
->method('setData')
292-
->with('additional_data', serialize($shortAdditionalData))
298+
->with('additional_data', json_encode($shortAdditionalData))
293299
->will($this->returnSelf());
294300

295301
$this->swatchHelper->expects($this->never())->method('assembleAdditionalDataEavAttribute');

app/code/Magento/Swatches/etc/module.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*/
77
-->
88
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
9-
<module name="Magento_Swatches" setup_version="2.0.2">
9+
<module name="Magento_Swatches" setup_version="2.0.3">
1010
<sequence>
1111
<module name="Magento_Catalog"/>
1212
<module name="Magento_ConfigurableProduct"/>

0 commit comments

Comments
 (0)