Макет обновления Magento2 с помощью наблюдателя на странице продукта


Я хочу обновить XML с помощью наблюдателя на странице продукта при загрузке страницы.
Я хочу установить там условие с атрибутом продукта.
Как я могу это сделать?

Author: Ketan Borada, 2018-06-01

3 answers

Что вы можете сделать, так это добавить макет с помощью события layout_load_before, вы можете использовать это событие для добавления динамического макета.

Вот пример кода для вас.

Шаг: 1 создайте events.xml в вашем модуле

[Поставщик]/[Модуль]/etc/events.xml

<?xml version="1.0"?>
    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
        <!-- for diffrentiate layout.xml on product basis -->
        <event name="layout_load_before">
            <observer name="load_custom_handler" instance="[Vendor]\[Module]\Observer\LayoutLoadBefore" />
        </event>
    </config>

Шаг: 2 Теперь создайте наблюдателя LayoutLoadBefore.php

В вашем [Поставщике][Модуле]\Observer\LayoutLoadBefore.php запись файла ниже кода

    <?php

    namespace [Vendor]\[Module]\Observer;

    class LayoutLoadBefore implements \Magento\Framework\Event\ObserverInterface
    {
        /**
         * @var \Magento\Framework\Registry
         */
        protected $_registry;

        public function __construct(
           \Magento\Framework\Registry $registry,
        )
        {
            $this->_registry = $registry;
        }


        public function execute(\Magento\Framework\Event\Observer $observer)
        {
            $product = $this->_registry->registry('current_product');

            if (!$product){
              return $this;
            }
            if($product->getSku() =='product_sku'){ // add your multiple attribute condition
               $layout = $observer->getLayout();
               $layout->getUpdate()->addHandle('catalog_product_view_customlayout'); 
// here you will have to set custom layout which is for specific layout.
            }

            return $this;
        }
    }

Шаг 3: Создайте файл макета для пользовательского расположение.

Создайте файл макета в своей пользовательской теме/пользовательском модуле.

[ Тема]/frontend/Magento_catalog/layout/catalog_product_view_customlayout.xml

Или

[ Поставщик]/[Модуль]/view/frontend/layout/catalog_product_view_customlayout.xml

И напишите свой код.

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        ...
            //write your custm code here.
        ...
    </body>
</page>

Этот файл отображается только в вашем конкретном состоянии продуктов.

Теперь в этот файл вы можете добавить свой специальный требования.

Надеюсь, это поможет вам!..

 7
Author: Emipro Technologies Pvt. Ltd., 2018-06-26 09:10:07

Честно говоря, я бы использовал не наблюдателя, а плагин.

Оберните его вокруг Magento\Catalog\Helper\Product\View.

Что-то вроде этого:

class AroundHelperProductView
{
    public function aroundinitProductLayout(
        \Magento\Catalog\Helper\Product\View $subject, 
        callable $proceed,
        \Magento\Framework\View\Result\Page $resultPage, 
        $product, 
        $params = null
    ) {

        $result = $proceed($resultPage, $product, $params);

        $resultPage->addPageLayoutHandles(['attribute' => 'value'], 'catalog_product_view');

        return $result;
    }
}

Таким образом, вы получите определение catalog_product_view_attribute_value.xml, которое вы можете заполнить всем, что вам нужно. Имейте в виду, что attribute и value в имени файла зависят от того, что вы размещаете в плагине. При необходимости вы можете перебирать различные значения атрибута и добавлять дескриптор для каждого уникального значения.

Обновление: Заметил, что забыл ручку после параметры в вызове функции.

 1
Author: Rian, 2018-06-01 13:28:55

Вместо наблюдателя вы можете использовать концепцию плагина(перехватчики).Используя методы "до", "после" и "вокруг", вы можете управлять своим макетом.

Например: в любом блоке у нас есть getChildHtml($alias = ", $useCache =true). для этого вы можете сделать

public function beforeGetChildHtml(/* your source class */ $subject,$alias = '', $useCache = true)
{
    $layout = $subject->getLayout();

    if (!$layout) {
        return '';
    }
    $childName = $layout->getChildName($subject->getNameInLayout(), $alias);
    if (!$childName) {
        return '';
    }
    if($childName=="/*your block name */")
    {
        addchild to your block
    }
}

Таким же образом вы можете использовать после и вокруг в соответствии с вашими требованиями

Прочитайте devdocs для получения дополнительной информации информация https://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html

 0
Author: Naisa purushotham, 2018-06-01 13:11:59