2012-11-07 10 views
8

में ईवेंट पर्यवेक्षक से प्रेषक को डेटा वापस लौटाएं मेरे पास उत्पाद पंजीकरण के लिए एक एक्सटेंशन है जो पंजीकरण सहेजने के बाद किसी ईवेंट को प्रेषित करता है। एक और एक्सटेंशन वर्चुअल उत्पाद के लिए कूपन उत्पन्न करने के लिए उस ईवेंट का उपयोग करता है यदि यह पंजीकृत उत्पाद से संबंधित है।Magento

मुझे अपने उत्पाद पंजीकरण के विवरण के साथ उपयोगकर्ता को ईमेल में भेजने के लिए जेनरेट किए गए कूपन पर डेटा वापस लेने की आवश्यकता है।

क्या पर्यवेक्षक से डेटा वापस भेजने के लिए कोई तरीका है जहां ईवेंट भेजा जाता है?

उत्तर

24

आपके उद्देश्य के लिए Magento में एक चाल उपलब्ध है। चूंकि आप उत्पाद या श्रेणी मॉडल जैसे पर्यवेक्षकों को इवेंट डेटा पास कर सकते हैं, इसलिए यह एक कंटेनर बनाना भी संभव है जिससे आप यह डेटा प्राप्त कर सकें।

उदाहरण के लिए इस तरह के कार्यों डिस्पैचर में प्रदर्शन किया जा सकता है:

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

और एक पर्यवेक्षक विधि निम्नलिखित की तरह लग सकता है:

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

का आनंद लें और मजा!

+0

उत्कृष्ट से पहले एक चर पंजीकृत करें। धन्यवाद। – Ryan

+1

@Ivan: क्या मैं पर्यवेक्षक में अपने संग्रह को संशोधित करने के लिए इस दृष्टिकोण का उपयोग कर सकता हूं। संग्रह को संशोधित करने के बाद कोज़ और मेरे पर्यवेक्षक से '$ $ को वापस करने का प्रयास करें, संग्रह वही शेष है। मैं उत्पाद संग्रह के साथ काम कर रहा हूं। यदि संभव हो तो आप इसे संक्षिप्त कर सकते हैं – zamil

3

नहीं, ऐसा करने के लिए सिस्टम में कुछ भी नहीं बनाया गया है। Magento सम्मेलन stdClass या Varien_Object परिवहन वस्तु बनाना है।

ब्लॉक घटना कोड

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

self::$_transportObject के बाद से एक वस्तु है पर एक नजर डालें, और PHP वस्तुओं तरीके की तरह एक संदर्भ से व्यवहार करते हैं, एक पर्यवेक्षक में परिवहन वस्तु में किए गए बदलाव बनाए रखा जाएगा। तो, ऊपर के उदाहरण में, अगर एक पर्यवेक्षक डेवलपर

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

कहा वापस प्रणाली ब्लॉक कोड self::$_transportObject में नए HTML होते हैं। ध्यान रखें कि एकाधिक पर्यवेक्षकों को इस मान को बदलने का मौका मिलेगा, और Magento में ऑर्डर पर्यवेक्षक आग प्रत्येक कॉन्फ़िगरेशन सिस्टम के लिए अलग होंगे।

Magento के रजिस्ट्री पैटर्न का उपयोग करने के लिए आप एक दूसरा दृष्टिकोण ले सकते हैं। dispatchEvent