Magento Observer Events - Reihenfolge der Operationen


9

Ich versuche, dem catalog_model_product_duplicateEreignis Funktionalität zu verleihen. Ein Teil dieses Moduls besteht darin, sicherzustellen, dass der Lagerstatus des duplizierten Produkts auch dupliziert wird. Derzeit ist es nicht.

Ich sehe, dass CatalogInventorydieses Ereignis beobachtet und einige Standardbestandsinformationen erstellt werden. Kann ich garantieren, dass Kernereignisse vor meinen Einheimischen gelöst werden? Gibt es hier eine Reihenfolge von Operationen, auf die ich mich verlassen kann?

Antworten:


11

Die Reihenfolge, in der Ereignisse ausgelöst werden, hängt von der Reihenfolge ab, in der die Module geladen werden. Da Sie sicherstellen müssen, dass die CatalogInventoryBeobachter des Moduls vor Ihren ausgelöst werden, müssen Sie Ihr Modul lediglich so konfigurieren, dass es vom Modul abhängt Mage_CatalogInventory. Sie können dies tun, indem Sie dem Code in Ihrer app/etc/modules/My_Module.xmlDatei einen abhängigen Knoten hinzufügen :

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

Der dependsKnoten in der obigen XML-Datei ist hier die entscheidende Konfiguration, da er das Laden des Magento-Kernmoduls vor Ihrem zwingt.


7

Die Reihenfolge, in der Ereignisse versandt werden, kann nicht einfach garantiert werden. Sie hängen von der Reihenfolge ab, in der die Module geladen werden. In der Regel werden alle Beobachter von Kernereignissen vor Beobachtern des Community- und lokalen Codepools angerufen.

Es gibt eine Methode, um Magento-Beobachter zu zwingen, nach einem benutzerdefinierten Modul zu feuern, indem eine Abhängigkeit eines Kernmoduls von einem lokalen oder einem Community-Modul "vorgetäuscht" wird. Schauen Sie sich hier Lees Antwort an: Lassen Sie einen benutzerdefinierten Beobachter vor einem vorhandenen Magento-Beobachter feuern .

/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 das Erzwingen dieser Abhängigkeit haben würde.

Für Ihren Anwendungsfall klingt es so, als ob Sie eine Art Erkennung für Daten / Status durchführen sollten, um zu wissen, ob sie ausgelöst wurden oder nicht. Das Überprüfen von Daten / Status in einem Modell ist dem Versuch vorzuziehen, eine Ereignisreihenfolge zu erzwingen.


In meinem Fall habe ich jedoch nichts zu tun, wenn der Lagerartikel noch nicht vorhanden ist. Irgendwelche Gedanken zu einem späteren Ereignis, das ich schnüffeln könnte, um zu sehen, ob es ein Ergebnis der doppelten Methode war?
Philwinkle

5

Eine allgemeine Antwort

Beobachter werden zuerst nach Bereich und dann nach Modulladereihenfolge ausgeführt

Das heißt, alle in registrierten Beobachter <global>werden ausgeführt, bevor alle in <frontend>oder registrierten Beobachter ausgeführt werden <adminhtml>.

Innerhalb eines Bereichs werden Beobachter in der Reihenfolge ausgeführt, in der sie im zusammengeführten Konfigurations-XML-Baum angezeigt werden. Dies bedeutet, dass die Module technisch in der Reihenfolge geladen wurden, in der sie geladen wurden.

Die Ladereihenfolge des Moduls wird wie folgt bestimmt:

  1. Ein Abhängigkeitsdiagramm wird aus <depends>Definitionen in erstellt app/etc/modules/*.xml. Wenn X von Y abhängt, wird Y vor X geladen.

  2. Nach der Bestellung nach Abhängigkeit haben Kernmodule Vorrang vor Community- und lokalen Modulen

  3. Alles andere wird alphabetisch geladen. Beachten Sie, dass der Dateiname in app/etc/moduleszum Vergleich verwendet wird, nicht der tatsächliche Modulname.

Sie haben also zwei Möglichkeiten, die Ladereihenfolge des Moduls zu beeinflussen:

  1. hängen Sie von einem anderen Modul ab, damit Ihre Beobachter danach ausgeführt werden (oder lassen Sie das andere Modul von Ihrem Modul abhängen, damit sie zuvor ausgeführt werden)
  2. 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. Fügen Sie Ihr Modul zum Kerncodepool hinzu" zählt nicht)

Siehe auch:


1

Nur ein Vorschlag, beobachten Sie beide catalog_model_product_duplicateund catalog_model_product_save_aftermit Singleton-Beobachter. In catalog_model_product_duplicateSatz Bestandsdaten als Beobachter Daten und in catalog_model_product_save_afterGebrauch , dass Daten aufzufüllen Inventar für duplizierte Produkt.


Sie schlagen also vor, eine Eigenschaft für das Objekt zu speichern, das mir im Ereignis übergeben wurde, und diese dann auf catalog_model_product_save_after... zu testen, das könnte funktionieren. Die einzige Gefahr wäre, das Anwesen zu behalten, ohne anzurufen save()... irgendwelche Gedanken?
Philwinkle

Sie speichern das Inventarmodell und nicht das Produkt, sodass Sie nicht in eine Schleife geraten sollten.
Petar Dzhambazov
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.