Magento:如何禁用或更改核心观察者方法的工作方式

dan*_*des 7 php magento observer-pattern

我一直在想这个问题.如果Magento编写了一个核心Observer类并执行了一个你不希望它执行的功能,或者你想要重写它,该怎么办?有没有办法说,不要在Observer中使用此方法,只需使用我的.如果我为自己的Observer设置一个方法,它不会只是首先执行核心功能,然后是我实现的任何内容吗?

例如,Magento希望在Observer方法中将一些数据保存到数据库中,但我不希望它保存该数据,我希望它保存一些其他数据,我已将列或属性添加到数据库中.

Ala*_*orm 9

关于类重写的标准警告是实现自己的功能的最后手段

可能有可能摆脱Magento全局配置的加载以剥离核心Magento Observer,但是没有支持的方法来实现它.

但是,请考虑如何配置Core观察器.

<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>
Run Code Online (Sandbox Code Playgroud)

观察者是Magento Model类.如果模型已配置了基于URI /路径的语法

<class>widget/observer</class>
Run Code Online (Sandbox Code Playgroud)

而不是完整的PHP类名

<class>Mage_Widget_Model_Observer</class>
Run Code Online (Sandbox Code Playgroud)

您可以为Observer Model类创建一个覆盖(就像您可以为任何其他模型一样).如果使用了PHP类名,那你就不走运了.(如果您愿意承担维护责任,可以将本地文件放在local/Mage/Widget/Model/Observer.php中,但我不建议这样做)

所以,要覆盖上面的观察者,你会的

  1. 创建一个自定义模块,其中包含类Mage_Widget_Model_Observer的覆盖.

  2. 在您的覆盖类中,重新声明prepareWidgetsPluginConfig要执行您想要的操作或覆盖特定方法.这可能包括一个完全删除功能的空方法.


Sea*_*ean 5

更好的方法是简单地在config.xml文件中重新声明观察者的定义.

例如,我需要通过模块Enterprise_Persistent禁用在事件controller_action_layout_generate_blocks_after上声明的enterprise_persistent_cart观察.

Enterprise_Persistent的config.xml文件中的声明就是这样

<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>
Run Code Online (Sandbox Code Playgroud)

所以我创建了一个模块,在我的模块的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>
Run Code Online (Sandbox Code Playgroud)

我还使我的模块依赖于Enterprise_Persistent模块.这是确保我的模块的config.xml在Enterprise_Persistent模块的config.xml之后处理所必需的.我通过在我的模块的app/etc/modules My_Module.xml模块声明文件中执行以下操作来完成此操作

<config>
    <modules>
        <Atlex_AddCartLinkToHeader>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Enterprise_Persistent/>
            </depends>
        </Atlex_AddCartLinkToHeader>
    </modules>
</config>
Run Code Online (Sandbox Code Playgroud)

对于每个事件,只能为给定的观察者名称声明一个观察者操作.因此,只要在Enterprise_Persistent模块的config.xml文件之后处理我的模块的config.xml,我对enterprise_persistent_cart的观察者声明将是执行的观察者操作.

< type > disabled < / type >节点将禁止观察者触发.如果要覆盖观察者以执行自己的方法,那么只需用观察者的< class >和< method >节点替换< type >节点.

这允许您在不覆盖核心类的情况下覆盖/禁用观察者.它对未来的开发人员来说更具扩展性.