Magento: Как я могу заставить наблюдателей работать во внешнем сценарии?

StackOverflow https://stackoverflow.com/questions/2817489

Вопрос

Насколько я могу сказать, когда скрипт бежит за пределами 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();

Любое понимание ценится.

Это было полезно?

Решение

Мое первое предположение было бы событием, которое вы пытаетесь зацепить, это <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());

Это никогда не происходит с приложением командной строки. Только <global /> Область загружается.

Так, как упомянуто в первом абзаце, я думаю, ваш наблюдатель не стреляет, потому что Magento никогда не загружает <frontend /> Площадь заявления. Что касается решений, вы можете попробовать переместить свое наблюдаемое <global /> площадь. Вы также можете попробовать вручную звонить

Mage::app()->loadArea(Mage_Core_Model_App_Area::AREA_FRONTEND);

Хотя, вы будете загружать все наблюдатели в <frontend /> Район, многие из которых, вероятно, были созданы, предполагая контекст веб-браузера.

Если никто из этого не помогает, посмотрите на dispatchEvent Метод на Mage_Core_Model_App сорт. Вот где называются наблюдатели событий.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top