Domanda

Per quanto posso dire, quando uno script viene eseguito al di fuori di Magento, gli osservatori non sono invocate quando un evento viene generato. Perché? Come lo aggiusto?

Di seguito è riportato il problema originale che mi portano a questa domanda. Il problema è che l'osservatore che si applicherebbe la regola catalogo è mai chiamato. L'evento, ma l'osservatore non prende in mano.


Sono in esecuzione uno script esterno che carica una sessione di Magento.

In questo script, sto caricando prodotti e afferrando un gruppo di proprietà. L'unico problema è che getFinalPrice() non applica le regole del catalogo che si applicano al prodotto.

Sto facendo tutto quello che so per impostare la sessione, anche un sacco di roba che penso sia superfluo. Nulla sembra per ottenere queste regole applicate.

Ecco uno script di test:

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

Tutta la comprensione è apprezzato.

È stato utile?

Soluzione

La mia prima risposta sarebbe il caso in cui si sta cercando di collegare in è un evento <frontend /> o <admin />, perché sembra che solo gli eventi <global /> fuoco quando si esegue uno script da riga di comando.

Magento ha questo concetto chiamato "aree". Le aree sono una sorta-di come le applicazioni singole che vivono nel sistema (ma non del tutto, io sono ancora un po 'confuso sul concetto) .Quando si imposta un config.xml con i vostri osservatori, si sta o mettendoli in un <global /> tag, un tag <frontend />, o un tag <admin />.

Quando si tratta di eventi, Magento solo carichi fino aree che si deve fare i conti con una richiesta particualr. Così, l'area <global /> sempre viene caricato. Tuttavia, le aree <frontend /> o <admin /> solo vengono caricate su se l'applicazione ottiene per l'invio di controllo. Specifcally, nel seguente file / riga

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

Questo non succede mai con un'applicazione a riga di comando. Solo l'area <global /> viene caricato.

Quindi, come detto nel primo paragrafo, la mia ipotesi è il vostro osservatore non è sparare, perché Magento mai carica l'area <frontend /> dell'applicazione. Per quanto riguarda le soluzioni, si potrebbe provare a spostare il vostro osservatore alla zona <global />. Si potrebbe anche provare manualmente chiamando

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

Anche se, si sarebbe caricamento di tutti gli osservatori nella zona <frontend />, molti dei quali sono stati probabilmente creati assumendo un contesto browser web.

Se niente di tutto questo aiuta, dare un'occhiata al metodo dispatchEvent sulla classe Mage_Core_Model_App. Ecco dove gli osservatori degli eventi vengono chiamati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top