Magento:如何让观察者在外部脚本中工作?
Posted
技术标签:
【中文标题】Magento:如何让观察者在外部脚本中工作?【英文标题】:Magento: How do I get observers to work in an external script? 【发布时间】:2011-02-18 12:53:22 【问题描述】:据我所知,当脚本在 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();
感谢任何见解。
【问题讨论】:
你试图挂钩什么事件,你的事件观察者的 config.xml 是什么样的? 【参考方案1】:我的第一个猜测是您尝试挂钩的事件是 <frontend />
或 <admin />
事件,因为当您运行命令行脚本时,看起来只有 <global />
事件会触发。
Magento 有一个称为“区域”的概念。区域有点像系统中的单个应用程序(但不完全是,我对这个概念仍然有些模糊)。当您与观察者一起设置 config.xml 时,您要么将它们放在 @ 987654324@ 标签、<frontend />
标签或 <admin />
标签。
当涉及到事件时,Magento 只加载它必须为特定请求处理的区域。所以,<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 浏览器上下文时创建的。
如果这些都没有帮助,请查看Mage_Core_Model_App
类的dispatchEvent
方法。这就是调用事件观察者的地方。
【讨论】:
Magento 架构的另一个扎实课程。谢谢,艾伦。 恒星回答艾伦。感谢您的信息:) 我的配置文件中的观察者在全局区域,但外部脚本不会触发事件。以上是关于Magento:如何让观察者在外部脚本中工作?的主要内容,如果未能解决你的问题,请参考以下文章