Magento观察者未触发。

4
我将尝试在管理控制台中更新产品时触发一个观察者,以记录更新日志。

Config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Mod_Products>
            <version>1.0.0</version>
        </Mod_Products>
    </modules>

    <models>
        <Mod_Products>
            <class>Mod_Products_Model</class>
        </Mod_Products>
    </models>

    <events>
        <catalog_product_save_after>
            <observers>
                <Mod_Products_stock>
                    <type>singleton</type>
                    <class>Mod_Products_Model</class>
                    <method>logUpdate</method>
                </Mod_Products_stock>
            </observers>
        </catalog_product_save_after>
    </events>
</config>

Observer.php

class Mod_Products_Model_Observer {
    public function logUpdate($observer) {
        $event = $observer->getEvent()->getControllerAction()->getFullActionName();

        Mage::log('Event Fired: ' . $event);
        Mage::log(json_encode($observer->getEvent()));
    }
}

日志中没有错误和输出。


我假设您有一个app/etc/modules/Mod_Products.xml文件,其中active设置为true,并标记了正确的codepool? - Jason
一个技巧是,如果你在开发服务器上,可以在各个地方放置“die”语句。这有助于我确认文件未被自动加载器找到/加载,或者函数未被调用(而不仅仅是结果不是我想象中的那样)。 - user1086498
7个回答

2

不知道为什么 OP 接受了 Jason 的答案,因为他并没有真正解决问题,但是对于未来的寻求者来说,这里是正确的答案(我从 Emi 对自己答案的评论中注意到了这一点):缺少 adminhtml 标签!

配置应该像这样(假设我没有漏掉其他任何内容):

<adminhtml>
    <events>
        <catalog_product_save_after>
            <observers>
                <Mod_Products_stock>
                    <type>singleton</type>
                    <class>Mod_Products_Model</class>
                    <method>logUpdate</method>
                </Mod_Products_stock>
            </observers>
        </catalog_product_save_after>
    </events>
</adminhtml>

希望这能帮到您。

0

你的配置文件中的类必须是Observer类,所以请更改为:

<class>Mod_Products_Model_Observer</class>

日志文件中仍然没有任何内容显示。 - SlateEntropy
1
我已经像这样使用了此事件 <adminhtml> <events> <catalog_product_save_after> <observers> <obs_catalog_product_save_after> <type>singleton</type> <class>Test_Obs_Model_Catalog_Product_Observer</class> <method>saveAfter</method> </obs_catalog_product_save_after> </observers> </catalog_product_save_after> </events> </adminhtml> 所以它应该可以工作。我已经在管理后台保存产品进行了测试。 - Emi
是的,那是个打字错误,抱歉。观察者仍然没有触发。 - SlateEntropy

0

让我们逐个浏览文件。

app/etc/modules/Mod_Products.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Mod_Products>
            <!-- Change to Community codePool if in app/code/community -->
            <codePool>local</codePool> 
            <active>true</active>
        </Mod_Products>
    </modules>
</config>

app/code/local/Mod/Products/etc/config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Mod_Products>
            <version>1.0.0</version>
        </Mod_Products>
    </modules>

    <!-- Marking models as global sometimes helps -->
    <global>
        <models>
            <Mod_Products>
                <class>Mod_Products_Model</class>
            </Mod_Products>
        </models>
    </global>

    <events>
        <catalog_product_save_after>
            <observers>
                <mod_products_model_observer>
                    <type>singleton</type>
                    <class>Mod_Products_Model_Observer</class>
                    <method>logUpdate</method>
                </mod_products_model_observer>
            </observers>
        </catalog_product_save_after>
    </events>
</config>

app/code/local/Mod/Products/Model/Observer.php

class Mod_Products_Model_Observer {
    public function logUpdate($observer) {
        $event = $observer->getEvent()->getControllerAction()->getFullActionName();

        Mage::log('Event Fired: ' . $event);
        Mage::log(json_encode($observer->getEvent()));
    }
}

请注意文件名和目录,以及我更新的config.xml中不同的xml句柄。如果这对您有用,请告诉我。

所以我刚刚运行了这些代码,使它们完全相同,检查了名称,但仍然没有得到任何结果。 - SlateEntropy
那么为什么这是被接受的答案呢?你是如何让你的观察者被Magento捕捉到的? - fkoessler

0

我曾经遇到过同样的问题,解决方法是清除系统缓存,你也可以尝试清除缓存以刷新其配置。


0
对于那些遇到这个问题的人,一个可能的解决方案是您的Magento应用程序可能没有适当的权限来写入app/var文件夹。特别是如果您正在使用基于UNIX/Linux的操作系统。
要解决此问题,只需将终端定位到Magento应用程序的根目录。一旦到达那里,请使用以下命令为您的var文件夹提供适当的权限: sudo chmod 777 -R var/ 执行此操作后,我的应用程序能够在文件夹结构下记录和创建其他文件夹。

0

我曾经遇到过同样的问题,最终发现 Mage_Log 没有起作用。尝试使用类似于 die("I'm here"); 的方式进行跟踪,看看它是否能够找到你的类。如果可以,尝试通过 Configuration: Developer: Log Setting (Enabled=Yes) 打开 Mage_Log。 此外,请检查在 Configuration: Advanced 中是否启用了 Mage_Log


-1

检查您的模块是否存在于"禁用模块输出"并启用
系统 -> 配置 -> 高级 ->禁用模块输出。
并检查您的系统日志文件


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接