Как отключить наблюдателя событий, определенного по умолчанию в Magento2 [дубликат]
Я хотел бы отключить наблюдателя событий, привязанного к определенному событию в magento по умолчанию.
Наблюдатель Magento\Bundle\Observer\AppendUpsellProductsObserver
прикреплен к событию catalog_product_upsell
, которое я хочу отключить, так как оно показывает продукты, которые я не хочу показывать в Upsell.
2 answers
Если мы посмотрим на:
Vendor/magento/framework/Event/Invoker/InvokerDefault.php
public function dispatch(array $configuration, Observer $observer)
{
/** Check whether event observer is disabled */
if (isset($configuration['disabled']) && true === $configuration['disabled']) {
return;
}
if (isset($configuration['shared']) && false === $configuration['shared']) {
$object = $this->_observerFactory->create($configuration['instance']);
} else {
$object = $this->_observerFactory->get($configuration['instance']);
}
$this->_callObserverMethod($object, $observer);
}
Мы можем увидеть, как поделиться наблюдателем событий и отключить его. Итак, в нашем пользовательском модуле мы можем отключить наблюдатель событий Magento по умолчанию.
Например, мы собираемся отключить событие wishlist_add_product
в модуле отчета vendor/magento/module-reports/etc/frontend/events.xml
Наш Vendor/Module/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">
<event name="wishlist_add_product">
<observer name="reports" disabled="true"/>
</event>
</config>
Название события и имя наблюдателя по умолчанию совпадает с именем Magento.
Немного покопался и, похоже, на самом деле довольно легко отключить определенного наблюдателя событий в Magento2.
Все, что нам нужно сделать, это создать пользовательский модуль и добавить events.xml файл в ту же область, где прикреплен наблюдатель событий, и добавьте следующую строку:
<observer name="[observer _name]" disabled="true"/>
Итак, в моем случае xml-файл наблюдателя событий был в vendor/magento/module-bundle/etc/frontend/events.xml
, так что это означает, что area
был внешним интерфейсом.
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="catalog_product_upsell">
<observer name="bundle_observer" instance="Magento\Bundle\Observer\AppendUpsellProductsObserver"/>
</event>
......
</config>
Это означает, что в нашем пользовательском модуле мы создаем events.xml
, скажем, app/code/Foo/Bar/etc/frontend/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">
<!-- Disabling Default Observer Magento\Bundle\Observer\AppendUpsellProductsObserver -->
<event name="catalog_product_upsell">
<observer name="bundle_observer" disabled="true"/>
</event>
</config>
Примечание: Здесь наблюдатель
name
и событиеname
должны быть такими же, как используются по умолчанию магенто
Это делает свое дело.