Макет обновления Magento2 с помощью наблюдателя на странице продукта
Я хочу обновить XML с помощью наблюдателя на странице продукта при загрузке страницы.
Я хочу установить там условие с атрибутом продукта.
Как я могу это сделать?
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>
Этот файл отображается только в вашем конкретном состоянии продуктов.
Теперь в этот файл вы можете добавить свой специальный требования.
Надеюсь, это поможет вам!..
Честно говоря, я бы использовал не наблюдателя, а плагин.
Оберните его вокруг 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
в имени файла зависят от того, что вы размещаете в плагине. При необходимости вы можете перебирать различные значения атрибута и добавлять дескриптор для каждого уникального значения.
Обновление: Заметил, что забыл ручку после параметры в вызове функции.
Вместо наблюдателя вы можете использовать концепцию плагина(перехватчики).Используя методы "до", "после" и "вокруг", вы можете управлять своим макетом.
Например: в любом блоке у нас есть 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