Jen*_*Jen 3 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();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的模块的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>
Run Code Online (Sandbox Code Playgroud)
这是我的app/etc/modules/WR_TrackingEmail.xml
<config>
<modules>
<WR_TrackingEmail>
<active>true</active>
<codePool>local</codePool>
</WR_TrackingEmail>
</modules>
</config>
Run Code Online (Sandbox Code Playgroud)
Ala*_*orm 11
您的声明"自定义观察者未被触发"留下了很大的解释空间.这是你要检查的内容.
您的观察者似乎设置正确(尽管模块标记属于全局标记之外,但在这种情况下似乎并不重要).您可以通过自己从空白控制器操作(或其他引导,事件加载,Magento脚本)运行以下代码来测试您的设置
Mage::dispatchEvent('sales_order_shipment_track_save_after');
Run Code Online (Sandbox Code Playgroud)
然后用sendTrackEmail这个替换你
public function sendTrackEmail($observer)
{
exit(__METHOD__);
}
Run Code Online (Sandbox Code Playgroud)
如果执行因文本而停止
WR_TrackingEmail_Model_Observer::sendTrackEmail
Run Code Online (Sandbox Code Playgroud)
你会知道你的事件配置正确.
如果您的事件配置正确,则下一步是确保在执行上述步骤时实际触发事件.您可以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;
}
Run Code Online (Sandbox Code Playgroud)
此外,如果您的活动被解雇,那么离开您的出口仍然很有可能导致执行暂停.
如果您确定您的观察者配置正确,并且您的事件被触发,则问题不是触发事件,而是您的观察者代码没有按照您的想法执行.重新添加您的代码,但保持退出
class WR_TrackingEmail_Model_Observer
{
public function sendTrackEmail($observer)
{
$track = $observer->getEvent()->getTrack();
$shipment = $track->getShipment(true);
$shipment->sendEmail();
exit(__METHOD__);
}
}
Run Code Online (Sandbox Code Playgroud)
这将允许您反复重新加载浏览器以测试您的观察者代码.祝好运!