2010-05-12 8 views
10

O ile wiem, kiedy skrypt jest uruchamiany poza Magento, obserwatorzy nie są wywoływani, gdy zdarzenie jest uruchamiane. Czemu? Jak mogę to naprawić?Magento: Jak zachęcić obserwatorów do pracy w zewnętrznym skrypcie?

Poniżej znajduje się oryginalny numer, który doprowadził mnie do tego pytania. Problem polega na tym, że obserwator, który stosuje regułę katalogu, nigdy nie jest wywoływany. Wydarzenie się rozpala, ale obserwator go nie odbiera.


Używam zewnętrznego skryptu, który ładuje sesję Magento.

Wewnątrz tego skryptu ładuję produkty i chwytam kilka właściwości. Jedynym problemem jest to, że getFinalPrice() nie stosuje reguł katalogu, które mają zastosowanie do produktu.

Robię wszystko, co wiem, aby ustawić sesję, nawet kilka rzeczy, które uważam za zbyteczne. Wydaje się, że nic nie ma zastosowania do tych reguł.

Oto skrypt testowy:

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

Każdy wgląd jest doceniana.

+2

Jakie wydarzenie chcesz podłączyć i jak wygląda plik config.xml dla obserwatora wydarzeń? –

Odpowiedz

11

Moje pierwsze przypuszczenie byłoby wydarzenie starasz się zahaczyć na to wydarzenie <frontend /> lub <admin />, bo wygląda na to tylko <global /> imprez ognia po uruchomieniu skryptu wiersza poleceń.

Magento ma to pojęcie o nazwie "obszary". Obszary są w pewnym sensie podobne do indywidualnych aplikacji, które żyją w systemie (ale nie do końca, wciąż jestem trochę niewyraźny). Kiedy konfigurujesz plik config.xml ze swoimi obserwatorami, umieszczasz je w postaci <global /> tag, tag <frontend /> lub tag <admin />.

Jeśli chodzi o wydarzenia, Magento ładuje tylko obszary, z którymi ma do czynienia, w przypadku żądania konkretnego. Tak więc obszar <global /> zawsze się ładuje. Jednak obszary <frontend /> lub <admin /> są ładowane dopiero wtedy, gdy aplikacja trafi do wysyłki kontrolera. Specyficznie, w następującym pliku/linii

File: app/code/core/Mage/Core/Controller/Varien/Action.php 
Mage::app()->loadArea($this->getLayout()->getArea()); 

To nigdy nie dzieje się z aplikacją wiersza poleceń. Tylko obszar <global /> zostanie załadowany.

Tak, jak wspomniano w pierwszym akapicie, zgaduję, że twój obserwator nie strzela, ponieważ Magento nigdy nie ładuje obszaru aplikacji. Jeśli chodzi o rozwiązania, możesz spróbować przenieść swojego obserwatora do obszaru <global />. Można również spróbować ręcznie wywołanie

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

mimo, że będziesz ładowania wszystkich obserwatorów w obszarze <frontend />, z których wiele prawdopodobnie zostały utworzone przy założeniu kontekstu przeglądarki internetowej.

Jeśli nic z tego nie pomoże, zapoznaj się z metodą dispatchEvent na klasie Mage_Core_Model_App. To tam wywoływani są obserwatorzy wydarzeń.

+1

Kolejna solidna lekcja w architekturze Magento. Dzięki, Alan. – Laizer

+1

Gwiezdna odpowiedź Alan. Dzięki za informację :) –

Powiązane problemy