LKC_ModularRouters - Magento Commerce

So sehr ich die Magento API auch liebe, Controller zu verändern ist (bisher) eines der nervtötensten Dinge beim programmieren von Extensions. Die im Wiki empfohlene Variante den URL Pfad umzuschreiben ist schwer zu verstehen (zumindest für mich), und hat unerwünschte Nebeneffekte, z.B. wenn Links gerendert werden (die Methode Mage->getUrl(’*/*/xyz’) setzt den neuen Controller Pfad ein statt dem Original).
Ein weiterer Punkt über den ich mich mehr als ein mal geärgert habe, ist das Layout Updates nicht mehr aufgerufen werden, bzw. die Update Handles erst in eine eigene Layout Datei übernommen werden müssen. Nicht schön!

Es gibt zwar noch etwas hackische Wege das Problem etwas besser zu lösen, aber die lohnt es jetzt nicht mehr aufzuführen, denn: mein Freund Lee Saferite hat ein Modul veröffentlicht, mit dem die oben genannten Probleme (und noch mehr!) gelöst sind.

Ich möchte das Wissen um diese hervorragende Erweiterung gerne verbreiten. Wenn genügend Module darauf aufbauen, wer weiß, vielleicht wird der Code in den Core übernommen.

Außerdem erstaunt mich Lee immer wieder mit seinen Lösungen. Ich lerne sehr viel von Ihm.

Dies ist eine freie Übersetzung seines ersten Teils der Dokumentation (Original auf Englisch, Übesetzung mit seiner Zustimmung). Sobald er mehr schreibt füge ich das an.

Vinai

Hier der Text von Lee:


 

Bevor dieses Modul veröffentlicht wurde, musste man um das Verhalten eines Core Controllers (z.B. Mage_Customer_AccountController) zu verändern URL rewriting benutzen.

Jetzt, mit der Erweiterung LKC_ModularRouters kannst Du Controller genau wie Models, Blocks oder Helper behandeln.

Wenn du einen Controller für den neuen Router schreibst musst du den Namen der Klasse nicht länger mit „Controller“ enden, aber die Klasse muss eine Instanz von Mage_Core_Controller_Varien_Action bilden.
Im Code weiter unten erweitern wir Mage_Customer_AccountController, welche Mage_Core_Controller_Front_Action vererbt, welche wiederum Mage_Core_Controller_Varien_Action vererbt.

In unserem neuen Controller werden wir eine einzige Methode, loginAction(), überschreiben um eigenen Code hinzuzufügen. Dann haben wir die Möglichkeit die parent Action aufzurufen wenn wir wollen.

Zuerst müssen wir Magento wissen lassen das unser Modul von LKC_ModularRouters abhängig ist.

<?xml version="1.0"?>
    <config>
        <modules>
            <MyCompany_MyModule>
                <active>true</active>
                <codePool>local</codePool>
                <depends>
                    <Mage_Core />
                    <Mage_Customer />
                    <LKC_ModularRouters />
                </depends>
        </MyCompany_MyModule>
    </modules>
</config>

app/etc/modules/MyCompany_MyModule.xml

Als nächstes müssen wir unseren neuen Controller anlegen. Dieser erweitert Mage_Customer_AccountController

// Dies ist nötig da Varien ein layout benutzt das sich nicht einfach auto-loaden lässt
require_once "Mage/Customer/controllers/AccountController.php";
 
class MyCompany_MyModule_Controller_Frontend_Customer_Acount extends Mage_Customer_AccountController
{
    public function loginAction()
    {
        // Dein Code hier
 
        // Du kannst auch die parent action aufrufen falls nötig
        parent::loginAction();
    }
}

app/code/local/MyCompany/MyModule/Controller/Frontend/Customer/Account.php

Und letztlich, anstatt die URL umzuschreiben, benutzen wir die selbe Methode um den Controller zu überschreiben wie bei Modellen und Blöcken.

<?xml version="1.0"?>
<config>
    <modules>
        <MyCompany_MyModule>
            <version>0.0.1</version>
        </MyCompany_MyModule>
    </modules>
    <global>
        <controllers>
            <Mage_Customer>
                <rewrite>
                    <account>MyCompany_MyModule_Controller_Frontend_Customer_Acount</account>
                </rewrite>
            </Mage_Customer>
        </controllers>
    </global>
</config>

app/code/local/MyCompany/MyModule/etc/config.xml

Und das war schon alles. Hiermit hast Du eine saubere Methode Core Controller zu überschreiben.

Derzeit kann noch nicht die kurze „Shorthand“ Schreibweise eines Moduls benutzt werden, es muss der ganze Name verwendet werden. Das wird in Kürze anders sein.

Diese Seite Bookmarken:
  • Digg
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • LinkArena
  • MisterWong
  • TwitThis
  • Live
  • MySpace
  • Print this article!
  • StumbleUpon
  • Technorati
  • Webnews.de
  • Wikio

Related posts:

  1. TYPO3 meets MAGENTO-COMMERCE Auf der Suche nach einer schönen Shopextension für TYPO3 bin...

Related posts brought to you by Yet Another Related Posts Plugin.

5 Comments

Dr. WeisenheimerFebruar 24th, 2009 at 11:50

Cooler Artikel! :-D

EichiMärz 18th, 2009 at 14:49

Jepp, cooler Artikel. Funktioniert nur nicht :/

FrankMärz 18th, 2009 at 19:30

Was funktioniert daran nicht? Wie wär’s denn mal mit einer Fehlermeldung?!

Mario H.März 24th, 2009 at 10:49

Coole Sache. Hätte ich früher wissen müssen…
Andererseits: ist es sinnvoll, eigene Ext in so einem Maße von Fremd-Entwicklungen abhängig zu machen? Ich weiß es nicht…

Marlene TruderoJuli 15th, 2009 at 15:10

Interessanter Ansatz, der zu verfolgen w

Leave a comment

Your comment