自定义观察者未被触发

时间:2012-01-10 18:59:42

标签: magento magento-1.4

我正在尝试为magento编写一个观察员,当订单被标记为已发货且已获得跟踪编号时将触发该观察员。

当我通过管理员进入并下订单,发票然后去运送我需要调用的函数从未实际调用过,我不明白为什么。

我在magento网站上浏览了几页,看看我可能做错了什么,但我无法弄明白(http://www.magentocommerce.com/wiki/5_-_modules_and_development/0_-_module_development_in_magento/customizing_magento_using_event-observer_method& http://www.magentocommerce.com/knowledge-base/entry/magento-for-dev-part-2-the-magento-config)。

请注意,我确实在管理高级区域内看到该模块,并且已启用。

如果有人可以查看我附上的代码并让我知道我的问题在哪里,我们将不胜感激。

这是我的Observer类,位于app / code / local / WR / TrackingEmail / Model / Observer.php

class WR_TrackingEmail_Model_Observer
{
    public function sendTrackEmail($observer)
    {
        $track = $observer->getEvent()->getTrack();
        $shipment = $track->getShipment(true);
        $shipment->sendEmail();
    }
}

这是我的模块的config.xml

<config>
    <global>
        <modules>
            <wr_trackingemail>
                <version>0.1.1</version>
            </wr_trackingemail>
        </modules>
        <events>
            <sales_order_shipment_track_save_after>
                <observers>
                    <Wr_trackingemail_model_observer>
                        <type>singleton</type>
                        <class>WR_TrackingEmail_Model_Observer</class>
                        <method>sendTrackEmail</method>
                    </Wr_trackingemail_model_observer>
                </observers>
            </sales_order_shipment_track_save_after>
        </events>
    </global>
</config>

这是我的app / etc / modules / WR_TrackingEmail.xml

<config>
    <modules>
        <WR_TrackingEmail>
            <active>true</active>
            <codePool>local</codePool>
        </WR_TrackingEmail>
    </modules>
</config>

2 个答案:

答案 0 :(得分:11)

你的陈述“不被触发的自定义观察者”留下了很大的解释空间。这是你要检查的内容。

您的观察者似乎设置正确(虽然模块标记属于全局标记之外,但在这种情况下似乎并不重要)。您可以通过自动从空白控制器操作(或其他引导,事件加载,Magento脚本)运行以下代码来测试您的设置

Mage::dispatchEvent('sales_order_shipment_track_save_after');

然后用此

替换您的sendTrackEmail
public function sendTrackEmail($observer)
{
    exit(__METHOD__);
}

如果执行停止并带有文本

WR_TrackingEmail_Model_Observer::sendTrackEmail

您将知道您的活动配置正确。

如果您的事件配置正确,则下一步是确保在执行上述步骤时实际触发事件。您可以通过添加此临时日志记录代码

app/Mage.php中记录这些事件
public static function dispatchEvent($name, array $data = array())
{
    //brain dead logging
    file_put_contents('/tmp/events.log',"$name\n",FILE_APPEND);
    Varien_Profiler::start('DISPATCH EVENT:'.$name);
    $result = self::app()->dispatchEvent($name, $data);
    #$result = self::registry('events')->dispatch($name, $data);
    Varien_Profiler::stop('DISPATCH EVENT:'.$name);
    return $result;
}

此外,如果您的活动被解雇,离开上方的出口仍有可能导致执行暂停。

如果您确定您的观察者配置正确,并且您的事件被触发,那么问题不是触发事件,而是您的观察者代码没有按照您的想法执行。重新添加您的代码,但保持退出

class WR_TrackingEmail_Model_Observer
{
    public function sendTrackEmail($observer)
    {
        $track = $observer->getEvent()->getTrack();
        $shipment = $track->getShipment(true);
        $shipment->sendEmail();
        exit(__METHOD__);
    }
}

这将允许您反复重新加载浏览器以测试您的观察者代码。祝你好运!

答案 1 :(得分:1)

您是否在app/etc/modules/文件的.xml下注册了模块?

<?xml version="1.0"?>
<config>
    <modules>
        <Wr_Trackingemail>
            <active>true</active>
            <codePool>local</codePool>
        </Wr_Trackingemail>
    </modules>
</config>