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

Lai*_*zer 11 events controllers magento 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();
Run Code Online (Sandbox Code Playgroud)

任何见解都表示赞赏.

Ala*_*orm 14

我的第一个猜测是你试图挂钩的事件是一个<frontend />或一个<admin />事件,因为它看起来只有<global />当你运行命令行脚本时才会激活事件.

Magento将这个概念称为"区域".区域有点像生活在系统中的单个应用程序(但不完全,我对这个概念仍然有点模糊).当你用观察者设置config.xml时,你要么把它们放在一个<global />标签中,<frontend />标签或<admin />标签.

在涉及事件时,Magento只会加载必须处理特定请求的区域.因此,该<global />区域总是被加载.但是,如果应用程序到达控制器分派,则只会加载<frontend /><admin />区域.具体来说,在以下文件/行中

File: app/code/core/Mage/Core/Controller/Varien/Action.php
Mage::app()->loadArea($this->getLayout()->getArea());
Run Code Online (Sandbox Code Playgroud)

这在命令行应用程序中永远不会发生.只有该<global />区域被加载.

因此,如第一段所述,我的猜测是你的观察者没有开火,因为Magento从不加载<frontend /> 应用程序的区域.至于解决方案,您可以尝试将观察者移动到该<global />区域.您也可以尝试手动呼叫

Mage::app()->loadArea(Mage_Core_Model_App_Area::AREA_FRONTEND);
Run Code Online (Sandbox Code Playgroud)

虽然,你将在该<frontend />区域加载所有观察者,其中许多观察者可能是在假设Web浏览器上下文的情况下创建的.

如果这些都没有帮助,请查看该类的dispatchEvent方法Mage_Core_Model_App.这就是事件观察者被调用的地方.