Untitled
unknown
plain_text
2 years ago
13 kB
6
Indexable
<?php namespace Magiccart\Lookbook\Observer; use Magento\Framework\Event\ObserverInterface; use Magento\Framework\Event\Observer; use Magento\Widget\Model\Layout\UpdateFactory; use Magiccart\Lookbook\Model\Options\BlockPosition; /** * AddLayoutUpdateHandleObserver */ class AddLayout implements ObserverInterface { const BLOCK = 'Magiccart\Lookbook\Block\Product'; const TEMPLATE = 'Magiccart_Lookbook::product.phtml'; const RELATED_NAME = 'catalog.product.related'; const UPSELL_NAME = 'product.info.upsell'; const CROSSEL_NAME = 'checkout.cart.crosssell'; /** * @var \Magento\Framework\App\Request\Http */ private $request; /** * Core registry * * @var \Magento\Framework\Registry */ protected $coreRegistry; /** * @var \Magento\Framework\Serialize\Serializer\Json */ protected $json; /** * @var \Magento\CatalogWidget\Model\RuleFactory */ protected $catalogWidgetRuleFactory; /** * @var \Magento\Framework\App\Http\Context */ protected $_httpContext; /** * @var \Magento\Rule\Model\Condition\Sql\Builder */ protected $sqlBuilder; /** * @var \Magento\Store\Model\StoreManagerInterface */ protected $storeManager; /** * @var \Magiccart\Lookbook\Model\LookbookFactory */ protected $lookbookFactory; /** * @var \Magiccart\Magicslider\Helper\Data */ protected $helper; private $template = null; public function __construct( \Magento\Framework\App\Request\Http $request, \Magento\Framework\Registry $coreRegistry, \Magento\Framework\Serialize\Serializer\Json $json, \Magento\CatalogWidget\Model\RuleFactory $catalogWidgetRuleFactory, \Magento\Framework\App\Http\Context $httpContext, \Magento\Rule\Model\Condition\Sql\Builder $sqlBuilder, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magiccart\Lookbook\Model\LookbookFactory $lookbookFactory, \Magiccart\Lookbook\Helper\Data $helper ){ $this->request = $request; $this->coreRegistry = $coreRegistry; $this->json = $json; $this->catalogWidgetRuleFactory = $catalogWidgetRuleFactory; $this->_httpContext = $httpContext; $this->sqlBuilder = $sqlBuilder; $this->storeManager = $storeManager; $this->lookbookFactory = $lookbookFactory; $this->helper = $helper; } /** * Add handles to the page. * * @param Observer $observer * @event layout_load_before * * @return void */ public function execute(Observer $observer) { /** @var LayoutInterface $layout */ $layout = $observer->getData('layout'); $type = ''; $typeId = ''; $actionName = $this->request->getFullActionName(); if($actionName == 'cms_index_index'){ $type = 'home'; }elseif($actionName == 'checkout_cart_index'){ $type = 'cart'; }elseif($actionName == 'catalog_product_view'){ $type = 'product'; $typeId = $this->coreRegistry->registry('current_product')->getId(); }elseif($actionName == 'catalog_category_view'){ $type = 'category'; $typeId = $this->coreRegistry->registry('current_category')->getId(); } if(!$type) return; $layoutUpdate = $layout->getUpdate(); $store = $this->storeManager->getStore()->getStoreId(); $lookbook = $this->lookbookFactory->create()->getCollection() ->addFieldToFilter('stores', [['finset' => 0], ['finset' => $store]]) ->addFieldToFilter('status', 1); $ruleIdBlockPosition = []; foreach ($lookbook as $rule) { if($rule->getData('type_id')!=1)continue; $decodeData = json_decode((string) $rule->getData('config'), true); if(is_array($decodeData)){ unset($decodeData['lookbook_id']); $rule->addData($decodeData); } $blockPosition = $rule->getData('block_position'); if(in_array($blockPosition, $ruleIdBlockPosition)) continue; if( !strlen(strstr((string) $blockPosition, $type)) > 0 ) continue; if($type == 'product'){ $displayPlace = $this->checkDisplayPlace($rule); if(!$displayPlace) continue; } if($type == 'category'){ $categoryIds = $rule->getData('display_to_category'); if(!$categoryIds || !in_array($typeId, $categoryIds)) continue; } $xml = $this->getXml($rule); if($xml) $layoutUpdate->addUpdate($xml); $ruleIdBlockPosition[] = $blockPosition; } } public function getProduct() { return $this->coreRegistry->registry('current_product'); } public function getXml($rule) { $blockPosition = $rule->getData('block_position'); $nameInLayout = strtolower($this->helper->getModuleName()) . '_' . $blockPosition . '_' . $rule->getData('lookbook_id'); $xml = ''; switch ($blockPosition) { case 'product_content_tab': $xml = '<referenceBlock name="product.info.details"> <block class="' . self::BLOCK . '" name="' . $nameInLayout . '" template="' . self::TEMPLATE . '" group="detailed_info"> <arguments> <argument name="identifier" xsi:type="string">' . $rule->getData('identifier') . '</argument> <argument name="sort_order" xsi:type="string">100</argument> </arguments> </block> </referenceBlock>'; break; case 'product_after_info_main': $xml = '<referenceContainer name="product.info.main"> <block class="' . self::BLOCK . '" name="' . $nameInLayout . '" template="' . self::TEMPLATE . '" after="-"> <arguments> <argument name="identifier" xsi:type="string">' . $rule->getData('identifier') . '</argument> </arguments> </block> </referenceContainer>'; break; default: $xml = '<referenceContainer name="content.top"> <block class="' . self::BLOCK . '" name="' . $nameInLayout . '" template="' . self::TEMPLATE . '"> <arguments> <argument name="identifier" xsi:type="string">' . $rule->getData('identifier') . '</argument> </arguments> </block> </referenceContainer>'; $destination = $this->getContainerByPosition($blockPosition); if($destination) $xml .= '<move element="' . $nameInLayout . '" destination="' . $destination . '" ' . $this->getPositionAttribute($blockPosition) . ' />'; } return $xml; } protected function getRule($conditions) { $rule = $this->catalogWidgetRuleFactory->create(); if(is_array($conditions)) $rule->loadPost($conditions); return $rule; } public function checkDisplayPlace($rule) { $displayPlace = $rule->getData('parameters'); $rule = $this->getRule($displayPlace); return $rule->getConditions()->validate($this->getProduct()); } protected function getPositionAttribute($position) { switch ($position) { case BlockPosition::PRODUCT_AFTER_UPSELL: $positionAttribute = 'after="' . self::UPSELL_NAME . '"'; break; case BlockPosition::PRODUCT_AFTER_RELATED: $positionAttribute = 'after="' . self::RELATED_NAME . '"'; break; case BlockPosition::PRODUCT_BEFORE_RELATED: $positionAttribute = 'before="' . self::RELATED_NAME . '"'; break; case BlockPosition::PRODUCT_BEFORE_TAB: $positionAttribute = 'before="product.info.details"'; break; case BlockPosition::PRODUCT_BEFORE_UPSELL: $positionAttribute = 'before="' . self::UPSELL_NAME . '"'; break; case BlockPosition::CART_AFTER_CROSSSEL: $positionAttribute = 'after="'.self::CROSSEL_NAME.'"'; break; case BlockPosition::CART_BEFORE_CROSSSEL: $positionAttribute = 'before="'.self::CROSSEL_NAME.'"'; break; case BlockPosition::CATEGORY_SIDEBAR_BOTTOM: case BlockPosition::PRODUCT_SIDEBAR_BOTTOM: case BlockPosition::PRODUCT_CONTENT_BOTTOM: case BlockPosition::CATEGORY_CONTENT_BOTTOM: case BlockPosition::CART_CONTENT_BOTTOM: case BlockPosition::HOME_CONTENT_BOTTOM: $positionAttribute = 'after="-"'; break; case BlockPosition::PRODUCT_INTO_RELATED: case BlockPosition::PRODUCT_INTO_UPSELL: case BlockPosition::CART_CONTENT_TOP: case BlockPosition::CATEGORY_CONTENT_TOP: case BlockPosition::CATEGORY_SIDEBAR_TOP: case BlockPosition::PRODUCT_SIDEBAR_TOP: case BlockPosition::PRODUCT_CONTENT_TOP: case BlockPosition::HOME_CONTENT_TOP: $positionAttribute = 'before="-"'; break; default: $positionAttribute = ''; } return $positionAttribute; } protected function getTemplateByPosition($position) { switch ($position) { case BlockPosition::CATEGORY_SIDEBAR_BOTTOM: case BlockPosition::CATEGORY_SIDEBAR_TOP: case BlockPosition::PRODUCT_SIDEBAR_BOTTOM: case BlockPosition::PRODUCT_SIDEBAR_TOP: $template = self::SIDEBAR_TEMPLATE; break; default: $template = self::TEMPLATE; } return $template; } protected function getContainerByPosition($position) { switch ($position) { case BlockPosition::PRODUCT_CONTENT_TOP: case BlockPosition::CART_CONTENT_TOP: case BlockPosition::CATEGORY_CONTENT_TOP: $container = 'content.top'; break; case BlockPosition::CART_CONTENT_BOTTOM: case BlockPosition::CATEGORY_CONTENT_BOTTOM: case BlockPosition::PRODUCT_CONTENT_BOTTOM: $container = 'content.bottom'; break; case BlockPosition::CATEGORY_SIDEBAR_BOTTOM: case BlockPosition::PRODUCT_SIDEBAR_BOTTOM: $container = 'sidebar.additional'; break; case BlockPosition::CATEGORY_SIDEBAR_TOP: case BlockPosition::PRODUCT_SIDEBAR_TOP: $container = 'sidebar.main'; break; case BlockPosition::PRODUCT_INTO_RELATED: case BlockPosition::PRODUCT_INTO_UPSELL: case BlockPosition::PRODUCT_AFTER_RELATED: case BlockPosition::PRODUCT_BEFORE_RELATED: case BlockPosition::PRODUCT_AFTER_UPSELL: case BlockPosition::PRODUCT_BEFORE_UPSELL: $container = 'content.aside'; break; case BlockPosition::CART_AFTER_CROSSSEL: case BlockPosition::CART_BEFORE_CROSSSEL: $container = 'checkout.cart.items'; break; case BlockPosition::HOME_CONTENT_TOP: case BlockPosition::HOME_CONTENT_BOTTOM: case BlockPosition::PRODUCT_BEFORE_TAB: $container = 'content'; break; case BlockPosition::PRODUCT_BEFORE_TAB: $container = 'product.info.main'; default: $container = ''; } return $container; } }
Editor is loading...
Leave a Comment