据我所知,当脚本在Magento之外运行时,在触发事件时不会调用观察者。为什么?我如何解决它?
以下是引导我回答这个问题的原始问题。问题是永远不会调用将应用目录规则的观察者。事件发生了,但是观察者没有接收它。
我正在运行一个加载Magento会话的外部脚本。
在该脚本中,我正在加载产品并抓住一堆属性。一个问题是getFinalPrice()
不适用适用于产品的目录规则。
我正在做我知道的所有事情来设置会话,即使是一些我认为多余的东西。似乎没有适用这些规则。
这是一个测试脚本:
require_once "app/Mage.php";
umask(0);
$app = Mage::app("default");
$app->getTranslator()->init('frontend'); //Probably not needed
Mage::getSingleton('core/session', array('name'=>'frontend'));
$session = Mage::getSingleton("customer/session");
$session->start(); //Probably not needed
$session->loginById(122);
$product = Mage::getModel('catalog/product')->load(1429);
echo $product->getFinalPrice();
感谢任何见解。
答案 0 :(得分:12)
我的第一个猜测是您尝试加入的事件是<frontend />
或<admin />
事件,因为在您运行命令行时看起来只有<global />
个事件被触发脚本。
Magento将这个概念称为“区域”。区域有点像生活在系统中的单个应用程序(但不完全,我对概念仍然有点模糊)。当您使用观察者设置config.xml时,您要么将它们放在{ {1}}代码,<global />
代码或<frontend />
代码。
当涉及到事件时,Magento只会加载必须处理特定请求的区域。因此,<admin />
区域总是被加载。但是,如果应用程序进入控制器调度,<global />
或<frontend />
区域只会被加载。具体来说,在以下文件/行
<admin />
命令行应用程序永远不会发生这种情况。仅加载File: app/code/core/Mage/Core/Controller/Varien/Action.php
Mage::app()->loadArea($this->getLayout()->getArea());
区域。
所以,正如第一段所述,我的猜测是你的观察者没有开火,因为Magento从不加载应用程序的<global />
区域。至于解决方案,您可以尝试将观察者移动到<frontend />
区域。您也可以尝试手动调用
<global />
尽管如此,您将在Mage::app()->loadArea(Mage_Core_Model_App_Area::AREA_FRONTEND);
区域中加载所有观察者,其中许多观察者可能是在假定Web浏览器上下文的情况下创建的。
如果这些都没有帮助,请查看<frontend />
课程上的dispatchEvent
方法。这就是事件观察者被调用的地方。