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.这就是事件观察者被调用的地方.
| 归档时间: |
|
| 查看次数: |
4470 次 |
| 最近记录: |