निर्धारित करें कि क्या ग्राहक customer_save_after में नया है


9

मेरे पास ऐसी घटनाएँ हैं जिन्हें मैं तब लागू करना चाहता हूँ जब कोई ग्राहक पंजीकरण करता है या उनका विवरण बचाता है। इसके लिए, मैं दो घटनाओं का उपयोग कर रहा हूं: customer_register_success और customer_save_after। मेरे पास जो समस्या है वह यह है कि मैं दो बार कार्य चलाने को समाप्त करता हूं क्योंकि customer_save_after को हमेशा उसी निष्पादन में कहा जाता है customer_register_success

मैंने यह पता लगाने की कोशिश की है कि ग्राहक मूल डेटा की जाँच करके नया है isObjectNewया नहीं, लेकिन दोनों रिटर्न डेटा का तात्पर्य है कि वस्तु वास्तव में नई नहीं है। मैं यह देखने के लिए कैसे जांच कर सकता हूं कि क्या ग्राहक सिर्फ customer_save_after में पंजीकरण कर रहा है घटना में रजिस्ट्री में कुछ सेट करने की कमी है customer_register_success?

जवाबों:


5

सबसे पहले आप दोनों घटनाओं के लिए अपने पर्यवेक्षक को सिंगलटन के रूप में परिभाषित कर सकते हैं

<global>
    <events>
        <customer_save_after>
            <observers>
                <namespace_module>
                    <type>singleton</type>
                    <class>namespace_module/observer</class>
                    <method>doSomething</method>
                </namespace_module>
            </observers>
        </customer_save_after>
        <customer_register_success>
            <observers>
                <namespace_module>
                    <type>singleton</type>
                    <class>namespace_module/observer</class>
                    <method>doSomething</method>
                </namespace_module>
            </observers>
        </customer_register_success>
    </events>
</global>

इस स्थिति में दोनों घटनाओं के लिए एक ही प्रेक्षक वस्तु का उपयोग किया जाएगा। तो आप अपने पर्यवेक्षक में झंडा बना सकते हैं और कुछ कार्यों को करने से पहले इसकी जाँच करें।

class [Namespace]_[Module]_Model_Observer
{
    protected $canDoSomething = false;

    public function doSomething($observer)
    {
        if (!$this->canDoSomething) {

            //here your code

            //now set flag to true to prevent executing your code twice 
            $this->canDoSomething = true;
        }
    }
}

अब आपका कोड केवल एक बार निष्पादित किया जाएगा।


0

इसे रोकने के लिए सबसे आसान तरीका एक रजिस्ट्री मान का उपयोग करना है। आपकी प्रेक्षक विधि कुछ इस तरह दिखेगी

class [Namespace]_[Module]_Model_Observer
{
   public function triggeredObserver($observer)
   {
      if (!empty(Mage::registry('[module]_istriggered')) return $this;

      // here you can perform whatever you want to do with your code

      Mage::register('[module]_istriggered', 1);
   }
}

पहली बार विधि कहा जाता है यह एक कुंजी दर्ज करता है, जिसका अर्थ है कि दूसरी बार ट्रिगर होने के बाद यह अब खाली नहीं है और विधि शुरू में वापस आ जाएगी


हाँ, मैंने इस बारे में सोचा था, लेकिन यह काफी गंदा लगता है :( मुझे आश्चर्य है कि मुझे पता नहीं चल सकता है कि क्या कोई वस्तु अभी एक model_save_after घटना में बनाई गई है
मैथ्यू हावर्थ

केवल एक beforeघटना में isObjectNewडेटा है जहाँ तक मुझे पता है क्योंकि डेटा अभी तक सहेजा नहीं गया है। जहां तक ​​गंदा जाता है, मुझे लगता है कि अधिक सुरुचिपूर्ण तरीके होंगे लेकिन यह निश्चित रूप से हैक नहीं है
सैंडर मैंगेल

$customer->save(); $this->_dispatchRegisterSuccess($customer);दुर्भाग्य से यहां, रजिस्टर इवेंट शुरू होने से पहले ग्राहक बच जाता है, इसलिए प्रेक्षक विधि वैसे भी काम नहीं करेगी :(
मैथ्यू हावरथ

0

एक अन्य दृष्टिकोण यह जांचना है कि किस नियंत्रक और कार्रवाई ने घटना को ट्रिगर किया।

पर्यवेक्षक में आप मॉड्यूल, नियंत्रक और कार्रवाई नाम प्राप्त कर सकते हैं।

$frontName = Mage::app()->getRequest()->getRouteName();
$controllerName = Mage::app()->getRequest()->getControllerName();
$actionName = Mage::app()->getRequest()->getActionName();

$myURI = $frontName . '_'. $controllerName . '_' . $actionName;

और बाद में अपने तरीके से जांचें कि कौन घटना को भेज रहा है।

स्टॉक मैगनेटो में, उपयोगकर्ता क्षेत्र से उपयोगकर्ता बनाते समय $ myURI का मूल्य होगा customer_account_createpost

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.