Ich arbeite an einem OpenCart-Projekt, das viel Anpassung erfordert. für mein Projekt muss ich etwas in der Warenkorb-Bibliothek ändern (system / library / cart.php).
Ich müsste eine benutzerdefinierte Funktion aufrufen, die im Produktmodell definiert ist (catalog / model / catalog / product.php).
In einem Controller ist das Laden eines Modells und die Verwendung seiner Funktionen einfach:
%Vor%Aber wie lädt man ein Modell außerhalb eines Controllers? Sie können keine neue Instanz des Modells erstellen, ich habe das bereits versucht:
%Vor%Dies funktioniert offensichtlich nicht, weil Modelle nicht so verwendet werden sollten.
Ich habe auch versucht, den Scope-Auflösungsoperator zu verwenden (ModelCatalogProduct :: customFunction ()) Es funktioniert auch nicht.
Ich könnte alle erforderlichen Informationen als Argumente übergeben, aber ich würde lieber das Modell in der Wagenbibliotheksklasse verwenden, da die Änderungen global wären.
Ist es sogar möglich, ein Modell außerhalb eines Controllers in OpenCart zu laden?
Wenn es nur eine Methode ist, die Sie kopieren müssen, fügen Sie am besten eine Methode zur Cart
-Klasse selbst hinzu. Die Klasse Cart
arbeitet mit den $this->db->query()
-Aufrufen, da ihr $db
bereits zugewiesen ist, obwohl es kein Controller / Modell
Wenn Sie dies tun möchten, können Sie etwas Ähnliches wie das Folgende tun
%Vor%Sie können ein Modell außerhalb eines kontrollierten laden.
Wenn Sie ein Modell in ein anderes Modell laden möchten, können Sie es mit $this->load->model('my_module/my_model');
auf die gleiche Weise laden.
Wenn Sie ein Modell in einer Vorlagendatei oder einem anderen benutzerdefinierten PHP-Skript laden müssen, sehen Sie sich die index.php
-Datei an, in der Registry
installiert ist - Sie müssten sie auf die gleiche Weise installieren. So könnte Ihr benutzerdefinierter Code aussehen:
Wie auch immer, ich empfehle dringend, die Kernbibliotheksdateien nicht zu bearbeiten / zu ändern, es sei denn, Sie sind sicher, dass es keine andere Möglichkeit gibt, wie Sie das implementieren / tun können, was Sie brauchen.
Wie Jay Gilford vorgeschlagen, würde ich diese Funktion oder ihren Aufruf an die catalog/checkout/cart.php
, möglicherweise confirm
oder success
implementieren, abhängig vom Umfang und der Funktionalität, die Sie implementieren möchten.
In OpenCart sind Teile der Modellschicht von den Bibliotheken abhängig. Ein Beispiel ist, dass die ID des aktuellen Kunden (Frontend) oder des aktuellen Benutzers (Backend) benötigt wird.
Um die Struktur klar und sauber zu halten und die Code-Duplizierung zu reduzieren, sollten Sie keine Abhängigkeit in die andere Richtung einführen. Wenn ein Modell vom Klassenbenutzer abhängig ist und der Klassenbenutzer vom Modell abhängig ist, haben Sie einen Teufelskreis erstellt.
Ich würde empfehlen, die Funktionen in die Bibliotheksebene zu verschieben und ihre Implementierungen in der Modellschicht zu entfernen. Um die Auswirkungen zu minimieren, können Sie den Funktionsaufruf innerhalb des Modells umbrechen.
library / myClass
%Vor%admin / model / catalog / myModel
%Vor%