Magento: Как я могу заставить наблюдателей работать во внешнем сценарии?
-
26-09-2019 - |
Вопрос
Насколько я могу сказать, когда скрипт бежит за пределами 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
сорт. Вот где называются наблюдатели событий.