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:如何让观察者在外部脚本中工作?的主要内容,如果未能解决你的问题,请参考以下文章

事件(_观察者模式)

如何让这个命令行脚本在 TeamCity 中工作?

恢复如何在 HBase 中工作

如何在 Magento 的观察者中获取付款方式?

如何让别名在所有 shell 中工作?

如何让 ScrollViewer 在 StackPanel 中工作?