Events Magento:如何让观察员在外部脚本中工作?

Events Magento:如何让观察员在外部脚本中工作?,events,magento,controllers,areas,Events,Magento,Controllers,Areas,据我所知,当脚本在Magento之外运行时,触发事件时不会调用观察器。为什么?我怎么修理它 下面是引导我提出这个问题的原始问题。问题是,将应用目录规则的观察者永远不会被调用。事件会激发,但观察者不会拾取它 我正在运行加载Magento会话的外部脚本 在这个脚本中,我加载产品并获取一系列属性。一个问题是getFinalPrice()没有应用适用于产品的目录规则 我正在尽我所能安排会议,甚至是一些我认为是多余的东西。这些规则似乎没有得到应用 下面是一个测试脚本: require_once "app

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

非常感谢您提供的任何见解。

我的第一个猜测是,您试图连接到的事件是一个
事件,因为它看起来只有
事件才会在您运行命令行脚本时触发

Magento有一个称为“区域”的概念。区域有点像系统中的单个应用程序(但不完全一样,我对这个概念仍然有点模糊)。当您使用观察者设置config.xml时,您可以将它们放置在
标记、
标记或
标记中

当涉及到事件时,Magento只加载它必须为特定请求处理的区域。因此,
区域总是被加载。但是,只有当应用程序到达控制器调度时,
区域才会加载。具体来说,在以下文件/行中

File: app/code/core/Mage/Core/Controller/Varien/Action.php
Mage::app()->loadArea($this->getLayout()->getArea());
这在命令行应用程序中永远不会发生。仅加载
区域

因此,如第一段所述,我猜您的观察者没有开火,因为Magento从未加载应用程序的
区域。至于解决方案,您可以尝试将观察者移动到
区域。您也可以尝试手动呼叫

Mage::app()->loadArea(Mage_Core_Model_App_Area::AREA_FRONTEND);
尽管如此,您将在
区域中加载所有观察者,其中许多观察者可能是在假定web浏览器上下文的情况下创建的


如果这些都没有帮助,请查看
Mage\u Core\u Model\u应用程序
类上的
dispatchEvent
方法。这就是调用事件观察器的地方。

您要挂接什么事件,事件观察器的config.xml是什么样子的?Magento体系结构的另一个重要课程。谢谢,艾伦,回答得很好,艾伦。感谢您提供的信息:)我的配置文件中的观察者位于全局区域,但外部脚本不会触发事件。