2010-05-12 10 views
10

Soweit ich feststellen kann, wenn ein Skript außerhalb von Magento ausgeführt wird, werden Beobachter nicht aufgerufen, wenn ein Ereignis ausgelöst wird. Warum? Wie repariere ich es?Magento: Wie bekomme ich Beobachter in einem externen Skript arbeiten?

Unten ist das ursprüngliche Problem, das mich zu dieser Frage führte. Das Problem ist, dass der Beobachter, der die Katalogregel anwenden würde, niemals aufgerufen wird. Das Ereignis wird ausgelöst, aber der Beobachter hebt es nicht auf.


Ich verwende ein externes Skript, das eine Magento-Sitzung lädt.

In diesem Skript, ich lade Produkte und greifen eine Reihe von Eigenschaften. Das einzige Problem ist, dass getFinalPrice() nicht die Katalogregeln anwendet, die für das Produkt gelten.

Ich mache alles, was ich weiß, um die Sitzung einzustellen, auch eine Menge Dinge, die ich für überflüssig halte. Nichts scheint diese Regeln anzuwenden.

Hier ist ein Testskript:

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

Einsicht geschätzt wird.

+2

In welches Ereignis möchten Sie sich einklinken und wie sieht Ihre config.xml für den Event Observer aus? –

Antwort

11

Meine erste Vermutung wäre das Ereignis Sie versuchen, in einzuhaken ein <frontend /> oder <admin /> Ereignis ist, weil es wie nur <global /> Ereignisse Feuer aussieht, wenn Sie ein Kommandozeilen-Skript ausführen.

Magento hat dieses Konzept "Bereiche" genannt. Bereiche sind so ähnlich wie einzelne Anwendungen, die im System leben (aber nicht ganz, ich bin immer noch ein wenig verschwommen auf dem Konzept). Wenn Sie eine config.xml mit Ihren Beobachtern einrichten, platzieren Sie sie entweder in einem <global /> Tag, ein <frontend /> Tag oder ein <admin /> Tag.

Wenn es um Ereignisse geht, lädt Magento nur Bereiche, mit denen es sich für eine bestimmte Anfrage befassen muss. So wird der <global /> Bereich immer geladen. Die Bereiche <frontend /> oder <admin /> werden jedoch nur geladen, wenn die Anwendung den Controller-Dispatch erhält. Spezifisch, in der folgenden Datei/Zeile

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

Das passiert nie mit einer Befehlszeilenanwendung. Nur der Bereich <global /> wird geladen.

So, wie im ersten Absatz erwähnt, meine Vermutung ist, Ihre Beobachter Brennen sind nicht, weil Magento nie den <frontend /> Bereich der Anwendung lädt. Als Lösungen könnten Sie versuchen, Ihren Beobachter in den Bereich <global /> zu bewegen. Sie könnten auch

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

Aufruf versuchen, manuell obwohl, dann werden Sie alle Beobachter im <frontend /> Bereich werden geladen, von denen viele wahrscheinlich einen Web-Browser Kontext erstellt vorausgesetzt.

Wenn nichts davon hilft, werfen Sie einen Blick auf die dispatchEvent Methode auf der Mage_Core_Model_App Klasse. Dort werden Ereignisbeobachter angerufen.

+1

Eine weitere solide Lektion in der Magento-Architektur. Danke, Alan. – Laizer

+1

Stellar Antwort Alan. Danke für die Information :) –

Verwandte Themen