2012-01-22 4 views
3

J'ai un observateur personnalisé dans Magento 1.6.2.0 qui est appelé lorsqu'une page CMS est enregistrée ou supprimée (événements cms_page_delete_before/cms_page_save_before). J'ai vérifié (en utilisant le journal de Mage()) que l'observateur travaille, mais quand je les opérations suivantes:Accès au modèle via Varien_Event_Observer

public function getCmsUrl(Varien_Event_Observer $observer) 
{ 
    $url = $observer->getEvent()->getPage()->getIdentifier(); 
    return $url; 
} 

Je ne reçois rien retourné (plutôt que « à propos de nous » ou « enable-cookies » ou quel que soit le chemin d'URL de la page CMS). Le code suivant, cependant, fonctionne parfaitement bien:

public function getProductUrl(Varien_Event_Observer $observer) 
{ 
    $baseUrl = $observer->getEvent()->getProduct()->getBaseUrl(); 
    return $baseUrl; 
} 

Quelqu'un peut-il me faire savoir ce que la bonne façon d'accéder à une page CMS est en passe par un observateur?

Merci à l'avance pour toute aide/conseils/pointeurs :-)

Répondre

7

Les événements cms_page_delete_before et cms_page_save_before sont tirés en Mage_Core_Model_Abstract. Cela lui à quoi ça ressemble dans la fonction beforeSave:

Mage::dispatchEvent($this->_eventPrefix.'_save_before', $this->_getEventData()); 

Comme vous pouvez le voir, il utilise un _eventPrefix variable pour construire la clé de l'événement. Dans le modèle de page CMS, ce paramètre est défini sur cms_page.

Notez également la partie $this->_getEventData(). Voici comment le modèle, dans ce cas, la page CMS, est passé à l'observateur:

protected function _getEventData() 
{ 
    return array(
     'data_object'  => $this, 
     $this->_eventObject => $this, 
    ); 
} 

Comme vous pouvez le voir, l'objet a deux noms, data_object et un nom défini dans une variable, _eventObject. Dans le modèle de produit, le nom est product, mais dans le modèle de page CMS, la variable est manquante. Apparemment, l'équipe Magento a oublié de mettre cela dans, et par conséquent, le nom par défaut du modèle de base est utilisé:

protected $_eventObject = 'object'; 

Cela signifie que vous pouvez obtenir la page CMS dans votre observateur en utilisant getObject:

public function myObserver(Varien_Event_Observer $observer) 
{ 
    $page = $observer->getEvent()->getObject(); 
} 
+0

Merci pour votre aide! J'ai depuis appris à utiliser votre technique sur d'autres événements. J'ai aussi trouvé que get_class_methods() m'a aidé à comprendre ce qui se passe aussi. – james

Questions connexes