Magento: как отключить или изменить способ работы основного наблюдателя - PullRequest
7 голосов
/ 29 сентября 2010

Я долго об этом думал.Что если Magento написал основной класс Observer и выполняет функции, которые вы не хотите, чтобы он выполнял, или вы хотите переписать его?Есть ли способ сказать, не используйте этот метод в Observer, просто используйте мой.Если я настраиваю метод для своего собственного Обозревателя, разве он не будет выполнять сначала основные функции, а затем то, что я реализовал?

Например, Magento хочет сохранить некоторые данные в базе данных в методе Обозревателя, ноЯ не хочу, чтобы он вообще сохранял эти данные, я хочу, чтобы он сохранял некоторые другие данные, для которых я добавил столбцы или атрибуты в базу данных.

Ответы [ 4 ]

9 голосов
/ 29 сентября 2010

Стандартное предостережение о переопределениях классов, которые являются последним средством для реализации вашей собственной функциональности

Возможно возможно поиграться с загрузкой глобальной конфигурации Magento, чтобы удалить основной Magento Observer, но поддерживаемый способ сделать это не поддерживается.

Однако рассмотрим, как настроены основные наблюдатели.

<adminhtml>
    <events>
        <cms_wysiwyg_config_prepare>
            <observers>
                <widget_observer>
                    <class>widget/observer</class>
                    <method>prepareWidgetsPluginConfig</method>
                </widget_observer>
            </observers>
        </cms_wysiwyg_config_prepare>
    </events>
</adminhtml>

Наблюдатели - классы Magento Model. Если модель настроена с использованием синтаксиса на основе URI / пути

<class>widget/observer</class>

вместо полного имени класса PHP

<class>Mage_Widget_Model_Observer</class>

вы можете создать переопределение для класса модели наблюдателя (так же, как вы можете для любой другой модели). Если имя класса PHP было использовано, вам не повезло. (Вы можете поместить локальный файл в local / Mage / Widget / Model / Observer.php, если вы готовы взять на себя ответственность за обслуживание, но я не рекомендую его)

Итак, чтобы переопределить вышеуказанного наблюдателя, вы бы

  1. Создайте пользовательский модуль, который включает переопределение для класса Mage_Widget_Model_Observer.

  2. В вашем классе переопределения либо повторно объявите prepareWidgetsPluginConfig, чтобы сделать то, что вы хотите, ИЛИ переопределить конкретный метод. Это может включать пустой метод для полного удаления функциональности.

5 голосов
/ 06 ноября 2012

Лучший способ сделать это - просто повторно объявить определение наблюдателя в файле config.xml.

Например, мне нужно было отключить enterprise_persistent_cart наблюдатель, который был объявлен для события controller_action_layout_generate_blocks_after модулем Enterprise_Persistent .

Объявление в файле config.xml Enterprise_Persistent такое

<frontend>
    <events>
        <controller_action_layout_generate_blocks_after>
            <observers>
                <enterprise_persistent_cart>
                    <class>enterprise_persistent/observer</class>
                    <method>removeCartLink</method>
                </enterprise_persistent_cart>
            </observers>
       </controller_action_layout_generate_blocks_after>

Итак, я создал модуль, и в файле config.xml моего модуля я сделал следующее:

<frontend>
    <events>
        <controller_action_layout_generate_blocks_after>
            <observers>
                <enterprise_persistent_cart>
                    <type>disabled</type>
                </enterprise_persistent_cart>
            </observers>
        </controller_action_layout_generate_blocks_after>

Я также сделал мой модуль зависимым от модуля Enterprise_Persistent. Это необходимо, чтобы убедиться, что файл config.xml моего модуля обработан ПОСЛЕ файла config.xml модуля Enterprise_Persistent. Я сделал это, выполнив следующие действия в файле объявления моего модуля app / etc / modules My_Module.xml

<config>
    <modules>
        <Atlex_AddCartLinkToHeader>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Enterprise_Persistent/>
            </depends>
        </Atlex_AddCartLinkToHeader>
    </modules>
</config>

Для каждого события может быть только одно действие наблюдателя, объявленное для данного имени наблюдателя. Поэтому, пока файл config.xml моего модуля обрабатывается после файла config.xml модуля Enterprise_Persistent, моя декларация наблюдателя для enterprise_persistent_cart будет выполнением действия наблюдателя, которое выполняется.

Узел <<strong> type > отключен <<strong> / type > запретит наблюдателю запускать. Если вы хотите переопределить наблюдателя для выполнения собственного метода, то вы просто замените узел <<strong> type > на методы наблюдателя <<strong> class > и <<strong> . > узлы.

Это позволяет переопределять / отключать наблюдателей без переопределения основных классов. Он более расширяем для будущих разработчиков.

4 голосов
/ 29 сентября 2010

Я хотел добавить комментарий к ответу @ Алана, потому что я думаю, что он его прибил, но мой комментарий слишком длинный и недостаточно форматируется! Здесь идет:

Хороший @ Алан, умный способ исправить то, что кажется дырой, при этом уважая архитектуру. Пара мыслей:

  1. если пользовательский модуль связывается с тем же событием, пользовательский Обозреватель будет вызван позже в Цепочке ответственности , чем ядро, и, следовательно, может переопределить ядро ​​Обозревателя? Это зависит от того, что делает основной Observer, например, установка значения перенаправления. В приведенном примере OP это будет работать. При привязке к событию Model_save_before будет вызываться основной Observer, но ваш Observer все еще может изменить содержимое сохраненных данных модели, прежде чем они будут записаны в базу данных. Вы можете изменить или сбросить значения, на которые влияет основной Observer.

  2. для переопределения основной модели Observer, вставка <models><widget><rewrite> в config.xml будет правильным подходом

  3. это может быть один из немногих случаев, когда вызов parent:: не требуется при переопределении (!)

НТН, JD

РЕДАКТИРОВАТЬ - дополнительная информация добавлена ​​на шаге 1 для ответа на конкретный вопрос ОП

1 голос
/ 14 июля 2011

Спасибо, Джонатан, я переопределяю Observer с помощью синтаксиса оверидинга базовой модели

<config>
     <global>
        <models>
            <sales>
                <rewrite>
                    <observer>PPI_Sales_Model_Observer</observer>
                </rewrite>
           </sales>
        </models>
    </global>
</config>

Хорошо сработало.

...