2012-11-07 29 views
8

Tôi có tiện ích mở rộng đăng ký sản phẩm gửi một sự kiện sau khi đăng ký được lưu. Tiện ích mở rộng khác sử dụng sự kiện đó để tạo phiếu thưởng cho sản phẩm ảo nếu sản phẩm đó có liên quan đến sản phẩm đã đăng ký.Trả lại dữ liệu cho người điều phối từ người quan sát sự kiện trong Magento

Tôi cần lấy lại dữ liệu về phiếu thưởng được tạo để gửi cho người dùng trong email cùng với chi tiết đăng ký sản phẩm của họ.

Có cách nào để trả lại dữ liệu từ người quan sát về nơi diễn ra sự kiện không?

Trả lời

24

Có một mẹo có sẵn trong Magento cho mục đích của bạn. Vì bạn có thể chuyển dữ liệu sự kiện cho người quan sát, như mô hình sản phẩm hoặc danh mục, bạn cũng có thể tạo vùng chứa mà từ đó bạn có thể lấy dữ liệu này.

Ví dụ hành động như vậy có thể được thực hiện trong điều phối:

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

Và một phương pháp quan sát có thể trông giống như sau:

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

Thưởng thức và vui chơi!

+0

Tuyệt vời. Cảm ơn. – Ryan

+1

@Ivan: Tôi có thể sử dụng phương pháp này để sửa đổi bộ sưu tập của mình trong một người quan sát không. Coz sau khi sửa đổi bộ sưu tập và cố gắng 'trả $ this' từ người quan sát của tôi, bộ sưu tập vẫn giữ nguyên. Tôi đang làm việc với bộ sưu tập sản phẩm. Nếu có thể, bạn có thể tóm tắt nó – zamil

3

Không, không có gì được tích hợp sẵn trong hệ thống để thực hiện việc này. Quy ước Magento là tạo đối tượng vận chuyển stdClass hoặc Varien_Object.

Hãy nhìn vào mã sự kiện khối

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

Kể từ self::$_transportObject là một đối tượng, và PHP đối tượng cư xử theo một tài liệu tham khảo như cách, bất kỳ thay đổi nào đối tượng vận chuyển trong một quan sát viên sẽ được duy trì. Vì vậy, trong ví dụ trên, nếu một nhà phát triển quan sát viên nói

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

Sao lưu trong hệ thống mã khối self::$_transportObject sẽ chứa mã HTML mới. Hãy nhớ rằng nhiều người quan sát sẽ có cơ hội thay đổi giá trị này và các trình theo dõi đơn đặt hàng kích hoạt trong Magento sẽ khác nhau đối với mỗi hệ thống được định cấu hình.

Cách tiếp cận thứ hai bạn có thể thực hiện là sử dụng mẫu đăng ký của Magento. Đăng ký biến trước dispatchEvent

Các vấn đề liên quan