Magento Observer -Ereignisse - Operationsreihenfolge
-
16-10-2019 - |
Frage
Ich versuche, die Funktionalität in die zu bringen catalog_model_product_duplicate
Veranstaltung. Ein Teil dieses Moduls besteht darin, sicherzustellen, dass der Aktienstatus des doppelten Produkts ebenfalls dupliziert wird. Derzeit ist es nicht.
Ich sehe das CatalogInventory
Beobachtet dieses Ereignis und legt einige Standardinformationen ein. Kann ich garantiert werden, dass Kernereignisse vor meinen Einheimischen gelöst werden? Gibt es hier eine Operationsreihenfolge, auf die ich mich verlassen kann?
Lösung
Die Reihenfolge, in der Ereignisse versandt werden, hängt von der Reihenfolge ab, in der die Module geladen werden. Da müssen Sie sicher sein, dass die CatalogInventory
Die Beobachter des Moduls feuern vor Ihrem, was Sie tun müssen. Sie müssen einfach Ihr Modul so konfigurieren, dass sie von der abhängen Mage_CatalogInventory
Modul. Sie können dies tun, indem Sie dem Code in Ihrem Code einen abhängigen Knoten hinzufügen app/etc/modules/My_Module.xml
Datei:
<config>
<modules>
<My_Module>
<active>true</active>
<codePool>local</codePool>
<depends>
<Mage_CatalogInventory />
</depends>
</My_Module>
</modules>
</config>
Das depends
Der Knoten in der obigen XML ist hier das entscheidende Stück Konfiguration, da das Magento -Kernmodul vor Ihrem geladen wird.
Andere Tipps
Die Reihenfolge, in der Ereignisse versandt werden, kann nicht leicht garantiert werden. Sie sind von der Reihenfolge abhängig, in der Module geladen werden. In der Regel werden alle Kernereignisbeobachter vor Community- und lokalen Codepool -Beobachtern aufgerufen.
Es gibt eine Methode, mit der Magento -Beobachter nach einem benutzerdefinierten Feuchtigkeit feuern können, indem sie eine Abhängigkeit eines Kernmoduls zu einem lokalen oder Community "fälschen". Schauen Sie sich hier auf Lees Antwort an: Machen Sie einen benutzerdefinierten Beobachter vor einem vorhandenen Magento Observer.
/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>
Ich persönlich mag diesen Ansatz nicht, da ich nicht weiß, welche Konsequenzen diese Abhängigkeit erzwingen würden.
Für Ihren Anwendungsfall klingt es, dass Sie eine Art Erkennung für Daten/Status durchführen sollten, um zu wissen, ob sie abgefeuert wurden oder nicht. Das Überprüfen eines Daten/eines Zustands auf einem Modell wäre vorzuziehen, als zu versuchen, eine Ereignisreihenfolge zu erzwingen.
Eine allgemeine Antwort
Beobachter werden von ausgeführt von Bereich zuerst dann von Modullastreihenfolge
Das heißt, alle Beobachter registrierten sich in <global>
werden ausgeführt Vor Alle Beobachter registriert in <frontend>
oder <adminhtml>
.
Innerhalb eines Bereichs werden Beobachter in der Reihenfolge ausgeführt, in der sie in der fusionierten Konfiguration XML -Baum angezeigt werden, was bedeutet, dass die Module technisch geladen wurden.
Die Ladereihenfolge der Modul wird wie folgt bestimmt:
Eine Abhängigkeitsgrafik wird aus erstellt
<depends>
Definitionen inapp/etc/modules/*.xml
. Wenn x von y abhängt, wird y vor X geladen.Nach der Bestellung durch Abhängigkeit haben Kernmodule Vorrang vor Gemeinschafts- und lokalen Modulen
Alles andere ist alphabetisch geladen. Beachten Sie, dass der Dateiname in
app/etc/modules
wird zum Vergleich verwendet, nicht zum tatsächlichen Modulnamen.
Sie haben also zwei Optionen, um das Ladereihenfolge des Moduls zu beeinflussen:
- Hängen Sie von einem anderen Modul ab, damit Ihre Beobachter nach ihm ausgeführt werden (oder lassen Sie das andere Modul davon abhängen, dass Sie sie zuvor ausgeführt haben)
- Benennen Sie die Moduldefinitionsdatei um. Sie müssen das Modul selbst nicht umbenennen, da der Dateiname für nichts anderes als die Ladereihenfolge von Bedeutung ist.
("3. Ihr Modul zum Core -Codepool hinzufügen" zählt nicht)
Siehe auch:
Nur ein Vorschlag, beobachten Sie beide catalog_model_product_duplicate
und catalog_model_product_save_after
mit Singleton Observer. Im catalog_model_product_duplicate
Setzen Sie Inventardaten als Beobachterdaten und in catalog_model_product_save_after
Verwenden Sie diese Daten, um das Inventar für dupliziertes Produkt zu füllen.