2012-03-17 15 views
8

इस घटना में checkout_cart_add_product_complete, मैं चाहता हूं कि ग्राहक को बाहरी वेब पेज http://www.example.com/ पर रीडायरेक्ट किया जाए। इस के लिए मैं इस कोड है, जो सब पर काम नहीं कर रहा उपयोग कर रहा हूँ: -Magento - पर्यवेक्षक विधि से ग्राहक को रीडायरेक्ट करें

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; 
} 

मैं इन दोनों चर "$response1" और "$response2" पर "setRedirect()" विधि का इस्तेमाल किया है, लेकिन उनमें से दोनों मुझे दिखाओ शॉपिंग कार्ट पेज, जबकि मैं इसके बजाय http://www.example.com/ देखना चाहता हूं।

मुझे क्या करना चाहते हैं:

  • मैं नियंत्रक कक्षा ओवरराइड करने के लिए, बस ग्राहक रीडायरेक्ट करने के लिए, जब मैं प्रभावी ढंग से घटना ऑब्जर्वर प्रक्रिया का उपयोग कर सकते नहीं करना चाहती।
  • मैं PHP इन-बिल्ट फ़ंक्शन "header()" का उपयोग नहीं करना चाहता, जब Magento फ्रेमवर्क इस कार्यक्षमता को एक कुशल तरीके से प्रदान करता है।

उत्तर

16

टीएल; डीआर: निचले हिस्से में सही पर्यवेक्षक कोड।

उत्तर देने से पहले एक नोट: सुनिश्चित करें कि पर्यवेक्षक ट्रिगर किया जा रहा है; अपने कोड के माध्यम से कदम या die('here'); का उपयोग करें। लिखे गए अनुसार, आपके उदाहरण विधि में ईवेंट पर्यवेक्षक डेटा (एक तर्क गुम होने) प्राप्त करने के लिए सही प्रोटोटाइप नहीं है।

रीडायरेक्ट तर्क के लिए एक ईवेंट पर्यवेक्षक का उपयोग करना इस संदर्भ में पूरी तरह से उपयुक्त है, जैसा मूल टीम द्वारा स्पष्ट रूप से पर्यवेक्षक को अनुरोध और प्रतिक्रिया वस्तुओं को पारित करने के द्वारा स्पष्ट किया गया है। आपका प्रयास अच्छा है, लेकिन मुझे लगता है कि आप की स्थिति और विन्यास जिसके कारण निष्पादन Mage_Checkout_CartController::_goBack() पर भेजने की है, विशेष रूप से लाइन

$this->_redirect('checkout/cart'); 

इसलिए हम अपने दृष्टिकोण को संशोधित करने की जरूरत है। अब, आप प्रतिक्रिया जोड़ तोड़ और नीचे बताया गया है के रूप में सामने नियंत्रक sendResponse() विधि को फोन करके अपने घटना पर्यवेक्षक के बाद प्रसंस्करण से किसी भी अनुरोध/प्रतिक्रिया तर्क रोका जा सकता है (nb ऐसा नहीं!):

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(); 
} 

यह काम करना चाहिए, लेकिन मुझे लगता है कि यह एक ईथरियल सिस्टम घटक (ईडीए) से आउटपुट ट्रिगर करके चिंता के क्षेत्रों को मिश्रित करता है। चलिए देखते हैं कि कमांड-कंट्रोल स्ट्रक्चर में कुछ है जो हम उपयोग कर सकते हैं ...

checkout_cart_add_product_complete ईवेंट निष्पादन कार्ट नियंत्रक की _goBack() विधि पर आता है। इस विधि नाम के साथ समस्या यह है कि यह तुलना में इसके नाम का तात्पर्य अधिक करता है:

/** 
* 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); 
    } 
    //... 
} 

ऐसा लगता है कि हम सिर्फ अनुरोध वस्तु पर एक return_url परम सेट और पूरा हम क्या जरूरत है सकते हैं।

public function moduleMethod(Varien_Event_Observer $observer) 
{ 
    $observer->getRequest()->setParam('return_url','http://www.google.com/'); 
} 

मैंने इसका परीक्षण किया है, और यह चाल चलनी चाहिए!

+0

बहुत धन्यवाद, इस उत्तर में आपके भयानक विवरण के लिए, जो पूरी तरह से काम कर रहे हैं! हां, मैंने विधि परिभाषा में तर्क का जिक्र करना याद कर दिया है, इसलिए मुझे सही करने के लिए धन्यवाद। यह महान होगा यदि आप ईडीए और Magento पर अपने पेशेवरों और विपक्ष पर अधिक कह सकते हैं, कृपया! –

+1

Magento में कई परतों को घुमाने वाला गहरा कॉल स्टैक है। अपने कार्यक्रम वास्तुकला के बिना, कई अनुकूलन निषिद्ध रूप से आक्रामक होगा और बहुत सारी कठोरता का कारण बन जाएगा। – benmarks

+0

बड़ी मदद, धन्यवाद !! –

2

मैं getFront के माध्यम से जाना था:

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

यदि आप "बेन" द्वारा दिए गए उत्तर को देखते हैं, तो आप देखेंगे कि उन्होंने प्रतिक्रिया '$-- getResponse() 'प्राप्त करने के लिए संदर्भ ऑब्जेक्ट (' $ this') का उपयोग किया था और '$ पर्यवेक्षक' ऑब्जेक्ट नहीं था। उम्मीद है कि यह मदद करता है। –

+0

हां, लेकिन उसका अंतिम समाधान (यानी, अनुरोध पर 'return_url' param' सेट करना) कुछ ऐसा करने के लिए काम नहीं करता था, और मेरा मानना ​​है कि यह अनजान है। कोड का यह बिट मुझे लगता है कि आपका कोड मूल रूप से करने का प्रयास कर रहा था। – Klaus

+0

हां, मेरी आवश्यकता एक बहुत विशिष्ट थी, इसलिए मेरा मानना ​​है कि "बेन" द्वारा प्रदान किया गया समाधान आपके लिए काम नहीं कर सकता है। मुझे पहले भ्रम के लिए खेद है। प्रतिक्रिया प्राप्त करने के लिए, क्या आप कृपया '$ पर्यवेक्षक-> getResponse() 'कोशिश कर सकते हैं? मैंने इसे अपने Magento स्थानीय में आजमाया, और यह मेरे लिए काम कर रहा है, '$ पर्यवेक्षक-> getEvent() -> getFront() -> getResponse() 'का उपयोग करने के बजाय। आशा करता हूँ की ये काम करेगा। –

1

आप _redirectUrl() विधि का उपयोग कर सकते हैं, यह Magento से बाहरी वेबसाइटों के लिए पुनः निर्देशित किया जाता है।

संबंधित मुद्दे