diff --git a/src/module-elasticsuite-catalog-optimizer/Model/Optimizer.php b/src/module-elasticsuite-catalog-optimizer/Model/Optimizer.php index 92d2d3dfa..5164025bb 100644 --- a/src/module-elasticsuite-catalog-optimizer/Model/Optimizer.php +++ b/src/module-elasticsuite-catalog-optimizer/Model/Optimizer.php @@ -40,6 +40,11 @@ class Optimizer extends \Magento\Framework\Model\AbstractModel implements Optimi */ private $dateFilter; + /** + * @var \Magento\Framework\Serialize\SerializerInterface + */ + private $serializer; + /** * @var string */ @@ -52,6 +57,7 @@ class Optimizer extends \Magento\Framework\Model\AbstractModel implements Optimi * @param \Magento\Framework\Registry $registry Registry. * @param \Smile\ElasticsuiteCatalogRule\Model\RuleFactory $ruleFactory Rule factory. * @param \Magento\Framework\Stdlib\DateTime\Filter\Date $dateFilter Date Filter. + * @param \Magento\Framework\Serialize\SerializerInterface $serializer Serializer. * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource Resource. * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection Resource collection. * @param array $data Data. @@ -61,6 +67,7 @@ public function __construct( \Magento\Framework\Registry $registry, \Smile\ElasticsuiteCatalogRule\Model\RuleFactory $ruleFactory, \Magento\Framework\Stdlib\DateTime\Filter\Date $dateFilter, + \Magento\Framework\Serialize\SerializerInterface $serializer, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] @@ -68,6 +75,7 @@ public function __construct( parent::__construct($context, $registry, $resource, $resourceCollection, $data); $this->ruleFactory = $ruleFactory; $this->dateFilter = $dateFilter; + $this->serializer = $serializer; } /** @@ -118,7 +126,7 @@ public function getModel() public function getConfig($key = null) { if (is_string($this->getData(self::CONFIG))) { - $this->setData(self::CONFIG, unserialize($this->getData(self::CONFIG))); + $this->setData(self::CONFIG, $this->serializer->unserialize($this->getData(self::CONFIG))); } $result = $this->getData(self::CONFIG); @@ -173,7 +181,7 @@ public function getRuleCondition() $rule = $this->ruleFactory->create(); if (is_string($ruleData)) { - $ruleData = unserialize($ruleData); + $ruleData = $this->serializer->unserialize($ruleData); } if (is_array($ruleData)) { diff --git a/src/module-elasticsuite-catalog-optimizer/Model/ResourceModel/Optimizer.php b/src/module-elasticsuite-catalog-optimizer/Model/ResourceModel/Optimizer.php index 6db2127de..77e5c4e79 100644 --- a/src/module-elasticsuite-catalog-optimizer/Model/ResourceModel/Optimizer.php +++ b/src/module-elasticsuite-catalog-optimizer/Model/ResourceModel/Optimizer.php @@ -34,15 +34,18 @@ class Optimizer extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb * * @param \Magento\Framework\Model\ResourceModel\Db\Context $context Context. * @param RuleFactory $ruleFactory Rule factory. + * @param \Magento\Framework\Serialize\SerializerInterface $serializer Serializer. * @param string $connectionName Connection name. */ public function __construct( \Magento\Framework\Model\ResourceModel\Db\Context $context, RuleFactory $ruleFactory, + \Magento\Framework\Serialize\SerializerInterface $serializer, $connectionName = null ) { parent::__construct($context, $connectionName); $this->ruleFactory = $ruleFactory; + $this->serializer = $serializer; } /** @@ -117,7 +120,7 @@ protected function _afterLoad(\Magento\Framework\Model\AbstractModel $object) protected function _beforeSave(\Magento\Framework\Model\AbstractModel $object) { if (is_array($object->getConfig())) { - $object->setConfig(serialize($object->getConfig())); + $object->setConfig($this->serializer->serialize($object->getConfig())); } $rule = $this->ruleFactory->create(); @@ -128,7 +131,7 @@ protected function _beforeSave(\Magento\Framework\Model\AbstractModel $object) } elseif (is_array($ruleCondition)) { $rule->getConditions()->loadArray($ruleCondition); } - $object->setRuleCondition(serialize($rule->getConditions()->asArray())); + $object->setRuleCondition($this->serializer->serialize($rule->getConditions()->asArray())); return parent::_beforeSave($object); } diff --git a/src/module-elasticsuite-catalog-optimizer/Setup/OptimizerSetup.php b/src/module-elasticsuite-catalog-optimizer/Setup/OptimizerSetup.php index aa2f47b8d..9a94c415c 100644 --- a/src/module-elasticsuite-catalog-optimizer/Setup/OptimizerSetup.php +++ b/src/module-elasticsuite-catalog-optimizer/Setup/OptimizerSetup.php @@ -29,14 +29,23 @@ class OptimizerSetup */ private $metadataPool; + /** + * @var \Magento\Framework\DB\FieldDataConverterFactory + */ + private $fieldDataConverterFactory; + /** * Class Constructor * - * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool Metadata Pool. + * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool Metadata Pool. + * @param \Magento\Framework\DB\FieldDataConverterFactory $fieldDataConverterFactory Field Data Converter Factory. */ - public function __construct(\Magento\Framework\EntityManager\MetadataPool $metadataPool) - { - $this->metadataPool = $metadataPool; + public function __construct( + \Magento\Framework\EntityManager\MetadataPool $metadataPool, + \Magento\Framework\DB\FieldDataConverterFactory $fieldDataConverterFactory + ) { + $this->metadataPool = $metadataPool; + $this->fieldDataConverterFactory = $fieldDataConverterFactory; } /** @@ -269,4 +278,34 @@ public function createOptimizerLimitationTable(SchemaSetupInterface $setup) $setup->getConnection()->createTable($optimizerCategoryTable); } } + + /** + * Upgrade legacy serialized data to JSON data. + * Targets : + * - columns "config" and "rule_condition" of the smile_elasticsuite_optimizer table. + * + * @param \Magento\Setup\Module\DataSetup $setup Setup + * + * @return void + */ + public function convertSerializedRulesToJson(\Magento\Setup\Module\DataSetup $setup) + { + $fieldDataConverter = $this->fieldDataConverterFactory->create( + \Magento\Framework\DB\DataConverter\SerializedToJson::class + ); + + $fieldDataConverter->convert( + $setup->getConnection(), + $setup->getTable(OptimizerInterface::TABLE_NAME), + OptimizerInterface::OPTIMIZER_ID, + OptimizerInterface::CONFIG + ); + + $fieldDataConverter->convert( + $setup->getConnection(), + $setup->getTable(OptimizerInterface::TABLE_NAME), + OptimizerInterface::OPTIMIZER_ID, + OptimizerInterface::RULE_CONDITION + ); + } } diff --git a/src/module-elasticsuite-catalog-optimizer/Setup/UpgradeData.php b/src/module-elasticsuite-catalog-optimizer/Setup/UpgradeData.php new file mode 100644 index 000000000..f9541077c --- /dev/null +++ b/src/module-elasticsuite-catalog-optimizer/Setup/UpgradeData.php @@ -0,0 +1,53 @@ + + * @copyright 2018 Smile + * @license Open Software License ("OSL") v. 3.0 + */ +namespace Smile\ElasticsuiteCatalogOptimizer\Setup; + +use Magento\Framework\Setup\ModuleContextInterface; +use Magento\Framework\Setup\ModuleDataSetupInterface; + +/** + * Upgrade Data for Smile Elasticsuite Optimizer module. + * + * @category Smile + * @package Smile\ElasticsuiteCatalogOptimizer + * @author Romain Ruaud + */ +class UpgradeData implements \Magento\Framework\Setup\UpgradeDataInterface +{ + /** + * @var OptimizerSetup + */ + private $optimizerSetup; + + /** + * InstallSchema constructor. + * + * @param \Smile\ElasticsuiteCatalogOptimizer\Setup\OptimizerSetupFactory $optimizerSetupFactory Setup Factory + */ + public function __construct(OptimizerSetupFactory $optimizerSetupFactory) + { + $this->optimizerSetup = $optimizerSetupFactory->create(); + } + + /** + * {@inheritdoc} + */ + public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context) + { + $setup->startSetup(); + if (version_compare($context->getVersion(), "1.2.0") < 0) { + $this->optimizerSetup->convertSerializedRulesToJson($setup); + } + $setup->endSetup(); + } +} diff --git a/src/module-elasticsuite-catalog-optimizer/etc/module.xml b/src/module-elasticsuite-catalog-optimizer/etc/module.xml index fd677e4bb..11c55b408 100644 --- a/src/module-elasticsuite-catalog-optimizer/etc/module.xml +++ b/src/module-elasticsuite-catalog-optimizer/etc/module.xml @@ -17,7 +17,7 @@ */ --> - +