【问题标题】:Custom observer not being triggered自定义观察者没有被触发
【发布时间】:2012-01-10 18:59:42
【问题描述】:

我正在尝试为 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>

这是我的应用程序/etc/modules/WR_TrackingEmail.xml

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

【问题讨论】:

  • &lt;global&gt; 下的 &lt;modules&gt; 节点永远不会被评估,但它也不会产生任何负面影响。

标签: magento magento-1.4


【解决方案1】:

您的声明“未触发自定义观察者”留下了很大的解释空间。这是您要检查的内容。

您的观察者似乎设置正确(尽管模块标签属于全局标签之外,但这似乎与这种情况无关)。您可以通过自己从空白控制器操作(或其他引导、事件加载、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__);
    }
}

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是的,我有。我什至使用了您的示例,以防万一我已有的示例出现问题。还是不行……
    • 我有一个错误(刚刚更正)。您是否清除了配置缓存?您是否在核心触发事件后添加了一个简单的die;,并在您的观察者中添加了一个die; 以确定应用程序是否正在实例化它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 2015-01-21
    • 1970-01-01
    相关资源
    最近更新 更多