Magento:我如何让观察者在外部脚本中工作?

时间:2010-05-12 09:29:52

标签: events magento controllers areas

据我所知,当脚本在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();

感谢任何见解。

1 个答案:

答案 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方法。这就是事件观察者被调用的地方。