2012-03-17 30 views
8

Trong sự kiện này checkout_cart_add_product_complete, tôi muốn khách hàng được chuyển hướng đến trang web bên ngoài http://www.example.com/. Đối với điều này tôi đang sử dụng mã này, mà không làm việc tại tất cả: -Magento - Chuyển hướng Khách hàng từ Phương thức Quan sát

public function moduleMethod() { 
    /* @var $response1 Mage_Core_Controller_Response_Http */ 
    $response1 = $observer->getEvent()->getResponse(); 

    /* @var $response2 Mage_Core_Controller_Response_Http */ 
    $response2 = Mage::app()->getResponse(); 

    $url = 'http://www.example.com/'; 
    $response1->setRedirect($url); 

    return; 
} 

Tôi đã sử dụng phương pháp "setRedirect()" trên cả hai biến "$response1" và "$response2", nhưng cả hai trong số họ cho tôi xem Trang giỏ hàng, trong khi tôi muốn xem trang này http://www.example.com/ thay thế.

Những gì tôi muốn:

  • Tôi không muốn ghi đè lên các lớp điều khiển, chỉ để chuyển hướng các khách hàng, khi tôi có hiệu quả có thể sử dụng quá trình tổ chức sự kiện Observer.
  • Tôi không muốn sử dụng hàm dựng sẵn PHP "header()", khi khung công tác Magento cung cấp chức năng này một cách hiệu quả.

Trả lời

16

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!

+0

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! –

+1

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

+0

Trợ giúp lớn, cảm ơn !! –

2

Tôi đã phải trải qua getFront:

public function moduleMethod($observer) { 
    $observer->getEvent()->getFront()->getResponse()->setRedirect('http://www.google.com'); 
} 
+0

Nếu bạn thấy câu trả lời được đưa ra bởi "Ben", bạn sẽ thấy rằng ông đã sử dụng đối tượng bối cảnh ('$ this') để nhận Phản hồi' $ this-> getResponse() 'chứ không phải đối tượng' $ observer'. Hy vọng điều đó sẽ hữu ích. –

+0

Có, nhưng giải pháp cuối cùng của anh ta (tức là, đặt tham số 'return_url' theo yêu cầu) không hoạt động đối với thứ tôi đang làm và tôi tin là không trực quan. Mã bit này làm những gì tôi tin rằng mã của bạn ban đầu đang cố gắng làm. – Klaus

+0

Vâng, yêu cầu của tôi là một yêu cầu rất cụ thể, vì vậy tôi tin rằng giải pháp được cung cấp bởi "Ben" có thể không phù hợp với bạn. Tôi xin lỗi vì sự nhầm lẫn trước đó. Ngoài ra để nhận được Phản hồi, bạn có thể thử '$ observer-> getResponse()' không? Tôi đã thử nó trong Magento địa phương của tôi, và nó làm việc cho tôi, thay vì sử dụng '$ observer-> getEvent() -> getFront() -> getResponse()'. Hy vọng nó giúp. –

1

Bạn có thể sử dụng phương pháp _redirectUrl(), nó được sử dụng cho chuyển hướng đến các trang web bên ngoài từ Magento.

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