2012-11-07 11 views
8

Ho un'estensione per la registrazione del prodotto che invia un evento dopo che la registrazione è stata salvata. Un'altra estensione utilizza quell'evento per generare un coupon per un prodotto virtuale se è correlato al prodotto registrato.Restituisce i dati al dispatcher dall'osservatore degli eventi in Magento

Ho bisogno di recuperare i dati sul coupon generato da inviare all'utente in un'email insieme ai dettagli della registrazione del prodotto.

Esiste un modo per restituire i dati dall'osservatore al punto in cui è stato inviato l'evento?

risposta

24

C'è un trucco disponibile in Magento per il vostro scopo. Poiché è possibile passare i dati degli eventi agli osservatori, come il modello di prodotto o di categoria, è anche possibile creare un contenitore dal quale è possibile ottenere questi dati.

Per esempio tali azioni possono essere eseguite in dispatcher:

$couponContainer = new Varien_Object(); 
Mage::dispatchEvent('event_name', array('coupon_container' => $couponContainer)); 
if ($couponContainer->getCode()) { 
    // If some data was set by observer... 
} 

E un metodo osservatore può essere simile al seguente:

public function observerName(Varien_Event_Observer $observer) 
{ 
    $couponContainer = $observer->getEvent()->getCouponContainer(); 
    $couponContainer->setCode('some_coupon_code'); 
} 

Divertimento e buon divertimento!

+0

Eccellente. Grazie. – Ryan

+1

@Ivan: Posso usare questo approccio per modificare la mia collezione in un osservatore. Dopo aver modificato la collezione e aver provato a restituire $ this' dal mio osservatore, la raccolta rimane invariata. Sto lavorando con la raccolta dei prodotti. Se possibile, puoi dargli una risposta – zamil

3

No, non c'è nulla di integrato nel sistema per fare ciò. La convenzione Magento consiste nel creare un oggetto di trasporto stdClass o Varien_Object.

Date un'occhiata al codice di evento blocco

#File: app/code/core/Mage/Core/Block/Abstract.php 

... 
if (self::$_transportObject === null) 
{ 
    self::$_transportObject = new Varien_Object; 
} 

self::$_transportObject->setHtml($html); 
Mage::dispatchEvent('core_block_abstract_to_html_after', 
    array('block' => $this, 'transport' => self::$_transportObject)); 
$html = self::$_transportObject->getHtml(); 
... 

Da self::$_transportObject è un oggetto, e PHP oggetti comportarsi in maniera simile riferimento, saranno mantenute tutte le modifiche apportate all'oggetto trasporto in un osservatore. Così, nell'esempio di cui sopra, se uno sviluppatore osservatore ha detto

$html = $observer->getTransport()-setHtml('<p>New Block HTML'); 

Eseguire il backup del codice di blocco di sistema self::$_transportObject conterrebbe il nuovo HTML. Tieni presente che gli spettatori multipli avranno la possibilità di modificare questo valore e che gli osservatori degli ordini attivati ​​in Magento saranno diversi per ogni sistema configurato.

Un secondo approccio che è possibile utilizzare è utilizzare il modello di registro di Magento. Registrare una variabile prima dello dispatchEvent

Problemi correlati