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

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

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

11
задан newfurniturey 7 January 2013 в 15:26
поделиться

1 ответ

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

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

, хотя вы загрузили бы ВСЕХ наблюдателей в области , многие из которых, вероятно, были созданы с учетом контекста веб-браузера.

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

14
ответ дан 3 December 2019 в 08:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: