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

任何了解理解。

有帮助吗?

解决方案

我的第一个猜想是你要挂钩到事件是<frontend /><admin />事件,因为它看起来像只<global />事件触发时运行一个命令行脚本。

Magento的具有此概念被称为“区域”。区域是排序像生活在系统(但不完全,我对这个概念还是有点模糊)。当你设置你的观察员的config.xml,你要么将它们放置在一个<global />个人申请标签,<frontend />标签或标签<admin />

当它涉及到的事件,Magento的唯一载荷密集区,它要处理的particualr请求。因此,<global />区域总是被加载。但是,如果应用程序获取到控制器派遣<frontend /><admin />地区唯一获得装起来。比较特别,在下面的文件/行

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

这从未用命令行应用程序发生的情况。只有<global />区域被加载。

因此,作为第一款规定,我的猜测是你的观测器不点火,因为Magento的永远加载应用程序的<frontend />区域。至于解决方案,你可以试试你的观察者移动到<global />区域。您也可以尝试手动调用

Mage::app()->loadArea(Mage_Core_Model_App_Area::AREA_FRONTEND);

虽然,你会加载在<frontend />地区的所有观察员,其中许多可能已经被创建假设一个Web浏览器上下文。

如果没有,可帮助,看看在dispatchEventMage_Core_Model_App方法。这就是事件的观察员被调用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top