Question

Pour autant que je peux dire, quand ne sont pas appelés un script est exécuté en dehors de Magento, les observateurs lorsqu'un événement est déclenché. Pourquoi? Comment je le répare?

Voici la question originale qui me conduit à cette question. Le problème est que l'observateur qui s'appliquerait la règle du catalogue est jamais appelé. L'événement se déclenche, mais l'observateur ne ramassez pas.


Je suis en cours d'exécution d'un script externe qui se charge d'une session de Magento.

Dans ce script, je charge les produits et saisir un tas de propriétés. Le seul problème est que getFinalPrice() ne concerne pas les règles de catalogue applicables au produit.

Je fais tout ce que je sais pour régler la session, même un tas de choses que je pense est superflu. Rien ne semble obtenir ces règles appliquées.

Voici un script de 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();

Toute idée est appréciée.

Était-ce utile?

La solution

Ma première hypothèse serait l'événement que vous essayez de brancher en est un événement <frontend /> ou <admin />, parce qu'il ressemble à feu que des événements <global /> lorsque vous exécutez un script de ligne de commande.

Magento a ce concept appelé "zones". Les zones sont tri des applications comme individuelles qui vivent dans le système (mais pas tout à fait, je suis encore un peu floue sur le concept) .Lorsque vous configurez un config.xml avec vos observateurs, vous êtes soit en les plaçant dans un <global /> tag, une étiquette de <frontend />, ou une étiquette de <admin />.

En ce qui concerne les événements, Magento charge uniquement les zones qu'il hausse doit faire face à une demande particualr. Ainsi, la zone <global /> obtient toujours chargé. Cependant, les zones <frontend /> ou <admin /> se ne chargeaient si la demande arrive à l'envoi du contrôleur. Specifcally, dans le fichier suivant / ligne

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

Cela ne se produit jamais avec une application en ligne de commande. Seule la zone <global /> se charge.

Ainsi, comme mentionné dans le premier paragraphe, je suppose votre observateur ne se déclenche pas parce que Magento ne charge jamais la zone <frontend /> de l'application. Quant aux solutions, vous pouvez essayer de déplacer votre observateur à la zone <global />. Vous pouvez également essayer d'appeler manuellement

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

bien, vous seriez le chargement de tous les observateurs dans la zone <frontend />, dont beaucoup ont probablement été créés en supposant un contexte de navigateur Web.

Si rien de tout cela aide, jeter un oeil à la méthode dispatchEvent sur la classe Mage_Core_Model_App. C'est où les observateurs de l'événement s'appelle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top