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?

War es hilfreich?

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:

  1. Eine Abhängigkeitsgrafik wird aus erstellt <depends> Definitionen in app/etc/modules/*.xml. Wenn x von y abhängt, wird y vor X geladen.

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

  3. 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:

  1. 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)
  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. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top