2011-03-13 44 views
13

के बाद कोड को संसाधित करने के लिए Magento कैसे बताते हैं मेरे पास चेकआउट में कुछ कोड है जहां मैंने सत्र में एक कुंजी सेट की है यदि चेक कुंजी में कहीं भी गलत है उन्हें वापस बिलिंग पृष्ठ पर भेजें। मेरे पास इसके लिए कोड है, लेकिन मेरे पास कोई भी कोड नहीं है जो आम तौर पर पर्यवेक्षक के बाद चलाया जाता है क्योंकि यह किसी तृतीय पक्ष सेवा को कॉल करेगा और इस कुंजी की वजह से गलत होगा क्योंकि सत्रएक पर्यवेक्षक विधि में, आप प्रेषित ईवेंट

में अनुपलब्ध है

यहां मेरा कोड है, मेरे पास सबकुछ है जो मुझे चाहिए लेकिन मुझे तत्काल होने की प्रतिक्रिया की आवश्यकता है और प्रेषित ईवेंट लाइन को निकालने के बाद कुछ भी नहीं, केवल प्रतिक्रिया को ब्राउज़र पर भेजा गया है।

public function checkForOrdKey(Varien_Event_Observer $observer) 
    { 
     $controllerAction = $observer->getControllerAction(); 
     $request = $controllerAction->getRequest(); 
     $controllerName = $request->getControllerName(); 
     $stepData = $this->_getCheckoutSession()->getStepData(); 
     $ordKeyRemoved = $this->_getCheckoutSession()->getOrdKeyRemoved(); 
     // if it is the checkout onepage controller or inventory controller don't do anything 
     if (isset($controllerName) && $controllerName === "onepage" && $stepData['shipping']['complete'] && $ordKeyRemoved) { 
      $this->_getCheckoutSession()->setStepData('shipping', 'complete', false); 
      $result['goto_section'] = 'billing'; 
      Mage::app()->getResponse()->setBody(Mage::helper('core')->jsonEncode($result)); 
      $this->_getCheckoutSession()->setOrdKeyRemoved(false); 

     } 
    } 

उत्तर

27

मूल रूप से आपको प्रतिक्रिया वस्तु का निर्माण और भेजने पर नियंत्रण रखना होगा। नियंत्रक का सामान्य प्रवाह सभी विधि के इनलाइन तर्क को संसाधित करेगा, इसकी घटनाओं को आग लगाएगा और प्रतिक्रिया के साथ जोड़ों को जोड़ देगा, फिर Magento ढांचे को अंतिम रूप दिया जाएगा और प्रतिक्रिया भेज दी जाएगी।

आप शॉर्ट सर्किट कि preDispatch घटना (controller_action_predispatch_checkout_onepage_savebilling) के लिए संलग्न और फिर क्रियान्वित करते हुए ऑब्जर्वर में प्रवाह इस कर सकते हैं:

$request = Mage::app()->getRequest(); 
$action = $request->getActionName(); 
Mage::app()->getFrontController()->getAction()->setFlag($action, Mage_Core_Controller_Varien_Action::FLAG_NO_DISPATCH, true); 

लाइनों के ऊपर हिदायत Mage_Core_Controller_Varien_Action (सभी नियंत्रकों के दादा-दादी) कार्रवाई बायपास करने के लिए जिसे कहा जाता है (सीई 1.4.2 में समीक्षा लाइन 414 यह देखने के लिए कि यह कैसे काम करता है)। फिर अपनी प्रतिक्रिया बनाने और ब्राउज़र पर वापस भेजने के साथ आगे बढ़ें। आप सही JSON प्रारूप की जांच के लिए चेकआउट जे एस कक्षाएं किसी भी त्रुटि संदेश प्रस्तुत करना है, लेकिन इन पंक्तियों के साथ कुछ करने के लिए

$response = Mage::app()->getResponse(); 
$response->setHttpResponseCode(500); //adjust to be whatever code is relevant 
$json = Mage::helper('core')->jsonEncode($this->__('Your message here')); //adjust 
$response->setBody($json); 
//don't need to sendResponse() as the framework will do this later 

और इस तरह आप Zend/Magento ढांचे के भीतर काम कर रहे हैं की आवश्यकता होगी ... आप CheckoutController को ओवरराइड करने की आवश्यकता नहीं है (कृपया, कभी भी ...) या "exit/die()" हैकनेस का उपयोग करें। बाहर निकलने/मरने का कारण यह है कि यह किसी भी बाद के पर्यवेक्षकों को रोकता है जिन्होंने उस कार्यक्रम में रुचि रखने के लिए कार्य किया है। एक डेवलपर के रूप में एक पर्यवेक्षक को पंजीकृत करने के लिए यह बेहद निराशाजनक होगा, जिसे कभी भी बुलाया नहीं जाता क्योंकि एक और डेवलपर आपको हिट करने से पहले बाहर निकल गया है !!

ध्यान दें कि no-dispatch ध्वज सेट करना केवल काम करेगा यदि आप प्रीइस्पैच ईवेंट में शामिल हैं।

अधिक जानकारी के लिए, प्रवाह के लेआउट/ब्लॉक/टेम्पलेट अनुभागों को कैसे बाईपास कर रहे हैं, यह देखने के लिए Magento sequence diagram की समीक्षा करें।

+0

हम्म यह अभी भी प्रतिक्रिया भेजने के बाद भी शेष कोड निष्पादित करने का प्रयास कर रहा है। –

+0

ईच, शायद आपको 'sendReponse()' –

+0

के बाद 'निकास() 'की आवश्यकता है, इस पर बाहर निकलने के बाद यह काम किया, यह ऐसा करने में इतना बुरा क्यों है? –

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