Controller überschreiben: Wann, Warum und Wie?

Das "C" im Magento zugrunde liegende MVC-Ansatz steht, wie sollte es anders sein, für Controller. Ein Controller fungiert im grundlegenden als Vermittler zwischen Model, View, und im speziellen Magento-Umfeld von Blöcken. Er reagiert auf Benutzeranfragen und ruft die jeweiligen Methoden und Layouts auf sodass der Benutzer am Ende ein Ergebnis zur Anzeige erhält. Diese Controller lassen sich in Magento mit ein wenig XML überschreiben - in welchen Situationen das Sinn macht und in welchen nicht erklären wir im folgenden Beitrag.

In der Regel erfüllen Controller spezielle Aufgaben. Diese haben grundlegenden etwas mit Ihren Namen zu tun. So kümmert sich der Product-Controller um die Darstellung von Produkten und der Checkout-Controller um den "zur Kasse"-Prozess. Controller sollten nur überschrieben werden wenn der Controller eine gleichartige Aufgabe auf eine andere Art erledigen soll. Werden Produkte z.B. nur im Detail angezeigt wenn der Benutzer eingeloggt ist wäre es eine Möglichkeit hier Einfluss auf den Controller zu nehmen. In diesem Fall erfüllt der Controller weiterhin seine Ursprungsaufgabe jedoch in etwas abgewandelter Weise. Bei neuartigen Aufgaben werden selbstverständlich neue Controller verwendet und nicht bestehende bis zur Unkenntlichkeit verändert.

Den Controller überschreiben

Für den Fall wir also einen bestehenden Controller verändern müssen bietet Magento diese Möglichkeit über ein wenig XML-Code in der config.xml unseres Modules an:

<frontend>
	<routers>
		<catalog>
			<args>
				<modules>
					<webguys_example before="Mage_Catalog">Webguys_Example</webguys_example>
				</modules>
			</args>
		</catalog>
	</routers>
</frontend>

Dieser XML-Code fügt im Suchpfad der Router von Magento vor Mage_Catalog unser Modul ein. Das bewirkt das Magento zuerst in unserem Controller-Ordner prüft ob ein passender Controller vorhanden ist. Erst danach schaut Magento im Modul Mage_Catalog nach. Erstellen wir nun in app/code/local/Webguys/Example/controllers den Controller mit dem Namen CategoryController.php überschreiben wir den Basiscontroller von Magento:

<?php
include_once("Mage/Catalog/controllers/CategoryController.php");

class Webguys_Example_CategoryController extends Mage_Catalog_CategoryController {
	public function viewAction() {
		die("Implementieren wir doch die View-Action neu!");
	}
}

Um die Standardfunktionen vom Ursprungscontroller zu erben ist ein kleiner Trick von Nöten: Der Ursprungscontroller muss manuell mittels Include eingebunden werden da Magento bzw. das Zend-Framework prinzipiell Controller nicht automatisch lädt.

Ist das Modul richtig in Magento eingebunden erhält man nun, sobald die View-Action des Category-Controller aufgerufen wird, anstelle der Category die Ausgabe "Implementieren wir doch die View-Action neu!". Eine sinnvolle Implementierung fehlt somit und ist nicht Bestandteil dieses Beispiels.

[wgAddVersion version="1.4.1.1"]



Ein Beitrag von Tobias Vogt
Tobias's avatar

Tobias Vogt arbeitet seit 2008 mit Magento und ist seit 2011 durch Magento zertifizierter Entwickler. Seit 2016 ist er Mitgründer und CTO bei der connect-io GmbH, einer Magento-Agentur mit Sitz im idyllischen Paderborn-Salzkotten. Er gehört zum Gründer-Team der Webguys und ist seit November 2011 Bachelor of Science (Wirtschaftsinformatik). Sie erreichen Ihn per E-Mail unter tobi@webguys.de.

Alle Beiträge von Tobias

Kommentare
Mit PreDispatch Controller-Actions ändern | Magento eCommerce, Shop - webguys.de am

[...] Core-Controller umzuleitenfühlt sich irgendwie nicht so richtig schick an. Alleine deswegen weil eine merkwürdige [...]

Dein Kommentar