Magento Observer Events - işlem sırası


9

catalog_model_product_duplicateEtkinliğe işlev enjekte etmeye çalışıyorum . Bu modülün bir kısmı, çoğaltılan ürünün stok durumunun da çoğaltılmasını sağlamak olacaktır; şu anda değil.

CatalogInventoryBu olayı gözlemlediğini ve bazı standart stok bilgilerini ayarladığını görüyorum . Temel olayların yerlilerimden önce çözüldüğünden emin olabilir miyim? Burada güvenebileceğim herhangi bir işlem sırası var mı?

Yanıtlar:


11

Olayların gönderilme sırası, modüllerin yüklenme sırasına bağlıdır. Sizden CatalogInventoryönce modülün gözlemcilerinin ateş ettiğinden emin olmanız gerektiğinden, yapmanız gereken sadece modülünüzü modüle bağlı olacak şekilde yapılandırmaktır Mage_CatalogInventory. Bunu, app/etc/modules/My_Module.xmldosyanızdaki koda bağımlı bir düğüm ekleyerek yapabilirsiniz :

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

Yukarıdaki dependsXML'deki düğüm, Magento çekirdek modülünü sizinkinden önce yüklenmeye zorladığından, buradaki önemli yapılandırma parçasıdır.


7

Olayların gönderilme sırası kolayca garanti edilemez. Modüllerin yüklenme sırasına bağlıdır. Tipik olarak tüm temel olay gözlemcileri topluluk ve yerel kod havuzu gözlemcilerinden önce çağrılır.

Magento gözlemcilerini, bir çekirdek modülün yerel veya topluluk modülüne bağımlılığını "taklit ederek" özel bir modülün ardından ateş etmeye zorlamak için bir yöntem vardır. Lee'nin cevabına bir göz atın: Mevcut bir Magento gözlemcisinden önce özel bir gözlemci yangını yapın .

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

Kişisel olarak bu yaklaşımı sevmiyorum çünkü bağımlılığı zorlamanın ne gibi sonuçları olacağını bilmiyorum.

Kullanım durumunuz için, veriyi / durumu tetikleyip tetiklemediğini bilmek için bir tür algılama yapmanız gerektiği anlaşılıyor. Bir modeldeki bir veriyi / durumu kontrol etmek, bir olay sırasını zorlamaya çalışmaktan daha iyi olur.


Ancak benim durumumda, stok kalemi henüz mevcut değilse yapacak bir şeyim yok. Daha sonraki bir olay hakkında yinelenen yöntemin bir sonucu olup olmadığını görmek için sniff olabilir herhangi bir düşünce?
philwinkle

5

Genel bir cevap

Gözlemciler önce alana , ardından modül yükleme sırasına göre yürütülür

Araçlarla Hepsi bu gözlemciler kayıtlı <global>yürütülen önce tüm gözlemciler tescil <frontend>veya <adminhtml>.

Bir alandaki gözlemciler, birleştirilmiş yapılandırma XML ağacında göründükleri sırayla yürütülür, yani teknik olarak modüllerin yüklenme sırasına göre.

Modül yükleme sırası aşağıdaki gibi belirlenir:

  1. İçindeki <depends>tanımlardan bir bağımlılık grafiği oluşturulur app/etc/modules/*.xml. X, Y'ye bağlıysa, Y, X'ten önce yüklenir.

  2. Bağımlılıkla sipariş verdikten sonra, çekirdek modüller topluluk ve yerel modüller üzerinde önceliğe sahiptir

  3. Diğer her şey alfabetik olarak yüklenir. İçindeki dosya adının app/etc/modulesgerçek modül adını değil karşılaştırma için kullanıldığını unutmayın.

Böylece modül yükleme sırasını etkilemek için iki seçeneğiniz vardır:

  1. gözlemcilerinizin bundan sonra çalıştırılması için başka bir modüle bağımlı olma (veya diğer modülün daha önce yürütülmesi için kendinize bağlı olmasını sağlama)
  2. Modül tanım dosyasını yeniden adlandırın. Modülün kendisini yeniden adlandırmanız gerekmez, çünkü dosya adı, yükleme siparişinden başka bir şey için önemli değildir.

("3. modülünüzü çekirdek kod havuzuna ekleyin" sayılmaz)

Ayrıca bakınız:


1

Sadece bir öneri, her ikisini de gözlemleyin catalog_model_product_duplicateve catalog_model_product_save_aftertek gözlemci ile. Gelen catalog_model_product_duplicateset envanter verileri gözlemci veri olarak ve içinde catalog_model_product_save_afterkullanılmak o yinelenen ürün için doldurmak envanterine verileri.


Böylece, etkinlikte bana verilen nesneye bir özellik kaydetmenizi, ardından bunu çalıştırabileceğinizi test etmeyi öneriyorsunuz catalog_model_product_save_after. Tek tuzak save()... herhangi bir düşünce var ... arama olmadan özelliği ısrar edecek ?
philwinkle

Ürünü değil envanter modelini kaydedeceksiniz, bu nedenle bir döngüye yakalanmamanız gerekir.
Petar Dzhambazov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.