Magento ऑब्जर्वर इवेंट्स - संचालन के आदेश


9

मैं catalog_model_product_duplicateघटना में कार्यक्षमता को इंजेक्ट करने का प्रयास कर रहा हूं । इस मॉड्यूल का एक हिस्सा यह सुनिश्चित करना होगा कि डुप्लिकेट उत्पाद की स्टॉक स्थिति को भी डुप्लिकेट किया गया है; वर्तमान में यह नहीं है।

मैं देखता हूं कि CatalogInventoryइस घटना का अवलोकन करता है और कुछ मानक स्टॉक जानकारी सेट करता है। क्या मुझे इस बात की गारंटी दी जा सकती है कि मेरे स्थानीय लोगों से पहले मुख्य घटनाओं को सुलझाया जाए? क्या यहां ऑपरेशन का कोई क्रम है जिस पर मैं भरोसा कर सकता हूं?

जवाबों:


11

जिस क्रम में घटनाओं को भेजा जाता है वह उस क्रम पर निर्भर करता है जिसमें मॉड्यूल लोड किए जाते हैं। चूँकि आपको यह सुनिश्चित करने की आवश्यकता है कि CatalogInventoryमॉड्यूल के पर्यवेक्षक आपके काम करने से पहले आग लगाते हैं, आपको जो करने की आवश्यकता है वह बस मॉड्यूल पर निर्भर करने के लिए अपने मॉड्यूल को कॉन्फ़िगर करें Mage_CatalogInventory। आप अपनी app/etc/modules/My_Module.xmlफ़ाइल में कोड पर निर्भर नोड को जोड़कर ऐसा कर सकते हैं :

<config>
    <modules>
        <My_Module>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_CatalogInventory />
            </depends>
        </My_Module>
    </modules>
</config>

dependsऊपर XML के नोड के रूप में यह पहले तुम्हारा करता है लोड करने के लिए Magento कोर मॉड्यूल मजबूर करता है, यहाँ विन्यास के महत्वपूर्ण टुकड़ा है।


7

जिस क्रम में ईवेंट भेजे जाते हैं, उसकी गारंटी आसानी से नहीं दी जा सकती। वे उस क्रम पर निर्भर होते हैं जिसमें मॉड्यूल लोड किए जाते हैं। आमतौर पर सभी मुख्य घटना पर्यवेक्षकों को समुदाय और स्थानीय कोड पूल पर्यवेक्षकों से पहले बुलाया जाएगा।

मैगेंटो पर्यवेक्षकों को एक स्थानीय या समुदाय एक के लिए एक मुख्य मॉड्यूल की निर्भरता "फेकिंग" द्वारा एक कस्टम के बाद आग लगाने के लिए मजबूर करने की एक विधि है। ली के जवाब पर एक नज़र डालें: मौजूदा Magento के पर्यवेक्षक से पहले एक कस्टम ऑब्ज़र्वर फायर करें

/app/etc/modules/Groupname_Page.xml

<config>
    <modules>
        <Groupname_Page>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <!-- Your dependencies go here -->
            </depends>
        </Groupname_Page>
        <Enterprise_PageCache>
            <depends>
                <Groupname_Page />
            </depends>
        </Enterprise_PageCache>
    </modules>
</config>

मैं व्यक्तिगत रूप से उस दृष्टिकोण को पसंद नहीं करता क्योंकि मुझे नहीं पता कि निर्भरता के लिए मजबूर करने के क्या परिणाम होंगे।

आपके उपयोग के मामले के लिए, यह लगता है कि आपको यह जानने के लिए डेटा / स्थिति का पता लगाना चाहिए कि उसे निकाल दिया गया था या नहीं। एक मॉडल पर एक डेटा / राज्य की जाँच एक घटना के आदेश को लागू करने की कोशिश करने से बेहतर होगा।


मेरे मामले में, हालांकि, मेरे पास कुछ भी नहीं है अगर स्टॉक आइटम अभी तक मौजूद नहीं है। बाद की घटना पर कोई विचार जो मैं यह देखने के लिए सूँघ सकता था कि क्या यह नकल पद्धति का परिणाम था?
२०

5

एक सामान्य उत्तर

पर्यवेक्षकों को क्षेत्र द्वारा पहले निष्पादित किया जाता है , फिर मॉड्यूल लोडिंग ऑर्डर द्वारा

इसका मतलब है, पंजीकृत सभी पर्यवेक्षकों को या में पंजीकृत सभी पर्यवेक्षकों से पहले<global> निष्पादित किया जाता है ।<frontend><adminhtml>

एक क्षेत्र के भीतर, पर्यवेक्षकों को मर्ज किए गए कॉन्फ़िगरेशन XML ट्री में दिखाई देने वाले क्रम में निष्पादित किया जाता है, जिसका अर्थ है कि तकनीकी रूप से क्रम में मॉड्यूल लोड किए गए हैं।

मॉड्यूल लोडिंग ऑर्डर निम्नानुसार निर्धारित किया जाता है:

  1. में एक <depends>परिभाषा ग्राफ बनाया गया है app/etc/modules/*.xml। यदि X Y पर निर्भर करता है, तो Y को X से पहले लोड किया जाता है।

  2. निर्भरता के आदेश के बाद, कोर मॉड्यूल समुदाय और स्थानीय मॉड्यूल पर पूर्वता है

  3. बाकी सब कुछ वर्णानुक्रम में लोड किया गया है। ध्यान दें कि फ़ाइल का नाम app/etc/modulesतुलना के लिए उपयोग किया जाता है, वास्तविक मॉड्यूल नाम नहीं।

इसलिए आपके पास मॉड्यूल लोडिंग ऑर्डर को प्रभावित करने के लिए दो विकल्प हैं:

  1. अपने पर्यवेक्षकों को इसके बाद निष्पादित करने के लिए किसी अन्य मॉड्यूल पर निर्भर करें (या दूसरे मॉड्यूल को आपके द्वारा पहले निष्पादित किए जाने के लिए आप पर निर्भर करें)
  2. मॉड्यूल परिभाषा फ़ाइल का नाम बदलें। आपको स्वयं मॉड्यूल का नाम बदलने की आवश्यकता नहीं है क्योंकि फ़ाइल नाम लोडिंग ऑर्डर के अलावा किसी और चीज के लिए मायने नहीं रखता है।

("3. अपने मॉड्यूल को कोर कोड पूल में जोड़ें" गिनती नहीं करता है)

यह सभी देखें:


1

बस एक सुझाव, दोनों को देखें catalog_model_product_duplicateऔर catalog_model_product_save_afterसिंगलटन प्रेक्षक के साथ। catalog_model_product_duplicateइन्वेंट्री डेटा को पर्यवेक्षक डेटा के रूप में सेट करें, और catalog_model_product_save_afterडुप्लिकेट किए गए उत्पाद के लिए इन्वेंट्री को पॉप्युलेट करने के लिए उस डेटा का उपयोग करें।


तो आप एक संपत्ति को उस वस्तु को सहेजने का सुझाव दे रहे हैं जो मुझे घटना में दिया गया था, फिर उस पर परीक्षण करना catalog_model_product_save_after... जो काम कर सकता था। केवल नुकसान बुलाए बिना संपत्ति को बनाए रखना होगा save()... कोई विचार?
फिलिंक करें

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