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

Насколько я могу судить, когда script запускается за пределами Magento, наблюдатели не вызывают при запуске события. Зачем? Как это исправить?

Ниже приведен оригинальный вопрос, который подводит меня к этому вопросу. Проблема в том, что наблюдатель, который применял бы правило каталога, никогда не вызывается. Событие срабатывает, но наблюдатель не поднимает его.


Я запускаю внешний script, который загружает сеанс Magento.

Внутри script я загружаю продукты и хватаю кучу свойств. Единственная проблема заключается в том, что getFinalPrice() не применяет правила каталога, которые применяются к продукту.

Я делаю все, что знаю, чтобы установить сеанс, даже кучу вещей, которые, я думаю, лишние. Кажется, что эти правила не применяются.

Здесь тест script:

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();

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

Ответ 1

Мое первое предположение - это событие, которое вы пытаетесь подключить, - это событие <frontend /> или <admin />, потому что при запуске командной строки script возникает только событие <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. Это, когда вызываются наблюдатели за событиями.