Как отключить наблюдателя событий, определенного по умолчанию в Magento2 [дубликат]


Я хотел бы отключить наблюдателя событий, привязанного к определенному событию в magento по умолчанию.

Наблюдатель Magento\Bundle\Observer\AppendUpsellProductsObserver прикреплен к событию catalog_product_upsell, которое я хочу отключить, так как оно показывает продукты, которые я не хочу показывать в Upsell.

Author: Atish Goswami, 2016-08-05

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.

 21
Author: Khoa TruongDinh, 2016-08-05 13:59:37

Немного покопался и, похоже, на самом деле довольно легко отключить определенного наблюдателя событий в 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 должны быть такими же, как используются по умолчанию магенто

Это делает свое дело.

 8
Author: Atish Goswami, 2016-08-05 07:18:07