Magento: Как заставить наблюдателей работать с внешним сценарием? - PullRequest
11 голосов
/ 12 мая 2010

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

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

1 Ответ

12 голосов
/ 13 мая 2010

Моим первым предположением будет событие, к которому вы пытаетесь подключиться, это событие <frontend /> или <admin />, потому что похоже, что только события <global /> запускаются при запуске сценария командной строки.

У Magento есть такая концепция, которая называется «области». Области похожи на отдельные приложения, которые живут в системе (но не совсем, я все еще немного не в своей концепции). Когда вы настраиваете config.xml со своими наблюдателями, вы либо помещаете их в * Тег 1006 *, тег <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. Вот где вызвали наблюдателей событий.

...