Skip to content

Commit a2cf9b8

Browse files
authored
Merge pull request #791 from magento-troll/MAGETWO-63626
MAGETWO-58596: Remove uses of unserialize in Module_Widget
2 parents 8d1339c + f661c2c commit a2cf9b8

File tree

9 files changed

+195
-18
lines changed

9 files changed

+195
-18
lines changed

app/code/Magento/CatalogWidget/Test/Unit/Block/Product/ProductsListTest.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@ class ProductsListTest extends \PHPUnit_Framework_TestCase
7878
*/
7979
private $priceCurrency;
8080

81+
/**
82+
* @var \Magento\Framework\Serialize\Serializer\Json|\PHPUnit_Framework_MockObject_MockObject
83+
*/
84+
private $serializer;
85+
8186
protected function setUp()
8287
{
8388
$this->collectionFactory =
@@ -91,7 +96,12 @@ protected function setUp()
9196
$this->httpContext = $this->getMock(\Magento\Framework\App\Http\Context::class);
9297
$this->builder = $this->getMock(\Magento\Rule\Model\Condition\Sql\Builder::class, [], [], '', false);
9398
$this->rule = $this->getMock(\Magento\CatalogWidget\Model\Rule::class, [], [], '', false);
94-
$this->widgetConditionsHelper = $this->getMock(\Magento\Widget\Helper\Conditions::class);
99+
$this->serializer = $this->getMock(\Magento\Framework\Serialize\Serializer\Json::class, [], [], '', false);
100+
$this->widgetConditionsHelper = $this->getMock(
101+
\Magento\Widget\Helper\Conditions::class,
102+
[],
103+
['serializer' => $this->serializer]
104+
);
95105
$this->storeManager = $this->getMock(\Magento\Store\Model\StoreManagerInterface::class);
96106
$this->design = $this->getMock(\Magento\Framework\View\DesignInterface::class);
97107

app/code/Magento/Widget/Helper/Conditions.php

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,33 +5,52 @@
55
*/
66
namespace Magento\Widget\Helper;
77

8+
use Magento\Framework\App\ObjectManager;
9+
use Magento\Framework\Serialize\Serializer\Json;
10+
811
/**
9-
* Widget Conditions helper
12+
* Widget Conditions helper.
1013
*/
1114
class Conditions
1215
{
1316
/**
14-
* Encode widget conditions to be used with WYSIWIG
17+
* Instance of serializer interface.
18+
*
19+
* @var Json
20+
*/
21+
private $serializer;
22+
23+
/**
24+
* @param Json $serializer
25+
*/
26+
public function __construct(
27+
Json $serializer = null
28+
) {
29+
$this->serializer = $serializer ?: ObjectManager::getInstance()->get(Json::class);
30+
}
31+
32+
/**
33+
* Encode widget conditions to be used with WYSIWIG.
1534
*
1635
* @param array $value
1736
* @return string
1837
*/
1938
public function encode(array $value)
2039
{
21-
$value = str_replace(['{', '}', '"', '\\'], ['[', ']', '`', '|'], serialize($value));
40+
$value = str_replace(['{', '}', '"', '\\\\'], ['[', ']', '`', '|'], $this->serializer->serialize($value));
2241
return $value;
2342
}
2443

2544
/**
26-
* Decode previously encoded widget conditions
45+
* Decode previously encoded widget conditions.
2746
*
2847
* @param string $value
2948
* @return array
3049
*/
3150
public function decode($value)
3251
{
33-
$value = str_replace(['[', ']', '`', '|'], ['{', '}', '"', '\\'], $value);
34-
$value = unserialize($value);
52+
$value = str_replace(['[', ']', '`', '|'], ['{', '}', '"', '\\\\'], $value);
53+
$value = $this->serializer->unserialize($value);
3554
return $value;
3655
}
3756
}

app/code/Magento/Widget/Model/ResourceModel/Widget.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@
1111
*/
1212
namespace Magento\Widget\Model\ResourceModel;
1313

14+
/**
15+
* Resource model for widget.
16+
*
17+
* @deprecated Data from this table was moved to xml(widget.xml).
18+
*/
1419
class Widget extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
1520
{
1621
/**
@@ -41,7 +46,7 @@ public function loadPreconfiguredWidget($widgetId)
4146
$widget = $connection->fetchRow($select, $bind);
4247
if (is_array($widget)) {
4348
if ($widget['parameters']) {
44-
$widget['parameters'] = unserialize($widget['parameters']);
49+
$widget['parameters'] = $this->getSerializer()->unserialize($widget['parameters']);
4550
}
4651
return $widget;
4752
}

app/code/Magento/Widget/Model/Widget/Instance.php

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
namespace Magento\Widget\Model\Widget;
77

88
use Magento\Framework\App\Filesystem\DirectoryList;
9+
use Magento\Framework\Serialize\Serializer\Json;
10+
use Magento\Framework\App\ObjectManager;
911

1012
/**
1113
* Widget Instance Model
@@ -107,6 +109,13 @@ class Instance extends \Magento\Framework\Model\AbstractModel
107109
*/
108110
protected $conditionsHelper;
109111

112+
/**
113+
* Instance of serializer interface.
114+
*
115+
* @var Json
116+
*/
117+
private $serializer;
118+
110119
/**
111120
* @param \Magento\Framework\Model\Context $context
112121
* @param \Magento\Framework\Registry $registry
@@ -124,6 +133,7 @@ class Instance extends \Magento\Framework\Model\AbstractModel
124133
* @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
125134
* @param array $relatedCacheTypes
126135
* @param array $data
136+
* @param Json $serializer
127137
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
128138
*/
129139
public function __construct(
@@ -142,7 +152,8 @@ public function __construct(
142152
\Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
143153
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
144154
array $relatedCacheTypes = [],
145-
array $data = []
155+
array $data = [],
156+
Json $serializer = null
146157
) {
147158
$this->_escaper = $escaper;
148159
$this->_viewFileSystem = $viewFileSystem;
@@ -155,6 +166,7 @@ public function __construct(
155166
$this->conditionsHelper = $conditionsHelper;
156167
$this->_directory = $filesystem->getDirectoryRead(DirectoryList::ROOT);
157168
$this->_namespaceResolver = $namespaceResolver;
169+
$this->serializer = $serializer ?: ObjectManager::getInstance()->get(Json::class);
158170
parent::__construct($context, $registry, $resource, $resourceCollection, $data);
159171
}
160172

@@ -250,7 +262,7 @@ public function beforeSave()
250262
\Magento\Framework\Math\Random::CHARS_LOWERS
251263
);
252264
}
253-
$this->setData('widget_parameters', serialize($parameters));
265+
$this->setData('widget_parameters', $this->serializer->serialize($parameters));
254266
}
255267
$this->setData('page_groups', $tmpPageGroups);
256268
$this->setData('page_group_ids', $pageGroupIds);
@@ -372,7 +384,7 @@ public function getStoreIds()
372384
public function getWidgetParameters()
373385
{
374386
if (is_string($this->getData('widget_parameters'))) {
375-
return unserialize($this->getData('widget_parameters'));
387+
return $this->serializer->unserialize($this->getData('widget_parameters'));
376388
} elseif (null === $this->getData('widget_parameters')) {
377389
return [];
378390
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
/**
3+
* Copyright © 2013-2017 Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Widget\Setup;
8+
9+
use Magento\Framework\App\ObjectManager;
10+
use Magento\Framework\Setup\UpgradeDataInterface;
11+
use Magento\Framework\Setup\ModuleContextInterface;
12+
use Magento\Framework\Setup\ModuleDataSetupInterface;
13+
use Magento\Framework\DB\FieldDataConverterFactory;
14+
use Magento\Framework\DB\DataConverter\SerializedToJson;
15+
16+
/**
17+
* Upgrade data for widget module.
18+
*/
19+
class UpgradeData implements UpgradeDataInterface
20+
{
21+
/**
22+
* @var FieldDataConverterFactory
23+
*/
24+
private $fieldDataConverterFactory;
25+
26+
/**
27+
* @param FieldDataConverterFactory $fieldDataConverterFactory
28+
*/
29+
public function __construct(
30+
FieldDataConverterFactory $fieldDataConverterFactory
31+
) {
32+
$this->fieldDataConverterFactory = $fieldDataConverterFactory;
33+
}
34+
35+
/**
36+
* {@inheritdoc}
37+
*/
38+
public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
39+
{
40+
$setup->startSetup();
41+
42+
if (version_compare($context->getVersion(), '2.0.1', '<')) {
43+
$fieldDataConverter = $this->fieldDataConverterFactory->create(SerializedToJson::class);
44+
$fieldDataConverter->convert(
45+
$setup->getConnection(),
46+
$setup->getTable('widget_instance'),
47+
'instance_id',
48+
'widget_parameters'
49+
);
50+
}
51+
52+
$setup->endSetup();
53+
}
54+
}

app/code/Magento/Widget/Test/Unit/Helper/ConditionsTest.php

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66

77
namespace Magento\Widget\Test\Unit\Helper;
88

9-
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
10-
119
/**
1210
* Class ConditionsTest
1311
*/
@@ -18,10 +16,20 @@ class ConditionsTest extends \PHPUnit_Framework_TestCase
1816
*/
1917
protected $conditions;
2018

19+
/**
20+
* @var \Magento\Framework\Serialize\Serializer\Json|\PHPUnit_Framework_MockObject_MockObject
21+
*/
22+
private $serializer;
23+
24+
/**
25+
* {@inheritdoc}
26+
*/
2127
protected function setUp()
2228
{
23-
$objectManagerHelper = new ObjectManagerHelper($this);
24-
$this->conditions = $objectManagerHelper->getObject(\Magento\Widget\Helper\Conditions::class);
29+
$this->serializer = $this->getMock(\Magento\Framework\Serialize\Serializer\Json::class, null);
30+
$this->conditions = new \Magento\Widget\Helper\Conditions(
31+
$this->serializer
32+
);
2533
}
2634

2735
public function testEncodeDecode()

app/code/Magento/Widget/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_Widget" setup_version="2.0.0">
9+
<module name="Magento_Widget" setup_version="2.0.1">
1010
<sequence>
1111
<module name="Magento_Cms"/>
1212
</sequence>

dev/tests/integration/testsuite/Magento/Widget/Model/Widget/InstanceTest.php

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ public function testGetWidgetSupportedTemplatesByContainer($model)
9999
}
100100

101101
/**
102+
* @covers \Magento\Widget\Model\Widget\Instance::generateLayoutUpdateXml()
103+
* @covers \Magento\Widget\Model\Widget\Instance::getWidgetParameters()
102104
* @param \Magento\Widget\Model\Widget\Instance $model
103105
* @depends testGetWidgetConfigAsArray
104106
*/
@@ -134,7 +136,36 @@ public function testGenerateLayoutUpdateXml(\Magento\Widget\Model\Widget\Instanc
134136
$this->assertContains('<argument name="name" xsi:type="string">types</argument>', $result);
135137
$this->assertContains('<argument name="value" xsi:type="string">type_1,type_2</argument>', $result);
136138
$this->assertContains('<argument name="name" xsi:type="string">conditions_encoded</argument>', $result);
137-
$this->assertContains('s:50:`Magento|CatalogWidget|Model|Rule|Condition|Combine`', $result);
138-
$this->assertContains('s:50:`Magento|CatalogWidget|Model|Rule|Condition|Product`', $result);
139+
$this->assertContains('`Magento|CatalogWidget|Model|Rule|Condition|Combine`', $result);
140+
$this->assertContains('`Magento|CatalogWidget|Model|Rule|Condition|Product`', $result);
141+
}
142+
143+
/**
144+
* @covers \Magento\Widget\Model\Widget\Instance::beforeSave()
145+
* @magentoDataFixture Magento/Widget/_files/new_widget.php
146+
* @dataProvider beforeSaveDataProvider
147+
* @param array $expected
148+
*/
149+
public function testBeforeSave(array $expected)
150+
{
151+
/** @var \Magento\Widget\Model\ResourceModel\Widget\Instance $resourceModel */
152+
$resourceModel = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
153+
->get(\Magento\Widget\Model\ResourceModel\Widget\Instance::class);
154+
$resourceModel->load($this->_model, 'Magento\Widget\NewSampleWidget', 'instance_type');
155+
156+
$this->assertSame($expected, $this->_model->getWidgetParameters());
157+
}
158+
159+
/**
160+
* @return array
161+
*/
162+
public function beforeSaveDataProvider()
163+
{
164+
return [
165+
# Variation 1
166+
[
167+
['block_id' => '2']
168+
]
169+
];
139170
}
140171
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
/**
3+
* Copyright © 2013-2017 Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
/** @var \Magento\Widget\Model\ResourceModel\Widget\Instance $resourceModel */
8+
$resourceModel = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
9+
->get(\Magento\Widget\Model\ResourceModel\Widget\Instance::class);
10+
11+
$model = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
12+
->get(\Magento\Widget\Model\Widget\Instance::class);
13+
14+
// Set default theme as work ground for MAGETWO-63643
15+
/** @var \Magento\Framework\View\Design\ThemeInterface $theme */
16+
$theme = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
17+
\Magento\Framework\View\Design\ThemeInterface::class
18+
);
19+
$theme->load('Magento/luma', 'theme_path');
20+
21+
$model->setData(
22+
[
23+
'instance_type' => 'Magento\\Widget\\NewSampleWidget',
24+
'theme_id' => $theme->getId(),
25+
'title' => 'New Sample widget title',
26+
'store_ids' => [
27+
0 => '0',
28+
],
29+
'widget_parameters' => [
30+
'block_id' => '2',
31+
],
32+
'sort_order' => '0',
33+
'page_groups' => [],
34+
'instance_code' => 'new_sample_widget',
35+
]
36+
);
37+
38+
$resourceModel->save($model);

0 commit comments

Comments
 (0)