2012-11-07 2 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 :이 방법을 사용하여 관찰자에서 내 컬렉션을 수정할 수 있습니까? Coz을 수정 한 후 내 관찰자에게서'return $ this'을 시도하면 컬렉션은 그대로 유지됩니다. 나는 제품 콜렉션을 가지고 일하고있다. 가능한 한 간단히 요약 할 수있다. – zamil

3

아니요,이 작업을 수행하기 위해 시스템에 내장 된 기능은 없습니다. Magento 규칙은 stdClass 또는 Varien_Object 전송 개체를 만드는 것입니다.

self::$_transportObject 이후

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

개체 인 블록 이벤트 코드를 살펴 및 PHP는 방식 등을 기준으로 동작 목적, 관찰자의 전송 오브젝트에 대한 변경은 유지 될 것이다. 따라서, 위의 예에서 경우 관찰자 개발자는 새로운 HTML을 포함됩니다 백업 시스템 블록 코드 self::$_transportObject에서

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

말했다. 옵저버는이 값을 변경할 수 있으며 Magento의 주문 관찰자는 구성된 시스템마다 다를 것임을 명심하십시오.

두 번째 방법은 Magento의 레지스트리 패턴을 사용하는 것입니다. dispatchEvent

관련 문제