2012-11-06 17 views
10

रीडायरेक्ट के बाद संदेश खोने वाले Magento मुझे Magento संदेशों में समस्या है। मैं कस्टम मॉड्यूल का निर्माण कर रहा हूं जो सिद्धांत में स्टोर के कुछ हिस्सों तक पहुंच प्रतिबंधित करने में सक्षम होना चाहिए। मैंने एक पर्यवेक्षक बनाया है जो controller_action_predispatch ईवेंट में हुक करता है और जांच करता है कि उपयोगकर्ता द्वारा वर्तमान अनुरोध का उपयोग किया जा सकता है या नहीं। यदि कार्रवाई को एक्सेस नहीं किया जा सकता है तो पर्यवेक्षक उपयोगकर्ता को रीडायरेक्ट करता है और त्रुटि जानकारी सेट करता है। मैं संपूर्ण दुकान के माध्यम से क्लिक करने से बचने के लिए ग्राहक से आने वाले पेज पर रीडायरेक्ट यूआरएल सेट करना चाहता हूं। मैं HTTP_REFERER पर देख रहा हूं और इसे सेट करने पर इसका उपयोग करता हूं, अन्यथा मैं ग्राहक को होमपेज पर रीडायरेक्ट करता हूं। समस्या यह है कि बाद के मामले में (होमपेज रीडायरेक्ट) सबकुछ बढ़िया काम करता है लेकिन जब मैं रेफरर के आधार पर यूआरएल सेट करता हूं तो मुझे संदेश बॉक्स में त्रुटि संदेश नहीं दिखाई देता है।रीडायरेक्ट

पर्यवेक्षक से कोड ($name चर एक स्ट्रिंग है):

Mage::getSingleton('core/session')->addError('Acces to '.$name.' section is denied'); 
$url = Mage::helper('core/http')->getHttpReferer() ? Mage::helper('core/http')->getHttpReferer() : Mage::getUrl(); 
Mage::app()->getResponse()->setRedirect($url); 

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

मैं सोच रहा था कि इस समस्या पूर्ण यूआरएल में है और अपने स्थानीय instalation (मैं .local डोमेन का उपयोग कर रहा है), लेकिन तो मैं

$url = str_replace(Mage::getBaseUrl(), '/', $url); 

जोड़ने की कोशिश की, लेकिन यह मदद नहीं की थी।

मैंने बिना किसी परिणाम के php header() फ़ंक्शन का उपयोग करके रीडायरेक्ट करने का भी प्रयास किया।

सभी कैश अक्षम हैं।

  1. मैं (इस खाते के लिए गाड़ी अक्षम है) किसी भी सुलभ पेज लिए जा रहा हूँ (उदाहरण के/ग्राहक/खाते के लिए) गाड़ी लिंक पर
  2. क्लिक करें
  3. : कार्यप्रवाह जो समस्या से चलाता है इस प्रकार है/ग्राहक/खाते पर वापस लौटें और त्रुटि संदेश फिर से
  4. /ग्राहक/खाता है, लेकिन कोई त्रुटि संदेश पर लौटें प्रदर्शित किया जाता है गाड़ी लिंक पर
  5. क्लिक करें

कहां देखना है इस पर कोई संकेत की सराहना की जाएगी।

+0

क्या आप कैश समस्या होने पर यह देखने के लिए अपने सभी कैश (+ एफपीसी अगर Magento ईई) को निष्क्रिय कर सकते हैं? वैसे, मैं आपकी सभी व्याख्याओं को समझ नहीं पाया, आप समझ गए कि पहले प्रदर्शन के बाद सत्र त्रुटि संदेश हटा दिए गए हैं? –

+0

मैंने विवरण का विस्तार किया, उम्मीद है कि यह अभी स्पष्ट है। – Zefiryn

उत्तर

4

आपका संदेशों क्योंकि खो जाना आप controller_action_predispatch में रीडायरेक्ट के लिए एक प्रतिकूल तरीके से उपयोग करते हैं। आपका समाधान एक तरफ "संदेश खो गया" और दूसरी ओर, आपके सर्वर की प्रसंस्करण शक्ति को बर्बाद कर देता है।

जब आप Mage_Core_Controller_Varien_Action::dispatch() पर एक नज़र डालेंगे, तो आप देखेंगे कि आपका समाधान वर्तमान क्रिया के निष्पादन को रोकता नहीं है, लेकिन इसे रीडायरेक्ट के साथ करना चाहिए। इसके बजाए Magento ने आपके द्वारा पहले जोड़े गए संदेश को प्रस्तुत करने सहित वर्तमान कार्रवाई को अपने अंत तक निष्पादित किया है। तो कोई आश्चर्य नहीं कि अगले ग्राहक अनुरोध के साथ संदेश क्यों खो जाता है, Magento पहले से ही सर्वर प्रतिक्रिया के साथ पहले से ही प्रस्तुत किया गया था जिसमें आपका रीडायरेक्ट शामिल है।

आगे आप Mage_Core_Controller_Varien_Action::dispatch() में वर्तमान कार्रवाई के निष्पादन को रोकने के लिए केवल एक संभावना देखेंगे और सीधे 4279 catch (Mage_Core_Controller_Varien_Exception $e) [...] में रीडायरेक्ट पर छोड़ दें। तो आपको Mage_Core_Controller_Varien_Exception का उपयोग करना होगा जो काफी अलोकप्रिय है, लेकिन आपके उद्देश्य के लिए एकमात्र सही समाधान है। एकमात्र समस्या यह है कि इस वर्ग में एक बग है क्योंकि इसे Magento 1.3.2 में पेश किया गया था। लेकिन यह आसानी से तय किया जा सकता है।

बस अपने ही वर्ग जो Mage_Core_Controller_Varien_Exception से प्राप्त होता है बनाने के लिए:

/** 
* Controller exception that can fork different actions, 
* cause forward or redirect 
*/ 
class Your_Module_Controller_Varien_Exception 
    extends Mage_Core_Controller_Varien_Exception 
{ 
    /** 
    * Bugfix 
    * 
    * @see Mage_Core_Controller_Varien_Exception::prepareRedirect() 
    */ 
    public function prepareRedirect($path, $arguments = array()) 
    { 
     $this->_resultCallback = self::RESULT_REDIRECT; 
     $this->_resultCallbackParams = array($path, $arguments); 
     return $this; 
    } 
} 

तो अब आप अपने समाधान वास्तव में उस के साथ स्वच्छ लागू कर सकते हैं:

/** 
* Your observer 
*/ 
class Your_Module_Model_Observer 
{ 
    /** 
    * Called before frontend action dispatch 
    * (controller_action_predispatch) 
    * 
    * @param Varien_Event_Observer $observer 
    */ 
    public function onFrontendActionDispatch($observer) 
    { 
     // [...] 

     /* @var $action Mage_Core_Model_Session */ 
     $session = Mage::getSingleton('core/session'); 
     /* @var $helper Mage_Core_Helper_Http */ 
     $helper = Mage::helper('core/http'); 
     // puts your message in the session 
     $session->addError('Your message'); 
     // prepares the redirect url 
     $params = array(); 
     $params['_direct'] = $helper->getHttpReferer() 
      ? $helper->getHttpReferer() : Mage::getHomeUrl(); 
     // force the redirect 
     $exception = new Your_Module_Controller_Varien_Exception(); 
     $exception->prepareRedirect('', $params); 
     throw $exception; 
    } 
} 
24
//A Success Message 
Mage::getSingleton('core/session')->addSuccess("Some success message"); 

//A Error Message 
Mage::getSingleton('core/session')->addError("Some error message"); 

//A Info Message (See link below) 
Mage::getSingleton('core/session')->addNotice("This is just a FYI message..."); 

//These lines are required to get it to work 
session_write_close(); //THIS LINE IS VERY IMPORTANT! 
$this->_redirect('module/controller/action'); 

// or 
$url = 'path/to/your/page'; 
$this->_redirectUrl($url); 

यह एक नियंत्रक में काम करेंगे, लेकिन अगर आप के बाद उत्पादन पहले से ही भेज दिया गया है रीडायरेक्ट करने के लिए कोशिश कर रहे हैं, तो आप केवल ऐसा कर सकते हैं जावास्क्रिप्ट के माध्यम से:

<script language=”javascript” type=”text/javascript”> 
window.location.href=”module/controller/action/getparam1/value1/etc"; 
</script>  
+7

धन्यवाद, session_write_close(); मेरे लिए चाल है। Session_write_close() के लिए –

+0

+1, हमेशा के लिए अटक गया था! धन्यवाद –

0

इस काम करेंगे, तो यह प्रयास करें:

$url = 'path/to/your/page'; 
$this->_redirectUrl($url); 
return false; 

इसका मतलब है कि आप किसी और को निष्पादित करने की अनुमति नहीं दे रहे हैं।

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