Magento: Wie deaktiviere oder ändere ich, wie eine Core-Observer-Methode funktioniert

7

Ich habe mich schon eine Weile darüber gewundert. Was, wenn Magento eine Observer-Kernklasse geschrieben hat und eine Funktionalität ausführt, die nicht ausgeführt werden soll, oder Sie sie neu schreiben möchten? Gibt es eine Möglichkeit zu sagen, verwende diese Methode nicht in einem Observer, benutze nur meine. Wenn ich eine Methode für meinen eigenen Observer einrichte, wird es nicht zuerst die Kernfunktionalität und dann was auch immer ich implementiert haben?

Magento möchte zum Beispiel einige Daten in einer Observer-Methode in der Datenbank speichern, aber ich möchte nicht, dass es diese Daten überhaupt speichert, ich möchte, dass es einige andere Daten speichert, denen ich Spalten oder Attribute hinzugefügt habe die Datenbank für.

    
dan.codes 28.09.2010, 20:48
quelle

4 Antworten

9

Standardvorbehalt für Klassenüberschreibungen als letzte Möglichkeit zur Implementierung Ihrer eigenen Funktionalität

Es ist wahrscheinlich möglich , mit dem Laden der Magento Global Config herumzuspielen, um einen Core Magento Observer zu entfernen, aber es gibt keinen unterstützten Weg dafür.

Überlegen Sie jedoch, wie die Hauptbeobachter konfiguriert sind.

%Vor%

Beobachter sind Magento Model-Klassen. Wenn ein Modell mit der URI / Pfad-basierten Syntax konfiguriert wurde

%Vor%

im Gegensatz zu einem vollständigen PHP-Klassennamen

%Vor%

Sie können eine Überschreibung für die Observer Model-Klasse erstellen (genau wie für jedes andere Model). Wenn ein PHP-Klassenname verwendet wurde, haben Sie kein Glück. (Sie könnten eine lokale Datei in local / Mage / Widget / Model / Observer.php platzieren, wenn Sie bereit sind, die Verantwortung für die Wartung zu übernehmen, aber ich empfehle es nicht)

Um den obigen Beobachter zu überschreiben, würden Sie also

verwenden
  1. Erstellen Sie ein benutzerdefiniertes Modul, das eine Überschreibung für die Klasse Mage_Widget_Model_Observer enthält.

  2. Geben Sie in Ihrer override-Klasse entweder prepareWidgetsPluginConfig erneut an, um das zu tun, was Sie wollen ODER überschreiben Sie die spezifische Methode. Dies könnte eine leere Methode enthalten, um die Funktionalität vollständig zu entfernen.

Alan Storm 28.09.2010, 22:44
quelle
5

Eine bessere Methode dafür ist, die Definition des Beobachters einfach in einer Datei config.xml erneut zu deklarieren.

Ich musste zum Beispiel den Beobachter enterprise_persistent_cart deaktivieren, der für das Ereignis controller_action_layout_generate_blocks_after vom Modul Enterprise_Persistent deklariert wurde.

Die Deklaration in der Datei config.xml von Enterprise_Persistent ist eine solche

%Vor%

Also habe ich ein Modul erstellt und in der config.xml meines Moduls habe ich folgendes gemacht:

%Vor%

Ich habe mein Modul auch vom Enterprise_Persistent-Modul abhängig gemacht. Dies ist notwendig, um sicherzustellen, dass die config.xml meines Moduls NACH der config.xml des Enterprise_Persistent-Moduls verarbeitet wird. Ich tat dies, indem ich die folgenden Schritte in der Modul-Deklarationsdatei meines Moduls / etc / modules My_Module.xml tat

%Vor%

Für jedes Ereignis kann nur eine Beobachteraktion für einen bestimmten Beobachternamen deklariert werden. Solange also die Datei config.xml meines Moduls nach der Datei config.xml des Moduls Enterprise_Persistent verarbeitet wird, wird meine Observer-Deklaration für enterprise_persistent_cart die Beobachteraktion sein, die ausgeführt wird.

Der & lt; -Typ & gt; deaktiviert & lt; / type & gt; Knoten deaktiviert den Beobachter von feuern. Wenn Sie den Beobachter für die Ausführung Ihrer eigenen Methode überschreiben möchten, ersetzen Sie einfach den & lt; -Typ & gt; Knoten mit der & lt; Klasse Ihres Beobachters & gt; und & lt; Methode & gt; Knoten.

Damit können Sie Beobachter überschreiben / deaktivieren, ohne die Hauptklassen zu überschreiben. Es ist erweiterbar für zukünftige Entwickler.

    
Sean 06.11.2012 17:05
quelle
4

Ich wollte @ Alans Antwort einen Kommentar hinzufügen, weil ich denke, dass er es geschafft hat, aber mein Kommentar wurde zu lang und nicht genug formatiert! Hier geht es:

Nice one @Alan, ein cleverer Weg, um etwas zu reparieren, das wie ein Loch aussieht, ohne die Architektur zu vernachlässigen. Ein paar Gedanken:

  1. Wenn ein benutzerdefiniertes Modul an dasselbe Ereignis bindet, wird der benutzerdefinierte Observer später in der Chain of Responsiblity aufgerufen als der Kern und könnte daher möglicherweise den zentralen Observer außer Kraft setzen? Dies hängt davon ab, was der Hauptbeobachter tut, z. einen Umleitungswert einstellen. Im Beispiel des OPs wird dies funktionieren. Beim Binden an ein Model_save_before-Ereignis wird der Hauptobserver aufgerufen, aber Ihr Observer kann den Inhalt der Modellsicherungsdaten noch ändern, bevor er in die Datenbank geschrieben wird. Sie können die Werte ändern oder aufheben, die vom zentralen Observer betroffen sind.

  2. Um das Modell des Obser-Kerns zu überschreiben, wäre das Einfügen eines <models><widget><rewrite> in die Datei config.xml der richtige Ansatz

  3. Dies könnte einer der wenigen Fälle sein, in denen der Aufruf von parent:: nicht erforderlich ist, wenn (!)

  4. überschrieben wird

HTH, JD

BEARBEITEN - Weitere Informationen, die in Schritt 1 hinzugefügt wurden, um auf die Fragen von OP zu antworten

    
Jonathan Day 29.09.2010 00:52
quelle
1
___ answer3818067 ___

Ich wollte @ Alans Antwort einen Kommentar hinzufügen, weil ich denke, dass er es geschafft hat, aber mein Kommentar wurde zu lang und nicht genug formatiert! Hier geht es:

Nice one @Alan, ein cleverer Weg, um etwas zu reparieren, das wie ein Loch aussieht, ohne die Architektur zu vernachlässigen. Ein paar Gedanken:

  1. Wenn ein benutzerdefiniertes Modul an dasselbe Ereignis bindet, wird der benutzerdefinierte Observer später in der Chain of Responsiblity aufgerufen als der Kern und könnte daher möglicherweise den zentralen Observer außer Kraft setzen? Dies hängt davon ab, was der Hauptbeobachter tut, z. einen Umleitungswert einstellen. Im Beispiel des OPs wird dies funktionieren. Beim Binden an ein Model_save_before-Ereignis wird der Hauptobserver aufgerufen, aber Ihr Observer kann den Inhalt der Modellsicherungsdaten noch ändern, bevor er in die Datenbank geschrieben wird. Sie können die Werte ändern oder aufheben, die vom zentralen Observer betroffen sind.

  2. Um das Modell des Obser-Kerns zu überschreiben, wäre das Einfügen eines %code% in die Datei config.xml der richtige Ansatz

  3. Dies könnte einer der wenigen Fälle sein, in denen der Aufruf von %code% nicht erforderlich ist, wenn (!)

  4. überschrieben wird

HTH, JD

BEARBEITEN - Weitere Informationen, die in Schritt 1 hinzugefügt wurden, um auf die Fragen von OP zu antworten

    
___ qstnhdr ___ Magento: Wie deaktiviere oder ändere ich, wie eine Core-Observer-Methode funktioniert ___ qstntxt ___

Ich habe mich schon eine Weile darüber gewundert. Was, wenn Magento eine Observer-Kernklasse geschrieben hat und eine Funktionalität ausführt, die nicht ausgeführt werden soll, oder Sie sie neu schreiben möchten? Gibt es eine Möglichkeit zu sagen, verwende diese Methode nicht in einem Observer, benutze nur meine. Wenn ich eine Methode für meinen eigenen Observer einrichte, wird es nicht zuerst die Kernfunktionalität und dann was auch immer ich implementiert haben?

Magento möchte zum Beispiel einige Daten in einer Observer-Methode in der Datenbank speichern, aber ich möchte nicht, dass es diese Daten überhaupt speichert, ich möchte, dass es einige andere Daten speichert, denen ich Spalten oder Attribute hinzugefügt habe die Datenbank für.

    
___ tag123magento ___ Magento ist eine E-Commerce-Plattform, die in PHP auf dem Zend-Framework geschrieben wurde. Fragen sollten im Zusammenhang mit dem Schreiben von Code für Magento stehen. Allgemeine Magento Fragen können unter https://magento.stackexchange.com gestellt werden ___ antwort6699124 ___

Danke Jonathan, ich überschreibe Observer mit der grundlegenden Syntax, die die Syntax überschreibt

%Vor%

Es hat gut funktioniert.

    
___ tag123php ___ PHP ist eine weit verbreitete, dynamische, objektorientierte und interpretierte Skriptsprache, die primär für die serverseitige Webentwicklung entwickelt wurde. ___ answer13255888 ___

Eine bessere Methode dafür ist, die Definition des Beobachters einfach in einer Datei config.xml erneut zu deklarieren.

Ich musste zum Beispiel den Beobachter enterprise_persistent_cart deaktivieren, der für das Ereignis controller_action_layout_generate_blocks_after vom Modul Enterprise_Persistent deklariert wurde.

Die Deklaration in der Datei config.xml von Enterprise_Persistent ist eine solche

%Vor%

Also habe ich ein Modul erstellt und in der config.xml meines Moduls habe ich folgendes gemacht:

%Vor%

Ich habe mein Modul auch vom Enterprise_Persistent-Modul abhängig gemacht. Dies ist notwendig, um sicherzustellen, dass die config.xml meines Moduls NACH der config.xml des Enterprise_Persistent-Moduls verarbeitet wird. Ich tat dies, indem ich die folgenden Schritte in der Modul-Deklarationsdatei meines Moduls / etc / modules My_Module.xml tat

%Vor%

Für jedes Ereignis kann nur eine Beobachteraktion für einen bestimmten Beobachternamen deklariert werden. Solange also die Datei config.xml meines Moduls nach der Datei config.xml des Moduls Enterprise_Persistent verarbeitet wird, wird meine Observer-Deklaration für enterprise_persistent_cart die Beobachteraktion sein, die ausgeführt wird.

Der & lt; -Typ & gt; deaktiviert & lt; / type & gt; Knoten deaktiviert den Beobachter von feuern. Wenn Sie den Beobachter für die Ausführung Ihrer eigenen Methode überschreiben möchten, ersetzen Sie einfach den & lt; -Typ & gt; Knoten mit der & lt; Klasse Ihres Beobachters & gt; und & lt; Methode & gt; Knoten.

Damit können Sie Beobachter überschreiben / deaktivieren, ohne die Hauptklassen zu überschreiben. Es ist erweiterbar für zukünftige Entwickler.

    
___ answer3817562 ___

Standardvorbehalt für Klassenüberschreibungen als letzte Möglichkeit zur Implementierung Ihrer eigenen Funktionalität

Es ist wahrscheinlich möglich , mit dem Laden der Magento Global Config herumzuspielen, um einen Core Magento Observer zu entfernen, aber es gibt keinen unterstützten Weg dafür.

Überlegen Sie jedoch, wie die Hauptbeobachter konfiguriert sind.

%Vor%

Beobachter sind Magento Model-Klassen. Wenn ein Modell mit der URI / Pfad-basierten Syntax konfiguriert wurde

%Vor%

im Gegensatz zu einem vollständigen PHP-Klassennamen

%Vor%

Sie können eine Überschreibung für die Observer Model-Klasse erstellen (genau wie für jedes andere Model). Wenn ein PHP-Klassenname verwendet wurde, haben Sie kein Glück. (Sie könnten eine lokale Datei in local / Mage / Widget / Model / Observer.php platzieren, wenn Sie bereit sind, die Verantwortung für die Wartung zu übernehmen, aber ich empfehle es nicht)

Um den obigen Beobachter zu überschreiben, würden Sie also

verwenden
  1. Erstellen Sie ein benutzerdefiniertes Modul, das eine Überschreibung für die Klasse Mage_Widget_Model_Observer enthält.

  2. Geben Sie in Ihrer override-Klasse entweder %code% erneut an, um das zu tun, was Sie wollen ODER überschreiben Sie die spezifische Methode. Dies könnte eine leere Methode enthalten, um die Funktionalität vollständig zu entfernen.

___ tag123observerpattern ___ Ein Entwurfsmuster, in dem ein Objekt, das Subjekt genannt wird, eine Liste seiner Abhängigen, Beobachter genannt, beibehält und diese automatisch über Zustandsänderungen informiert, indem es normalerweise eine seiner Methoden aufruft. Es ist eines der Verhaltensmuster der Gang of Four. ___
Vijay Kumar 14.07.2011 19:50
quelle

Tags und Links