Magento事件观察器或自定义模块在生产中不起作用


Magento Event Observers or Custom Modules Not Working On Production

我正在尝试使用多个观察者类&Magento的模块,所有这些都被放入app/code/local中。这些都可以在我的本地工作站上工作,但当我通过FTP将它们复制到生产时就不起作用了。我想弄清楚到底发生了什么,真是疯了。我所有的代码似乎都很好。下面是一个观察者的例子:

app/code/local/Mural/Pricing/Model/Observer.php

<?php 
class Mural_Pricing_Model_Observer {
    public function setMuralPricing($observer) {
        echo 'We did it!';
        die();
    } 
}

app/code/local/Mural/etc/config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Mural_Pricing>
            <version>0.0.1</version>
        </Mural_Pricing>
    </modules>
    <global>
        <models>
            <Mural_Pricing>
                <class>Mural_Pricing_Model</class>
            </Mural_Pricing>
        </models>
    </global>
    <adminhtml>
        <events>
            <sales_quote_add_item>
                <observers>
                    <Mural_Pricing>
                        <class>mural_pricing/observer</class>
                        <method>setMuralPricing</method>
                    </Mural_Pricing>
                </observers>
            </sales_quote_add_item>
        </events>
    </adminhtml>
</config>

app/etc/modules/Mural_Pricing.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Mural_Pricing>
            <codePool>local</codePool>
            <active>true</active>
            <depends>
                <Mage_Catalog />
            </depends>
        </Mural_Pricing>
    </modules>
</config>

正如我所说,这在当地很好,但在生产中却不好,有几个不同的观察者&模块。令人沮丧。提前谢谢!

我注意到的第一件事是,您的观察者声明是对您观察到的事件调用mural_pricing/observer::setMuralPricing()

如果您查看配置XML,您将按照以下XML:将该模块中的模型注册为Mural_Pricing/...

<models>
    <Mural_Pricing>
        <class>Mural_Pricing_Model</class>
    </Mural_Pricing>
</models>

Magento的最佳实践似乎是对类别名使用所有小写字母,所以我建议您将其更改为mural_pricing。如果您将observer声明更改为使用大写等效项,那么它也会起作用。

在另一点上,我认为你给这个标签起什么名字其实并不重要,但<observers>下面的<Mural_Pricing>标签应该理想地代表你的观察者所做的事情的简短描述(同样,不要认为它实际上很重要),例如<mural_pricing_set_pricing>

最后,必须确保正确地清除了缓存,以便重新解析XML配置。如果您在生产版与/dev/staging/local中使用Redis或其他缓存架构,那么您可能忘记了以与本地不同的方式清除缓存。

最终,除了类别名和观察者声明中的大小写差异之外,您的模块看起来还不错。