Überschreiben in Magento verstehen Controller

Im dritten und letzten Artikel dieser überschreibenden Magento-Serie werde ich erklären, wie Core-Controller-Dateien überschrieben werden. In den beiden vorigen Artikeln dieser Serie wurde das Überschreiben von Kerndateien für Blöcke und Modelle durch Erstellen eines benutzerdefinierten Moduls beschrieben. In diesem Lernprogramm werden die Core Controller-Dateien überschrieben.

Warum Controller außer Kraft setzen?

In Magento ist der Controller für die Verarbeitung eingehender Anforderungen verantwortlich und er ist ein Rückgrat der Routing-Implementierung von Magento. Um wahrscheinlich jede Anforderung in Magento zu bearbeiten, definiert der Controller verschiedene Aktionen in Form von Controller-Klassenmethoden. Das Controller-Aktionsverfahren umfasst eine verwandte Anwendungslogik, die mit Ansichten und Modellen interagiert, um die Ausgabe dieser bestimmten Seite vorzubereiten. Manchmal müssen Sie den Ablauf der Controller-Ausführung ändern, um benutzerdefinierten Code einzufügen oder den Kerncode zu ändern.

Wie ich bereits im vorherigen Tutorial gesagt habe, wird es nie empfohlen, Core-Dateien direkt zu ändern, da dies die Aktualisierung von Magento sehr schwierig macht. Um dies zu vermeiden, sollten wir uns an die Standardmethode halten, um gewünschte Änderungen an Kerndateien vorzunehmen: Wir sollten entweder Ereignisbeobachter verwenden oder Kerndateien mit unseren benutzerdefinierten Moduldateien überschreiben. Wir werden heute die übergeordnete Funktion besprechen.

In diesem Lernprogramm erstellen wir ein benutzerdefiniertes Modul, um zu verstehen, wie das Überschreiben von Controllern in Magento funktioniert. In diesem benutzerdefinierten Modul erfahren Sie, wie Sie eine Controller-Klasse "Product" des Kernmoduls "Catalog" überschreiben. Das Überschreiben funktioniert, indem bestimmte XML-Tags gemäß den Konventionen von Magento eingerichtet werden.

Ich gehe davon aus, dass Sie mit dem grundlegenden Modulerstellungsprozess in Magento vertraut sind. Wenn nicht, können Sie sich auf diesen Artikel zur Erstellung benutzerdefinierter Module beziehen. 

Ein Blick auf das Setup

Hier ist die Liste der Dateien, die für das gewünschte Setup erforderlich sind:

  • app / etc / modules / Envato_All.xml: Dies ist eine Datei, die zum Aktivieren unseres benutzerdefinierten Moduls verwendet wird.
  • app / code / local / Envato / Catalog / etc / config.xml: Es handelt sich um eine Modulkonfigurationsdatei, in der die Controller-Klasse mit bestimmten Tags gemäß den Magento-Konventionen überschrieben wird.
  • app / code / local / Envato / Katalog / Steuerungen / ProductController.php: Es handelt sich um eine benutzerdefinierte Controller-Klassendatei, mit der wir die zentrale Controller-Klasse "Product" überschreiben.

Dateien und Ordner erstellen: Benutzerdefiniertes Modul

Zuerst müssen wir eine Modul-Enabler-Datei erstellen. Erstellen Sie eine Datei "app / etc / modules / Envato_All.xml" und fügen Sie den folgenden Inhalt in diese Datei ein. Wir haben gebraucht Envato als unser Modul-Namensraum und Katalog als unser Modulname. Das Modul "Katalog" wird standardmäßig aktiviert.

    wahr lokal   

Als Nächstes müssen wir eine Modulkonfigurationsdatei erstellen. Erstellen Sie "app / code / local / Envato / Catalog / etc / config.xml" und fügen Sie den folgenden Inhalt in diese Datei ein.

    1,0        Envato_Catalog      

Zuerst haben wir eine Modulversionsnummer mit der definiert  Etikett. Das Tag ist der Name des Front-Controller-Routers des "Catalog" -Kernmoduls. Sie informiert das Routing-System, dass wir die Controller des Moduls "Katalog" überschreiben möchten. 

Endlich, das Envato_Catalog tag wird verwendet, um das Magento-Routing-System zu informieren, dass es die Controller-Dateien Ihres benutzerdefinierten Moduls laden soll, falls verfügbar. Natürlich werden die Kerndateien des Moduls "Katalog" geladen, wenn sie nicht unter Ihrem Modul gefunden werden können.

Schließlich bleibt nur noch die Definition einer Controller-Klasse Envato_Catalog_ProductController. Erstellen wir eine Controller-Datei "app / code / local / Envato / Catalog / controller / ProductController.php" und fügen Sie den folgenden Inhalt in diese Datei ein.

getRequest () -> getParam ('category', false); $ productId = (int) $ this-> getRequest () -> getParam ('id'); $ defineOptions = $ this-> getRequest () -> getParam ('options'); // Helper und Params vorbereiten $ viewHelper = Mage :: helper ('catalog / product_view'); $ params = new Varien_Object (); $ params-> setCategoryId ($ categoryId); $ params-> setSpecifyOptions ($ defineOptions); // Seite rendern try $ viewHelper-> preparAndRender ($ productId, $ this, $ params);  catch (Ausnahme $ e) if ($ e-> getCode () == $ viewHelper-> ERR_NO_PRODUCT_LOADED) if (isset ($ _ GET ['store']) &&! $ this-> getResponse () -> isRedirect ()) $ this -> _ redirect ("); elseif (! $ this-> getResponse () -> isRedirect ()) $ this -> _ forward ('noRoute'); else Mage :: logException ($ e); $ this -> _ forward ('noRoute');

Wir haben eine definiert Envato_Catalog_ProductController Klasse, die den Kern erweitert Mage_Catalog_ProductController Controller-Klasse des Catalog-Moduls. Das Wichtigste dabei ist, dass wir die Core-Controller-Datei "Mage / Catalog / controller / ProductController.php" vor der Klassendefinition eingefügt haben, da Magento diese nicht automatisch enthält.

Im obigen Beispiel haben wir das überschrieben viewAction Methode der Mage_Catalog_ProductController Klasse. Das bedeutet, dass eine Produktdetailseite immer dann aufgerufen wird, wenn sie im Frontend angezeigt wird viewAction Methode, die in Ihrer benutzerdefinierten Controller-Klasse definiert ist. Sie können also den in dieser Methode definierten Code entsprechend Ihren Anforderungen ändern.

Fazit

So haben wir heute gelernt, wie Sie die Core-Controller-Dateien mit einem benutzerdefinierten Modul in Magento überschreiben. Ich hoffe, Sie haben diese Serie genossen und etwas Nützliches gelernt, das Sie in Ihren Code integrieren können! Teilen Sie Ihre Fragen und Vorschläge mit dem untenstehenden Feed!