gpt4 book ai didi

events - Magento:如何让观察者在外部脚本中工作?

转载 作者:行者123 更新时间:2023-12-04 02:00:51 26 4
gpt4 key购买 nike

据我所知,当脚本在 Magento 之外运行时,在触发事件时不会调用观察者。为什么?我如何解决它?

以下是导致我提出这个问题的原始问题。问题是永远不会调用将应用目录规则的观察者。事件触发,但观察者没有发现它。

我正在运行一个加载 Magento session 的外部脚本。

在该脚本中,我正在加载产品并获取大量属性。一个问题是getFinalPrice()不适用适用于产品的目录规则。

我正在尽我所知道的一切来设置 session ,即使是一堆我认为是多余的东西。似乎没有什么可以应用这些规则。

这是一个测试脚本:

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 只会加载它必须为特定请求处理的区域。所以,<global /> 区域总是被加载。然而,<frontend /><admin /> 区域只有在应用程序到达 Controller 调度时才会加载。具体来说,在以下文件/行中

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 方法。这就是事件观察者被调用的地方。

关于events - Magento:如何让观察者在外部脚本中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2817489/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com