Magento的:如何让观察员工作在外部脚本?
-
26-09-2019 - |
题
据我所知,当脚本运行的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浏览器上下文。
如果没有,可帮助,看看在dispatchEvent
类Mage_Core_Model_App
方法。这就是事件的观察员被调用。