Skip to content

Commit

Permalink
Refactoring virtual categories rules storage/reading.
Browse files Browse the repository at this point in the history
  • Loading branch information
romainruaud committed Apr 12, 2018
1 parent 609a57f commit 2c5a914
Show file tree
Hide file tree
Showing 12 changed files with 377 additions and 123 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
<?php
/**
* DISCLAIMER
* Do not edit or add to this file if you wish to upgrade Smile Elastic Suite to newer
* versions in the future.
*
* @category Smile
* @package Smile\ElasticsuiteVirtualCategory
* @author Romain Ruaud <[email protected]>
* @copyright 2017 Smile
* @license Open Software License ("OSL") v. 3.0
*/
namespace Smile\ElasticsuiteVirtualCategory\Model\Category\Attribute\VirtualRule;

use Magento\Catalog\Model\Category;

/**
* Virtual Category rule read handler.
*
* @category Smile
* @package Smile\ElasticsuiteVirtualCategory
* @author Romain Ruaud <[email protected]>
*/
class ReadHandler implements \Magento\Framework\EntityManager\Operation\ExtensionInterface
{
/**
* The virtual rule attribute code.
*/
const ATTRIBUTE_CODE = 'virtual_rule';

/**
* @var \Smile\ElasticsuiteCatalogRule\Model\RuleFactory $ruleFactory
*/
private $ruleFactory;

/**
* @var \Magento\Framework\Serialize\Serializer\Json
*/
private $jsonSerializer;

/**
* Constructor.
*
* @param \Smile\ElasticsuiteCatalogRule\Model\RuleFactory $ruleFactory Search rule factory.
* @param \Magento\Framework\Serialize\Serializer\Json $jsonSerializer JSON Serializer.
*/
public function __construct(
\Smile\ElasticsuiteCatalogRule\Model\RuleFactory $ruleFactory,
\Magento\Framework\Serialize\Serializer\Json $jsonSerializer
) {
$this->ruleFactory = $ruleFactory;
$this->jsonSerializer = $jsonSerializer;
}

/**
* {@inheritdoc}
*/
public function execute($entity, $arguments = [])
{
$attributeData = $entity->getData(self::ATTRIBUTE_CODE);

if (!is_object($attributeData)) {
$rule = $this->ruleFactory->create();
$rule->setStoreId($entity->getStoreId());

if ($attributeData !== null && is_string($attributeData)) {
$attributeData = $this->jsonSerializer->unserialize($attributeData);
}

if ($attributeData !== null && is_array($attributeData)) {
$rule->getConditions()->loadArray($attributeData);
}

$entity->setData(self::ATTRIBUTE_CODE, $rule);
}

return $entity;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
<?php
/**
* DISCLAIMER
* Do not edit or add to this file if you wish to upgrade Smile Elastic Suite to newer
* versions in the future.
*
* @category Smile
* @package Smile\ElasticsuiteVirtualCategory
* @author Romain Ruaud <[email protected]>
* @copyright 2017 Smile
* @license Open Software License ("OSL") v. 3.0
*/
namespace Smile\ElasticsuiteVirtualCategory\Model\Category\Attribute\VirtualRule;

/**
* Virtual Category rule save handler.
*
* @category Smile
* @package Smile\ElasticsuiteVirtualCategory
* @author Romain Ruaud <[email protected]>
*/
class SaveHandler implements \Magento\Framework\EntityManager\Operation\ExtensionInterface
{
/**
* The virtual rule attribute code.
*/
const ATTRIBUTE_CODE = 'virtual_rule';

/**
* @var \Smile\ElasticsuiteCatalogRule\Model\RuleFactory $ruleFactory
*/
private $ruleFactory;

/**
* @var \Magento\Framework\Serialize\Serializer\Json
*/
private $jsonSerializer;

/**
* Constructor.
*
* @param \Smile\ElasticsuiteCatalogRule\Model\RuleFactory $ruleFactory Search rule factory.
* @param \Magento\Framework\Serialize\Serializer\Json $jsonSerializer JSON Serializer.
*/
public function __construct(
\Smile\ElasticsuiteCatalogRule\Model\RuleFactory $ruleFactory,
\Magento\Framework\Serialize\Serializer\Json $jsonSerializer
) {
$this->ruleFactory = $ruleFactory;
$this->jsonSerializer = $jsonSerializer;
}

/**
* {@inheritdoc}
*/
public function execute($entity, $arguments = [])
{
$attributeData = $entity->getData(self::ATTRIBUTE_CODE);

if ($attributeData !== null) {
$rule = $this->ruleFactory->create();

if (is_object($attributeData)) {
$rule = $attributeData;
} elseif (is_array($attributeData)) {
$rule->loadPost($attributeData);
} elseif (is_string($attributeData)) {
$attributeData = $this->jsonSerializer->unserialize($attributeData);
$rule->getConditions()->loadArray($attributeData);
}

$entity->setData(self::ATTRIBUTE_CODE, $this->jsonSerializer->serialize($rule->getConditions()->asArray()));
}

return $entity;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
*/
namespace Smile\ElasticsuiteVirtualCategory\Model\ResourceModel\VirtualCategory;

use \Smile\ElasticsuiteVirtualCategory\Model\Category\Attribute\VirtualRule\ReadHandler as VirtualRuleReadHandler;

/**
* Category collection with automatic loading of the virtual category using the attribute backend.
*
Expand All @@ -24,9 +26,9 @@
class Collection extends \Magento\Catalog\Model\ResourceModel\Category\Collection
{
/**
* @var \Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend
* @var \Smile\ElasticsuiteVirtualCategory\Model\Category\Attribute\VirtualRule\ReadHandler as VirtualRuleReadHandler
*/
private $virtualAttributeBackend;
private $virtualRuleReadHandler;

/**
* @SuppressWarnings(PHPMD.CamelCaseMethodName)
Expand All @@ -37,23 +39,23 @@ protected function _afterLoad()
parent::_afterLoad();

foreach ($this->_items as $item) {
$this->getVirtualAttributeBackend()->afterLoad($item);
$this->getVirtualRuleReadHandler()->execute($item);
}

return $this;
}

/**
* Virtual attribute backend.
* Virtual rule read handler.
*
* @return \Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend
* @return \Smile\ElasticsuiteVirtualCategory\Model\Category\Attribute\VirtualRule\ReadHandler
*/
private function getVirtualAttributeBackend()
private function getVirtualRuleReadHandler()
{
if ($this->virtualAttributeBackend === null) {
$this->virtualAttributeBackend = $this->getResource()->getAttribute('virtual_rule')->getBackend();
if ($this->virtualRuleReadHandler === null) {
$this->virtualRuleReadHandler = $this->_universalFactory->create(VirtualRuleReadHandler::class);
}

return $this->virtualAttributeBackend;
return $this->virtualRuleReadHandler;
}
}
2 changes: 1 addition & 1 deletion src/module-elasticsuite-virtual-category/Model/Rule.php
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ public function __construct(
*/
public function __toString()
{
return serialize($this->getConditions()->asArray());
return json_encode($this->getConditions()->asArray());
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<?php
/**
* DISCLAIMER
* Do not edit or add to this file if you wish to upgrade Smile Elastic Suite to newer
* versions in the future.
*
* @category Smile
* @package Smile\ElasticsuiteVirtualCategory
* @author Romain Ruaud <[email protected]>
* @copyright 2018 Smile
* @license Open Software License ("OSL") v. 3.0
*/
namespace Smile\ElasticsuiteVirtualCategory\Observer;

/**
* Observer that convert 'virtual_rule' attribute to string value to ensure it gets properly processed by the
* UpdateAttributes operation of the Entity Manager.
*
* @category Smile
* @package Smile\ElasticsuiteVirtualCategory
* @author Romain Ruaud <[email protected]>
*/
class ConvertVirtualRuleOnSave implements \Magento\Framework\Event\ObserverInterface
{
/**
* @var \Smile\ElasticsuiteVirtualCategory\Model\Category\Attribute\VirtualRule\SaveHandler
*/
private $saveHandler;

/**
* FlatPlugin constructor.
*
* @param \Smile\ElasticsuiteVirtualCategory\Model\Category\Attribute\VirtualRule\SaveHandler $saveHandler Read Handler
*/
public function __construct(
\Smile\ElasticsuiteVirtualCategory\Model\Category\Attribute\VirtualRule\SaveHandler $saveHandler
) {
$this->saveHandler = $saveHandler;
}

/**
* Observer listening to magento_catalog_api_data_categoryinterface_save_before
*
* @param \Magento\Framework\Event\Observer $observer The Observer
*
* @return void
*/
public function execute(\Magento\Framework\Event\Observer $observer)
{
$entity = $observer->getEntity();

if ($entity->getVirtualRule() !== null) {
$this->saveHandler->execute($entity);
}
}
}
Loading

0 comments on commit 2c5a914

Please sign in to comment.