Heute werden wir eine der coolsten Funktionen von OpenCart-Skriptbenachrichtigungen besprechen. Obwohl sie seit der Veröffentlichung von OpenCart 2.x verfügbar sind, wurden sie in der letzten Version von OpenCart 2.2.x.x verbessert. Im Verlauf dieses Tutorials diskutieren wir das Konzept und demonstrieren es, indem wir ein Arbeitsmodul erstellen.
Als Entwickler müssen Sie häufig den Ablauf des Verhaltens des Kernframeworks ändern, ob Sie dem Framework eine neue Funktion hinzufügen oder den vorhandenen Workflow verbessern. In beiden Fällen müssen Sie den Workflow steuern, damit Sie sich in die Funktionalität einbinden und das gewünschte Verhalten erreichen können.
Versuchen wir es anhand eines einfachen Beispiels zu verstehen. Wenn Sie einen beliebten Online-Shop betreiben, stehen die Chancen, dass die beliebtesten Produkte Ihres Shops bald ausverkauft sein werden. In diesem Fall wäre es schön, eine Benachrichtigung darüber zu erhalten und entsprechend vorzugehen.
In diesem Beispiel können Sie nach der Methode suchen, die bei der Bestellung aufgerufen wird. Als Nächstes können Sie sich in den Auftragserstellungsablauf einhaken, sodass Sie steuern können, wann die Bestellung aufgegeben wird. Dadurch können Sie einen zufälligen Code im Kontext des aufgerufenen Ereignisses ausführen. Hier kommen Ereignisbenachrichtigungen ins Spiel, sodass wir beliebigen Code ausführen und das Ergebnis ändern können.
Wie in der offiziellen OpenCart-Dokumentation beschrieben:
In 2.2+ haben wir ein neues Ereignissystem hinzugefügt. Hierbei handelt es sich um Hooks, die vor und nach Ereignissen aufgerufen werden können, z. B. Aufruf einer Controller-Methode, Aufruf einer Modellmethode oder Laden von Vorlagen. Sie geben die Möglichkeit, die Parameter der Eingabemethode und die zurückgegebene Ausgabe zu bearbeiten.
Das ist wirklich mächtig, da Sie sich buchstäblich in jeden Methodenaufruf einhaken und die von dieser Methode zurückgegebene Ausgabe ändern können. Sie sollten jedoch bei der Implementierung von Hooks vorsichtig sein, wenn Sie die Verantwortung dafür übernehmen, die resultierende Ausgabe des Aufrufs zu ändern. Wenn Ihre Implementierung einen Wert zurückgibt, werden alle anderen Ereignisaktionen gestoppt, die aufgerufen werden sollen.
Was ist erforderlich, um Skriptbenachrichtigungen zu implementieren? Hier sind die notwendigen Schritte:
Wenn Sie Ihre Veranstaltung bei OpenCart registrieren, teilen Sie OpenCart mit, dass Sie es überwachen möchten xyz
Wenn dies passiert, führen Sie die foo-Aktion in der Bar-Controller-Datei aus. Dabei haben Sie zwei Möglichkeiten, vorher und nachher zu wählen.
Wenn Sie die Option vor wählen, führt OpenCart die Aktion foo vor der überwachten Aktion aus, und im Fall der Option after wird foo nach der Aktion ausgeführt. Im Falle der vor-Option ist es wichtig zu beachten, dass OpenCart den ursprünglichen überwachten Methodencode nicht ausführt, wenn die Methode foo etwas zurückgibt.
In diesem Artikel wird später beschrieben, wie Sie ein Ereignis während der Implementierung eines benutzerdefinierten Moduls registrieren.
Als Nächstes müssen Sie den Controller und die entsprechende Aktionsmethode implementieren, die im ersten Schritt einem Ereignis zugeordnet wurde. An dieser Stelle sollte Ihr benutzerdefinierter Code verwendet werden. OpenCart sendet kontextspezifische Argumente an Ihre foo-Methode, sodass Sie sie bei Bedarf verwenden können.
Das ist nur ein Blick darauf, wozu Skriptbenachrichtigungen fähig sind.
Wenn Sie mit vQmod oder OCMOD vertraut sind, werden Sie wahrscheinlich die Ärmel gegen die Ereignisbenachrichtigungsfunktion hochkrempeln. Mit den oben genannten Leckereien, die Sie mit Ereignisbenachrichtigungen ohnehin erreicht hätten, könnten Sie schließlich alles erreichen.
Für diejenigen, die weder mit vQmod noch mit OCMOD vertraut sind, sind im Folgenden einige einführende Artikel aufgeführt, die dies erläutern.
Die Frage ist also: Wenn Sie vQmod oder OCMOD zum Ändern der Kerndateien verwenden könnten, warum sollten Sie Skriptbenachrichtigungen verwenden? Dies liegt daran, dass möglicherweise mehrere OCMOD-Plugins versuchen, denselben Code zu ändern, was zu Konflikten führen kann. Bei Ereignissen besteht keine Konfliktwahrscheinlichkeit, da jedes Ereignis in einer bestimmten Reihenfolge ausgeführt wird.
Die Schlussfolgerung lautet also: Wenn es möglich ist, Ereignisse zu verwenden, sollten Sie sich dafür entscheiden. Wenn Sie jedoch das Gefühl haben, dass für Ihren Anwendungsfall kein Ereignis verfügbar ist, können Sie OCMOD verwenden.
In diesem Abschnitt erstellen wir ein Modul, das die Verwendung von Ereignisbenachrichtigungen in OpenCart veranschaulicht. Ich gehe davon aus, dass Sie den grundlegenden Modulentwicklungsprozess in OpenCart kennen, da wir die Grundlagen durchgehen. Wenn Sie sich dessen nicht bewusst sind, finden Sie hier einen schönen Artikel, den Sie schnell durchgehen können.
Lassen Sie uns den Anwendungsfall verstehen, bevor wir ihn implementieren. Angenommen, Sie verfügen über ein Geschäft, das die Kataloginformationen vom API-Back-End eines Drittanbieters abruft. Sie haben einen Cron eingerichtet, der die Informationen regelmäßig abruft und in die OpenCart-Datenbank einfügt, damit sie im Frontend angezeigt werden können. Sie haben zwar einen Cron eingerichtet, der die Informationen in regelmäßigen Abständen aktualisiert, Sie möchten jedoch sicherstellen, dass die im Frontend angezeigten Informationen in Echtzeit vorliegen.
Im Frontend ruft OpenCart die getProduct
Funktion, wenn die Produktdetailseite angezeigt wird. Das ist also der ideale Kandidat, um sich in die Datenbank einzumischen und sie zu aktualisieren, wenn sich die API-Informationen geändert haben.
Beginnen wir also zuerst mit dem Erstellen der Back-End-Dateien.
Mach weiter und erstelle das admin / controller / module / demoevent.php
Datei mit folgendem Inhalt.
load-> model ('extension / event'); $ this-> model_extension_event-> addEvent ('event_product_info', 'catalog / model / catalog / product / getProduct / before', 'custom / product / info'); public function uninstall () $ this-> load-> model ('extension / event'); $ this-> model_extension_event-> deleteEvent ('event_product_info');
Wie bereits erwähnt, möchten Sie als erstes die Registrierung der Veranstaltung vornehmen. Dies ist der Installations-Hook, den wir dazu verwenden, da er ausgeführt wird, wenn das Modul installiert wird.
Wir haben die verwendet Ereignis hinzufügen
Methode des Ereignismodells unter Erweiterung Verzeichnis, und diese Methode hat drei Argumente.
Das erste Argument, event_product_info, ist der Name der Veranstaltung. Sie können alles nennen, aber stellen Sie sicher, dass es einzigartig ist.
Das zweite Argument ist sehr wichtig und weist auf die Methode hin, in die Sie einsteigen möchten. In unserem Fall müssen wir uns für das entscheiden getProduct
Methode der Produkt Modell unter der Katalog Verzeichnis. Die Hierarchie ist also Modell / Katalog / Produkt / getProduct
. Zusätzlich sollte es mit einem der beiden vorangestellt werden Katalog oder Administrator, was für die Anwendung steht. In unserem Fall ist es so Katalog da wir in die Front-End-Methode einhaken. Schließlich wird es entweder vorher oder nachher nachbearbeitet, was OpenCart anweist, unseren Code entsprechend auszuführen.
Das dritte Argument verweist auf das Aktion Ihres Controllers, der ausgelöst wird, wenn das Ereignis ausgelöst wird. Es ist eingestellt benutzerdefinierte / produkt / info
, Sie müssen also ein erstellen Produkt Controller mit der Info
Methode unter der Brauch Verzeichnis, wie wir es gleich tun werden.
Schließlich wird die Deinstallationsmethode verwendet, um das Ereignis während der Deinstallation des Moduls zu entfernen.
Als Nächstes erstellen wir eine Sprachdatei für unser benutzerdefiniertes Modul unter admin / sprache / de-de / modul / demoevent.php
mit folgenden Inhalten.
Wir haben die Einrichtung der Backend-Dateien abgeschlossen. Jetzt sollten Sie unser Modul unter sehen können Erweiterungen> Module im Backend von OpenCart. Fahren Sie fort und installieren Sie es. Nun werden wir die Dateien im Frontend erstellen.
Erstellen Sie eine Modelldatei
Katalog / Modell / Gewohnheit / Produkt.php
mit folgenden Inhalten. Dies ist eine typische Modelldatei gemäß der OpenCart-Struktur.db-> query ("SELECT date_modified FROM". DB_PREFIX. "product WHERE product_id = '". (int) $ product_id. "'"); $ Abfrage-> Zeile zurückgeben; function updateProductInfo ($ product_id, $ data) include_once __DIR __. '… /… /… /admin/model/catalog/product.php'; $ modelCatalogProduct = neues ModelCatalogProduct (); $ modelCatalogProduct-> editProduct ($ product_id, $ data);Es implementiert zwei wichtige Methoden. Das
getProductLastModifiedInfo
Mit dieser Methode wird das letzte Änderungsdatum des Produkts abgerufenupdateProductInfo
Diese Methode wird zum Aktualisieren der Produktinformationen in der Datenbank verwendet. Wir werden gleich sehen, wie diese Methoden angewendet werden.Schließlich erstellen wir eine der wichtigsten Dateien dieses Artikels,
katalog / controller / custom / produkt.php
, mit folgenden Inhalten. Es ist eine Controller-Datei, die das implementiertInfo
Aktionsmethode, die aufgerufen wird, wenn diegetProduct
Methode der Produktmodell wird genannt.load-> model ('custom / product'); $ product_modified_date = $ this-> model_custom_product-> getProductLastModifiedInfo ($ product_id); if ($ product_modified_date ['date_modified']! = $ product_api_info ['date_modified']) // Die API-Informationen haben sich geändert. Lassen Sie uns also zuerst db // aktualisieren. Anmerkung: Sie möchten wahrscheinlich $ product_api_info gemäß dem von der editProduct-Methode benötigten Format formatieren $ this-> model_custom_product-> updateProductInfo ($ product_id, $ product_api_info); // Letzte / Echtzeit-Produktinformationen zurückgeben ('product_id' => $ product_api_info ['product_id']), 'name' => $ product_api_info ['name'], 'description' => $ product_api_info ['description' ], 'meta_title' => $ product_api_info ['meta_title'], 'meta_description' => $ product_api_info ['meta_description'], 'meta_keyword' => $ product_api_info ['meta_keyword'], 'tag' => $ product_api_info ' tag '],' model '=> $ product_api_info [' model '],' sku '=> $ product_api_info [' sku '],' upc '=> $ product_api_info [' upc '],' ean '=> $ product_api_info ['ean'], 'jan' => $ product_api_info ['jan'], 'isbn' => $ product_api_info ['isbn'], 'mpn' => $ product_api_info ['mpn'], 'location' => $ product_api_info ['location'], 'Quantity' => $ product_api_info ['Quantity'], 'stock_status' => $ product_api_info ['stock_status'], 'image' => $ product_api_info ['image'], 'Hersteller_id' => $ product_api_info ['Hersteller_ID'], 'Hersteller' => $ product_api_info ['Hersteller'], 'Preis' => ($ product_api_info ['Rabatt']? $ product_api_in fo ['rabatt']: $ product_api_info ['price']), 'special' => $ product_api_info ['special'], 'belohnung' => $ product_api_info ['belohnung'], 'points' => $ product_api_info [ 'points'], 'tax_class_id' => $ product_api_info ['tax_class_id'], 'date_available' => $ product_api_info ['date_available'], 'weight' => $ product_api_info ['weight'], 'weight_class_id' => $ product_api_info ['weight_class_id'], 'length' => $ product_api_info ['length'], 'width' => $ product_api_info ['width'], 'height' => $ product_api_info ['height'], 'length_class_id' = > $ product_api_info ['length_class_id'], 'subtract' => $ product_api_info ['subtract'], 'rating' => rund ($ product_api_info ['rating']), 'reviews' => $ product_api_info ['reviews'] ? $ product_api_info ['reviews']: 0, 'minimum' => $ product_api_info ['minimum'], 'sort_order' => $ product_api_info ['sort_order'], 'status' => $ product_api_info ['status'], ' date_added '=> $ product_api_info [' date_added '],' date_modified '=> $ product_api_info [' date_modified '],' angesehen '=> $ product_api_info [' angesehen ']);Beachten Sie hierbei, dass OpenCart Ihrer Methode kontextspezifische Argumente zur Verfügung stellt. Der Erste
$ route
Argument gibt die Route an, die dem Ereignis zugeordnet ist, das ausgelöst wurde. In unserem Fall sollte es so seinKatalog / Produkt / GetProduct
. Das zweite Argument ist die Produkt-ID, da diese vom tatsächlichen Argument benötigt wirdgetProduct
Methode.Die Logik sieht ungefähr so aus: Wir vergleichen das Änderungsdatum des Produkts in der OpenCart-Datenbank mit den Informationen, die vom API-Callback zurückgegeben werden.
Der erste Schritt ist also das Laden der Echtzeit-Produktinformationen aus der API. Bitte beachten Sie, dass die api_call_to_fetch_product_info method ist nur eine Dummy-Methode, die Sie durch Ihren tatsächlichen API-Aufruf ersetzen möchten.
Als nächstes benutzen wir die
getProductLastModifiedInfo
Methode, die im vorherigen Abschnitt erstellt wurde, um das Änderungsdatum des Produkts aus der OpenCart-Datenbank abzurufen.Schließlich führen wir den Vergleich durch. Wenn sich das Datum unterscheidet, wird die OpenCart-Datenbank mit der neuesten Produktinformation aktualisiert
updateProductInfo
Methode in unserer Model-Klasse.Wir haben auch die Produktinformationen im Array-Format auf die gleiche Art und Weise zurückgegeben wie das tatsächliche
getProduct
wäre zurückgekehrt Es ist wichtig zu wissen, dass wir, da wir den Rückgabewert in unserem Hook angegeben haben, keine weiteren Ereignisanrufe einschließlich des Anrufs zum ursprünglichen Anruf anrufengetProduct
Methode auch.Auf diese Weise können Sie den Ausführungsablauf in OpenCart beeinflussen. Es ist eine sehr wirkungsvolle Möglichkeit, die Kernfunktionen zu ändern. Sie sollten jedoch vorsichtig sein, wenn Sie sich dieser Lösung nähern, da Sie damit die vollständige Kontrolle haben, um die resultierende Ausgabe einer Methode zu ändern.
Fazit
Heute haben wir eine der aufregenden Funktionen in OpenCart besprochen, die Skriptbenachrichtigungen. Wir haben mit einer Einführung in das Thema begonnen. In der zweiten Hälfte des Artikels wurde die Verwendung eines benutzerdefinierten Ereignismoduls beschrieben.
Wenn Sie nach zusätzlichen OpenCart-Tools, Hilfsprogrammen, Erweiterungen usw. suchen, die Sie in Ihren eigenen Projekten oder für Ihre eigene Ausbildung einsetzen können, vergessen Sie nicht, zu sehen, was auf dem Markt verfügbar ist.
Anfragen und Kommentare sind immer willkommen!