Modulspezifisches LayoutScript im ZF

Auch wenn durch die Einführung von Zend_Application der Initialisierungsprozess einer Anwendung erheblich beschleunigt wurde, so bleibt noch immer der Wehrmutstropfen, dass in der zentralen application.ini noch immer kein modulspezifisches Layout geladen werden kann, da der Dispatch Prozeß in der Bootstrap-Datei noch nicht gestartet wurde.

Was also tun, wenn wir z.B. für einen Adminbereich ein vollkommen neues LayoutScript benötigen? Genau vor dieser Frage stand ich heute schon den ganzen Tag und wenn das Zend Framework schon ziemlich weit verbreitet ist, waren mit Hilfe der Suchmaschinen nur wenige Informationen zu diesem Thema zu finden.

Aktuell sieht der Layout-Abschnitt meiner application.ini wie folgt aus:

resources.layout.layout = "default"
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"

Zunächst hatte ich daran gedacht, das neue Layout in jedem Controller des Adminbereiches innerhalb der Methode init() zu setzen, doch das würde ja bedeuten, dass ich allen Controllern den gleichen Code hinterlegen muss und das wäre wohl ziemlich ineffektiv.

Die Lösung wäre also, denn Code automatisch bei jedem Aufruf des Admin-Moduls zu starten um so das LayoutScript zentral für alle abhängigen Controller zu setzen. Leider kommt man immer viel zu spät auf die Möglichkeit, den FrontController mit Hilfe von Plugins zu erweitern und so hat es auch bei mir eine ganze Weile gedauert, bis auf die folgende Lösung gekommen bin.

/**
 * @author Sascha Schoppengerd
 */
class MyApp_Controller_Plugin_Layout extends Zend_Controller_Plugin_Abstract {
    
    /**
     * @see Zend_Controller_Plugin_Abstract#postLoopStartup($request)
     */
    public function postDispatch(Zend_Controller_Request_Abstract $request) {
        // Neues Layout für den Adminbereich setzen
        if ($request->getModuleName() == 'admin') {
            
            $Layout = Zend_Layout::getMvcInstance();
            $Layout->setLayout('admin');
			
            $view = $Layout->getView();
            $view->headTitle('Der neue Title der Seite', 'SET');
        }
    }
}

Sicherlich gibt es noch viele andere Möglichkeiten, ein neues LayoutScript während der Laufzeit für ein bestimmtes Modul zu setzen, doch diese Variante hat sich zumindest in meinen heutigen Tests bewährt und so hoffe ich, dass dieser Tip in Zukunft dem ein oder anderem Leser weiterhelfen wird.

1 comment for “Modulspezifisches LayoutScript im ZF

  1. werner
    21. Dezember 2009 at 11:37

    Danke für den Artikel. Hat sofort funktioniert.

    Wenn das Layout Script aber im Modulordner liegen soll muss man folgendes dazuschreiben:

    $Layout->setLayoutPath(APPLICATION_PATH.“/admin/layouts/“);

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.