Magento Observer Events - ลำดับของการปฏิบัติการ


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

ไม่สามารถรับประกันคำสั่งที่ส่งเหตุการณ์ได้อย่างง่ายดาย พวกมันขึ้นอยู่กับลำดับที่โหลดโมดูล โดยทั่วไปผู้สังเกตการณ์เหตุการณ์หลักทั้งหมดจะถูกเรียกก่อนผู้สังเกตการณ์ชุมชนและรหัสโลคัล

มีวิธีการบังคับผู้สังเกตการณ์วีโอไอพีที่จะยิงหลังจากที่กำหนดเองโดย "แกล้ง" การพึ่งพาของโมดูลหลักเพื่อท้องถิ่นหรือชุมชนหนึ่ง มีลักษณะที่จะตอบของลีที่นี่: ทำให้ไฟสังเกตการณ์ที่กำหนดเองก่อนที่วีโอไอพีสังเกตการณ์ที่มีอยู่

/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>

โดยส่วนตัวแล้วฉันไม่ชอบวิธีการนี้เนื่องจากฉันไม่รู้ว่าจะมีผลกระทบอะไรที่จะทำให้การพึ่งพานั้นเกิดขึ้น

สำหรับกรณีการใช้งานของคุณดูเหมือนว่าคุณควรทำการตรวจจับข้อมูล / สถานะบางอย่างเพื่อให้ทราบว่ามีการใช้งานหรือไม่ การตรวจสอบข้อมูล / สถานะของแบบจำลองจะดีกว่าการพยายามบังคับให้ลำดับเหตุการณ์


อย่างไรก็ตามในกรณีของฉันฉันไม่มีอะไรต้องทำหากยังไม่มีรายการสต็อค มีความคิดเห็นเกี่ยวกับเหตุการณ์ในภายหลังที่ฉันสามารถดมกลิ่นเพื่อดูว่าเป็นผลมาจากวิธีการที่ซ้ำกันหรือไม่?
philwinkle

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()... ความคิดใด ๆ ที่นั่น?
philwinkle

คุณจะบันทึกรูปแบบสินค้าคงคลังไม่ใช่ผลิตภัณฑ์ดังนั้นคุณจึงไม่ควรถูกวนซ้ำ
Petar Dzhambazov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.