tl; dr: Mã người quan sát chính xác ở dưới cùng.
Lưu ý trước khi trả lời: Đảm bảo rằng người quan sát đang được kích hoạt; bước qua mã của bạn hoặc sử dụng die('here');
. Như được viết, phương pháp ví dụ của bạn không có mẫu thử nghiệm chính xác để nhận dữ liệu quan sát sự kiện (thiếu một đối số).
Sử dụng trình quan sát sự kiện cho logic chuyển hướng hoàn toàn thích hợp trong ngữ cảnh này, như được nhóm lõi đưa ra một cách rõ ràng truyền yêu cầu và đối tượng phản hồi cho người quan sát. nỗ lực của bạn là tốt, nhưng tôi nghĩ rằng bạn có điều kiện và cấu hình gây thực hiện để chảy vào Mage_Checkout_CartController::_goBack()
, đặc biệt vào dòng
$this->_redirect('checkout/cart');
Vì vậy, chúng ta cần phải xem xét lại cách tiếp cận của chúng tôi. Bây giờ, bạn có thể ngăn chặn bất kỳ logic request/response từ chế biến sau khi quan sát sự kiện của bạn bằng cách thao tác các phản ứng và gọi phương thức sendResponse()
Controller của Mặt trận như chứng minh dưới đây (nb: không làm điều này!):
public function moduleMethod($observer) //note I added a param
{
/* @var $response1 Mage_Core_Controller_Response_Http */
$response1 = $observer->getResponse(); // observers have event args
$url = 'http://www.example.com/';
$response1->setRedirect($url);
/* SHOULDN'T DO THIS */
Mage::app()->getFrontController()->sendResponse();
}
Điều này sẽ làm việc, nhưng tôi nghĩ rằng nó trộn lên các lĩnh vực quan tâm bằng cách kích hoạt đầu ra từ một thành phần hệ thống ethereal (EDA). Hãy xem nếu có gì đó trong cấu trúc điều khiển lệnh mà chúng ta có thể sử dụng ...
Chỉ sau khi thực hiện sự kiện checkout_cart_add_product_complete
xảy ra với phương thức _goBack() của bộ điều khiển giỏ hàng. Vấn đề với tên phương pháp này là nó nhiều hơn tên gọi của nó:
/**
* Set back redirect url to response
*
* @return Mage_Checkout_CartController
*/
protected function _goBack()
{
$returnUrl = $this->getRequest()->getParam('return_url');
if ($returnUrl) {
// clear layout messages in case of external url redirect
if ($this->_isUrlInternal($returnUrl)) {
$this->_getSession()->getMessages(true);
}
$this->getResponse()->setRedirect($returnUrl);
}
//...
}
Dường như chúng ta chỉ có thể thiết lập một param return_url
trên đối tượng yêu cầu và thực hiện những gì chúng ta cần.
public function moduleMethod(Varien_Event_Observer $observer)
{
$observer->getRequest()->setParam('return_url','http://www.google.com/');
}
Tôi đã thử nghiệm điều này và cần thực hiện thủ thuật!
Cảm ơn rất nhiều, vì chi tiết khủng khiếp của bạn trong câu trả lời này, điều này hoàn toàn hoạt động! Có, tôi đã bỏ lỡ đề cập đến các đối số trong định nghĩa phương pháp, vì vậy cảm ơn cho sửa chữa tôi ra ngoài. Nó sẽ là tuyệt vời nếu bạn có thể nói nhiều hơn về EDA và ưu và khuyết điểm của nó trên Magento, xin vui lòng! –
Magento có một ngăn xếp cuộc gọi sâu đi qua nhiều lớp. Nếu không có kiến trúc sự kiện của nó, nhiều tùy chỉnh sẽ bị xâm lấn nghiêm trọng và dẫn đến rất nhiều lỗi. – benmarks
Trợ giúp lớn, cảm ơn !! –