Richten Sie den allgemeinen Controller-Code in OpenCart ein

Wenn Sie in OpenCart auf die Entwicklung von Modulen gestoßen sind, sind Sie möglicherweise mit der Situation konfrontiert, in der Sie einige gemeinsame Elemente in jedem Controller angegeben haben. Denken Sie nicht, dass es schön wäre, wenn Sie den allgemeinen Code irgendwo deklarieren könnten und er bei Bedarf abgeholt wird! In diesem Artikel werden wir also besprechen, wie man allgemeinen Controller-Code einrichtet und diesen über die Module hinweg verwendet.

Für diejenigen, die mit der Modulentwicklung in OpenCart vertraut sind, müssen Sie die allgemeinen Elemente wie Kopf-, Fußzeilen- und Sidebar-Spalten in der Indexmethode der Controller-Klasse einrichten. Obwohl es verschiedene Möglichkeiten gibt, den allgemeinen Code zu zentralisieren, betrachten wir eine OpenCart Weg um das zu erreichen!

Ich gehe davon aus, dass Sie die neueste Version von OpenCart verwenden und mit dem Modulentwicklungsprozess vertraut sind, da wir uns mehr auf das Konzept konzentrieren als auf den grundlegenden Code.

Richten Sie den Common Controller Code ein

Mach weiter und erstelle das Katalog / Controller / Funktionsweise Verzeichnis. Erstellen Sie eine Datei common.php unter diesem Verzeichnis mit folgendem Inhalt.

load-> controller ('common / header'); $ data ['footer'] = $ this-> load-> controller ('common / footer'); $ data ['preaction_text'] = "Ich wurde von der 'Setup'-Methode aus der' allgemeinen 'Controller-Datei festgelegt."; $ args ['controller'] -> $ args ['method'] ($ data, FALSE); 

Ziemlich einfach und unkompliziert zu verstehen! Es initialisiert nur einige Variablen in der $ data Array, außer der letzten Zeile der Konfiguration Methode. Wir werden später darauf zurückkommen, da es das Geheimnis der offenbart $ args Array.

Verstehen Sie den Versandprozess

Bevor wir weiteren Code erstellen, erkläre ich Ihnen kurz, wie das Dispatching in OpenCart funktioniert.

Wenn der Benutzer auf eine URL in OpenCart zugreift, wird die entsprechende URL angezeigt Aktion Objekt wird basierend auf der Instanz instanziiert Route Abfragezeichenfolgevariable. Hier ist der Ausschnitt aus index.php.

// Router if (isset ($ request-> get ['route'])) $ action = new Aktion ($ request-> get ['route']);  else $ action = new Action ('common / home'); 

Und danach das Versand Methode wird aufgerufen.

$ controller-> dispatch ($ action, neue Aktion ('error / not_found'));

Es wird das anrufen Versand Methode in der Datei definiert unter system / engine / front.php. In dieser Methode finden Sie ein Snippet, das die while-Schleife ausführt, bis sie die $ action Wert auf false gesetzt.

while ($ action) $ action = $ this-> ausführen ($ action); 

Wie Sie sehen, wird die in derselben Datei definierte Ausführungsmethode aufgerufen, bis $ action wird als falsch ausgewertet. Das heißt, wenn die Methode des Controllers ein Aktionsobjekt zurückgibt, führt OpenCart diese Aktion aus, bevor Sie fortfahren. Wir könnten dies nutzen und die andere Aktion innerhalb der Aktion selbst aufrufen. Mal sehen, wie wir das schaffen!

Rufen Sie den Common Controller auf und zeigen Sie das Setup an

Nun erstellen wir eine preaction_demo.php Datei unter der preactiondemo Verzeichnis mit folgendem Inhalt.

 $ this, 'method' => 'index'));  if (file_exists (DIR_TEMPLATE. $ this-> config-> get ('config_template'). '/template/preactiondemo/preaction_demo.tpl')) $ this-> antwort-> setOutput ($ this-> load-> view ($ this-> config-> get ('config_template'). '/template/preactiondemo/preaction_demo.tpl', $ data));  else $ this-> response-> setOutput ($ this-> load-> view ('default / template / preactiondemo / preaction_demo.tpl', $ data)); 

Ob $ flag ist wahr, wir werden die Instanz der Aktionsklasse zurückgeben. Wenn der Abfertigungsprozess ein Aktionsobjekt erhält, wird die Aktion mit dieser Aktion fortgesetzt. In diesem Fall ruft es also die Konfiguration Methode der verbreitet Regler. Erinnern Sie sich an die common.php Datei, die wir im vorherigen Abschnitt erstellt haben.

Das Wichtige ist, dass wir vorbeikommen array ('controller' => $ this, 'method' => 'index') als Argument, das schließlich an das erste Argument von übergeben wird Konfiguration Methode in der verbreitet Regler. Es wird uns helfen, wieder auf die Index Methode der preaction_demo Controller nach der Initialisierung von Variablen.

Weiter in der Konfiguration Als Methode haben wir einige gängige Variablen wie Header, Footer usw. definiert. Und schließlich übertragen wir die Steuerung von dort aus auf den ursprünglichen Controller Konfiguration Die Methode wurde mit der folgenden Anweisung aufgerufen.

$ args ['controller'] -> $ args ['method'] ($ data, FALSE);

Natürlich müssen wir die in der Datei initialisierten Variablen übergeben Konfiguration Methode über $ data an den ursprünglichen Controller, damit er dort verwendet werden kann, was der Hauptzweck dieses Artikels ist. Es wird als erstes Argument des obigen Methodenaufrufs übergeben. Das zweite Argument ist sehr wichtig, da es mit dem initialisiert wird $ flag Variable. Wir tun dies absichtlich, um unendliche Schleifen zu vermeiden.

Lassen Sie uns zum Schluss unsere View-Datei unter einrichten catalog / view / theme / default / template / preactiondemo / preaction_demo.tpl mit dem folgenden Code.

 

Nachdem wir das Setup abgeschlossen haben, öffnen Sie die URL http: //youropencartstoreurl/index.php? Route = preactiondemo / preaction_demo in Ihrem Browser. Sie sollten die Nachricht sehen "Ich wurde von der 'setup' -Methode aus der 'allgemeinen' Controller-Datei festgelegt." auf dieser Seite!

Auf diese Weise könnten Sie den allgemeinen Code an einer Stelle einrichten und diese Aktion von den anderen Controllern aufrufen. Sicherlich wird Code-Duplizierung vermieden und es ist einfacher, den Code zu ändern, der in allen Modulen üblich ist.

Fazit

Heute haben Sie in OpenCart einen coolen Trick gelernt: Wie rufen Sie eine Aktion aus der Aktion heraus auf! Natürlich gibt es andere Wege, um das zu erreichen, aber ich habe in letzter Zeit daran gedacht, dass ich es mit Ihnen teilen und Ihr Feedback erhalten sollte!