Programmer's Reference Guide

Action Kontroller

Action Helfer

Einführung

Aktion Helfer erlauben Entwicklern Runtime und/oder On-Demand Funktionalität in jeden Aktion Kontroller zu inizieren der Zend_Controller_Action erweitert. Aktion Kontroller versuchen den Notwendigkeit zu minimieren, den abstrakten Aktion Kontroller zu erweitern um damit normale Aktion Kontroller Funktionen inizieren.

Es gibt eine Menge an Wegen um Aktion Helfer zu verwenden. Aktion Helfer verwenden ein Broker System, ähnlich den Typen von Brokern in Zend_View_Helpers, und denen von Zend_Controller_Plugin. Aktion Helfer (wie Zend_View_Helpers) können bei Bedarf geladen und aufgerufen werden, oder Sie können wärend der Anfragezeit (Bootstrap) instanziert werden oder wären der Erstellungszeit des Aktion Kontrollers (init()). Um Sie näher zu verstehen, betrachten wir Ihre Verwendung in der folgenden Sektion.

Helfer Initialisierung

Ein Helfer kann auf vielen verschiedenen Wegen initialisiert werden, basierend auf den eigenen Bedürfnissen und den Funktionalitäten dieses Helfers.

Ein Helfer Broker wir das der $_helper Teilnehmer von Zend_Controller_Action gespeichert; der Broker kann verwendet werden um Helfer zu empfangen oder aufzurufen. Einige Methoden das zu tun sind:

  • Explizit getHelper() verwenden. Ihm einfach einen Namen übergeben und ein Helfer Objekt wird zurückgegeben:

    <?php
    $flashMessenger = $this->_helper->getHelper('FlashMessenger');
    $flashMessenger->addMessage('Wir haben in der letzten Anfrage etwas getan');
                    
  • Verwenden der __get() Funktionalität des Helfer Brokers und empfangen des Helfers wie wenn er eine Teilnehmer Eigenschaft des Brokers wäre:

    <?php
    $flashMessenger = $this->_helper->FlashMessenger;
    $flashMessenger->addMessage('Wir haben in der letzten Anfrage etwas getan');
                    
  • Letztendlich implmentieren die meisten Aktion Helfer die direct() Methode welche eine spezielle, Standardmethode im Helfer aufruft. In Beispiel des FlashMessengers, wird addMessage() aufgerufen:

    <?php
    $this->_helper->FlashMessenger('Wir haben in der letzten Anfrage etwas getan');
                    

Hinweis: Alle oben angeführten Beispiel sind funktionell gleichwertig.

Man kann Helfer auch explizit instanzieren. Das kann gewollt sein wenn der Helfer ausserhalb eines Aktion Kontrollers verwendet werden soll, oder wenn ein Helfer an einen Helfer Broker übergeben wird um Ihn durch irgendeine Aktion zu verwenden. Instanziert wird er wie jede andere PHP Klasse.

Der Helfer Broker

Zend_Controller_Action_HelperBroker behandelt die Details der Registrierung von Helfer Objekten und Helfer Pfaden, sowie dem Empfangen von Helfern bei Befarf.

Um einen Helfer im Browser zu registrieren, kann addHelper verwendet werden:

<?php
Zend_Controller_Action_HelperBroker::addHelper($helper);
        

Natürlich ist das Instanzieren und übergeben von Helfern an den Broker etwas Zeit- und Ressourcen intensiv, weswegen twei Methoden existieren um die Dinge etwas zu automatisieren: addPrefix() und addPath().

  • addPrefix() nimmt einen Klassenprefix und verwendet Ihn um einen Pfad zu ermitteln wo Helferklassen definiert wurden. Er nimmt an das der Prefix den Konventionen der Benamung von Klassen im Zend Frameworks folgt.

    <?php
    // Helfer mit vorangestelltem My_Action_Helpers in My/Action/Helpers/ hinzufügen
    Zend_Controller_Action_HelperBroker::addPrefix('My_Action_Helpers');
                    
  • addPath() nimmt ein Verzeichnis als erstes Argument und einen Klassenprefix als zweites Argument (Standardwert ist 'Zend_Controller_Action_Helper'). Das erlaubt es die eigenen Klassenprefixes mit speziellen Verzeichnissen zu verbinden.

    <?php
    // Helfer mit vorangestelltem Helper in Plugins/Helpers/ hinzufügen
    Zend_Controller_Action_HelperBroker::addPath('./Plugins/Helpers', 'Helper');
                    

Da diese Methoden statisch sind, können Sie zu jeder Zeit in der Kontrollerkette aufgerufen werden um Helfer dynamisch hinzuzufügen wenn es notwendig wird.

Um zu ermitteln ob ein Helfer im Helfer Broker existiert, kann hasHelper($name) verwendet werden, wobei $name der Kurzname des Helfers ist (ohne das Prefix):

<?php
// Prüft ob der 'redirector' Helfer im Broker registriert ist:
if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
    echo 'Der Redirector Helfer ist registriert';
}
        

Schlußendlich, um einen registrierten Helfer vom Broker zu entfernen, kann removeHelper($name) verwendet werden, wobei $name der Kurzname des Helfers ist (ohne den Prefix):

<?php
// Wenn vorhanden, entferne den 'redirector' Helfer vom Broker:
if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
    Zend_Controller_Action_HelperBroker::removeHelper('redirector')
}
        

Eingebaute Aktions Helfer

Zend Framework inkludiert standardmäßig drei Aktions Helfer: einen FlashMessenger für die Handhabung von Flash Nachrichten; einen Redirector, um verschiedene Implementationen, für das Umleiten zu internen und externen Seiten, für die Anwendung bereitzustellen und einen ViewRenderer um den Prozess des Setzens eines View Objekts im Kontroller und dem Rendern von Views zu automatisieren.

FlashMessenger

Einführung

Der FlashMessenger Helfer erlaubt es Nachrichten zu übergeben die ein Benutzer bei der nächsten Anfrage sehen können soll. Um das durchführen zu können, berwendet FlashMessenger den Zend_Session_Namespace um Nachrichten für die Zukunft oder den nächsten Empfang einer Anfrage zu speichern. Es ist generell eine gute Idee, das wenn man plant Zend_Session oder Zend_Session_Namespace zu verwenden, diese mit Zend_Session::start() in der Bootstrap Datei zu initialisieren. (Siehe die Zend_Session Dokumentation für weitere Details über die Verwendung)

Beispiel einer standardmäßigen Verwendung

Das Anwendungsbeispiel von unten zeigt die Verwendung einer Flash Nachricht und Ihre Grundlagen. Wenn die Aktion /some/my aufgerufen wird, fügt Sie die Flash Nachricht "Eintrag gespeichert!" hinzu. Eine weitere Anfrage zu der Aktion /some/my-next-request empfängt Sie (und löscht Sie auch).

<?php
class SomeController extends Zend_Controller_Action
{
    /**
     * FlashMessenger
     *
     * @var Zend_Controller_Action_Helper_FlashMessenger
     */
    protected $_flashMessenger = null;

    public function init()
    {
        $this->_flashMessenger = $this->_helper->getHelper('FlashMessenger');
        $this->initView();
    }

    public function myAction()
    {
        /**
         * default method of getting Zend_Controller_Action_Helper_FlashMessenger
         * instance on-demand
         */
        $this->_flashMessenger->addMessage('Eintrag gespeichert!');
    }

    public function myNextRequestAction()
    {
        $this->view->messages = $this->_flashMessenger->getMessages();
        $this->render();
    }
}
        

Redirector

Einführung

Der Redirector Helfer erlaubt die Verwendung eines Redirector Objektes um die Notwendigkeiten der Anwendung für das Umleiten zu einer neuen URL zu erfüllen. Er bietet vielfache Vorteile gegenüber der _redirect() Methode. Er ist zum Beispiel fähig seitenweises Verhalten im Redirector Objekt vorzudefinieren oder bietet ein eingebautes goto($action, $controller, $module, $params) Interface ähnlich dem von Zend_Controller_Action::_forward().

Der Redirector hat eine Anzahl von Methoden die verwendet werden können um das Verhalten beim Umleiten zu beeinflussen:

  • setCode() kann verwendet werden um den HTTP Antwort Code zu setzen der wärend des Umleitens verwendet werden soll.

  • setExit() kann verwendet werden um ein exit() nach einer Umleitung zu erzwingen. Standardmäßig ist dieser aktiviert.

  • setGoto() kann verwendet werden um eine Standard URL zu setzen die verwendet wird wenn keine an goto() übergeben wird. Verwendet die API von Zend_Controller_Action::_forward(): setgoto($action, $controller = null, $module = null, array $params = array());

  • setGotoRoute() kann verwendet werden um eine URL basierend auf einer registrierten Route zu setzen. Übergeben in einem Array von Schlüssel/Werte Paaren und einem Routernamen, wird die URL anhand des Routertyps und der Definition zusammengebaut.

  • setGotoUrl() kann verwendet werden um eine Standard URL zu setzen die verwendet wird wenn keine an gotoUrl() übergeben wird. Akzeptiert einen einzelnen URL String.

  • setPrependBase() kann verwendet werden um die BasisURL des Anfrage Objektes einer mit setGotoUrl(), gotoUrl() oder gotoUrlAndExit() definierten URL, voranzustellen.

  • setUseAbsoluteUri() kann verwendet werden um den Redirector dazu zu zwingen absolute URIs zu verwenden wenn umgeleitet wird. Wenn diese Option gesetzt ist, verwendet Sie den Wert von $_SERVER['HTTP_HOST'], $_SERVER['SERVER_PORT'], und $_SERVER['HTTPS'] um eine komplete URI zur, durch eine der Umleitungsmethoden, spezifizierten URL zu erstellen. Diese Option ist standardmäßig ausgeschaltet, kann aber in späteren Releases standardmäßig eingeschaltet sein.

Zusätzlich gibt es eine Reihe von Methoden im Redirector für die Bearbeitung der aktuellen Umleitungen:

  • goto() verwendet setGoto() (_forward()-ähnlcihe API) um eine URL zu erstellen und eine Umleitung durchzuführen.

  • gotoRoute() verwendet setGotoRoute() (route-assembly) um eine URL zu erstellen und eine Umleitung durchzuführen.

  • gotoUrl() verwendet setGotoUrl() (URL string) um eine URL zu erstellen und eine Umleitung durchzuführen.

Letztendlich kann die aktuelle Umleitungs URL jederzeit festgestellt werden durch Verwendung von getRedirectUrl().

Beispiel für die grundsätzliche Verwendung

Beispiel #1 Optionen setzen

Dieses Beispiel überschreibt diverse Optionen, inklusive dem Setzen des HTTP Statuscodes und dessen Verwendung in der Umleitung ('303'), nicht abbrechen der Umleitung und definieren einer Standard URL die beim Umleiten verwendet wird.

<?php
class SomeController extends Zend_Controller_Action
{
    /**
     * Redirector - definiert zur Komplettierung des Codes
     *
     * @var Zend_Controller_Action_Helper_Redirector
     */
    protected $_redirector = null;

    public function init()
    {
        $this->_redirector = $this->_helper->getHelper('Redirector');

        // Setzt die Standardoptionen für die Umleitung
        // Da das Objekt in der Helferanwendung registriert ist, wird diese für alle Aktionen ab diesem
        // Zeitpunkt relevant
        $this->_redirector->setCode('303')
                          ->setExit(false)
                          ->setGoto("this-action", "some-controller");
    }

    public function myAction()
    {
        /* Mach was */

        // Umleiten zu einer vorher definierten URL, und einen Ausstieg erzwingen der stattfindet sobald das getan
        // wurde:
        $this->_redirector->redirectAndExit();
        return; // wird nie erreicht
    }
}
            

Beispiel #2 Standardwerte verwenden

Diese Beispiel nimmt an das die Standardwerte verwendet werden, was bedeutet das jede Umleitung in einem sofortigen exit() resultiert.

<?php
// ALTERNATIVES BBISPIEL
class AlternativeController extends Zend_Controller_Action
{
    /**
     * Redirector - definiert zur Komplettierung des Codes
     *
     * @var Zend_Controller_Action_Helper_Redirector
     */
    protected $_redirector = null;

    public function init()
    {
        $this->_redirector = $this->_helper->getHelper('Redirector');
    }

    public function myAction()
    {
        /* Mach was */

        $this->_redirector->gotoUrl('/my-controller/my-action/param1/test/param2/test2');
        return; // wird nie erreicht da standardmäßig gegangen und beendet wird
    }
}
            

Beispiel #3 Verwenden von goto()'s _forward() API

goto()'s API entspricht der von Zend_Controller_Action::_forward(). Der primäre Unterschied ist das Sie eine URL von den übergebenen Parametern erstellt und das Standardformat :module/:controller/:action/* des Standardrouters verwendet. Dann leitet es um statt die Aktion zu verketten.

<?php
class ForwardController extends Zend_Controller_Action
{
    /**
     * Redirector - definiert zur Komplettierung des Codes
     *
     * @var Zend_Controller_Action_Helper_Redirector
     */
    protected $_redirector = null;

    public function init()
    {
        $this->_redirector = $this->_helper->getHelper('Redirector');
    }

    public function myAction()
    {
        /* Mach was */

        // Umleiten zu 'my-action' von 'my-controller' im aktuellen Modul, und verwenden der Parameter
        // param1 => test und param2 => test2
        $this->_redirector->goto('my-action', 'my-controller', null, array('param1' => 'test', 'param2' => 'test2'));
    }
}
            

Beispiel #4 Verwenden von Routen die mit gotoRout() zusammengebaut wurden

Das folgende Beispiel verwendet die assemble() Methode des Router's um eine URL zu erstellen die auf einem assoziativen Array von Parametern basiert das übergeben wurde. Es nimmt an das die folgende Route registriert wurde:

<?php
$route = new Zend_Controller_Router_Route(
    'blog/:year/:month/:day/:id',
    array('controller' => 'archive', 'module' => 'blog', 'action' => 'view')
);
$router->addRoute('blogArchive', $route);
            

Angenommen ein Array hat year auf 206 gesetzt, month auf 4, day auf 24, und id auf 42, dann würde dieses eine URL wie die folgende erstellen: /blog/2006/4/24/42.

<?php
class BlogAdminController extends Zend_Controller_Action
{
    /**
     * Redirector - definiert zur Komplettierung des Codes
     *
     * @var Zend_Controller_Action_Helper_Redirector
     */
    protected $_redirector = null;

    public function init()
    {
        $this->_redirector = $this->_helper->getHelper('Redirector');
    }

    public function returnAction()
    {
        /* Mach was */

        // Umleiten zum Blog Archiv. Erstellt die folgende URL:
        // /blog/2006/4/24/42
        $this->_redirector->gotoRoute(
            array('year' => 2006, 'month' => 4, 'day' => 24, 'id' => 42),
            'blogArchive'
        );
    }
}
            

ViewRenderer

Einführung

Der ViewRenderer Helfer wurde designt um die folgenden Ziele erfüllen:

  • Entfernen der Notwendigkeit View Objekte innerhalb der Kontroller zu instanzieren; View Objekte werden automatisch mit dem Kontroller registriert.

  • Automatisch View Skript, Helfer und Filter Pfade setzen basierend auf dem aktuellen Modul, und den aktuellen Modulnamen automatisch als Klassenprefix für Helfer und Filterklassen assoziieren.

  • Ein global vorhandenes View Objekt für alle bearbeitenden Kontroller und Aktionen erstellen.

  • Dem Entwickler erlauben das Standard View Rendering Optionen für alle Kontroller gesetzt werden.

  • Die Fähigkeit hinzufügen das ein View Skript ohne Intervention automatisch gerendert wird.

  • Dem Entwickler erlauben seine eigenen Spezifikationen, für den View Basisnamen und für View Skriptpfade, zu erstellen.

Hinweis: Wenn man ein _forward(), eine Umleitung, oder ein render manuell durchführt, wird kein automatisches rendern erfolgen, da man beim Ausführen von jeder dieser Aktionen dem ViewRenderer mitteilt das man seine eigene Ausgabe durchführen will.

Hinweis: Der ViewRenderer ist standardmäßig aktiviert. Man kann Ihn über den Parameter noViewRenderer des Frontkontrollers deaktivieren ($front->setParam('noViewRenderer', true)) oder den Helfer vom Helfer Broker Stack entfernen (Zend_Controller_Action_HelperBroker::removeHelper('viewRenderer')).
Wenn man Einstellungen vom ViewRenderer vor der Ausführung des Front Kontrollers ändern will, kann das auf zwei Wegen getan werden:

  • Instanzieren und Registrieren eines eigenen ViewRenderer Objekts und dieses an den Helfer Broker übergeben:

    <?php
    $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
    $viewRenderer->setView($view)
                 ->setViewSuffix('php');
    Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
                        
  • Initialisieren und/oder empfangen eines ViewRenderer Objekts auf Wunsch über den Helfer Broker:

    <?php
    $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
    $viewRenderer->setView($view)
                 ->setViewSuffix('php');
                        

API

In seiner einfachsten Verwendung, kann der ViewRenderer ganz einfach instanziert und an den Aktion Helfer Broker übergeben werden. Der einfachste Weg Ihn auf einmal zu Instanzieren und Registrieren ist es, die Methode getStaticHelper() des Helfer Brokers zu verwenden:

<?php
Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
        

Das erste Mal wenn ein Aktion Kontroller instanziert wird, triggert er den ViewRenderer ein View Objekt zu instanzieren. Jedes Mal wen ein Kontroller Instanziert wird, wird die init() Methode des ViewRenderer's aufgerufen, was dazu führt das er die view Eigenschaft des Aktion Kontrollers setzt, und addScriptPath(), mit einem Pfad relativ zum aktuellen Modul, aufruft; das wird mit einem Klassenprefix aufgerufen der nach dem aktuellen Modul benannt ist, was effektiv für alle Helfer und Filterklassen die im Modul definiert werden den Namensraum setzt.

Jedes Mal wenn postDispatch() aufgerufen wird, ruft dieses render() für die aktuelle Aktion auf.

Als Beispiel kann die folgende Klasse angenommen werden:

<?php
// Eine Kontroller Klasse, foo Modul:
class Foo_BarController extends Zend_Controller_Action
{
    // Rendert standardmäßig bar/index.phtml; keine Aktion benötigt
    public function indexAction()
    {
    }

    // Rendert bar/populate.phtml mit der Variable 'foo' gesetzt auf 'bar'.
    // Da View Objekte beim preDispatch() definiert werden, sind diese bereits vorhanden.
    public function populateAction()
    {
        $this->view->foo = 'bar';
    }
}

...

// In einem der View Sktipte:
<?php $this->foo(); // Foo_View_Helper_Foo::foo() aufrufen
        

Der ViewRenderer definiert auch eine Anzahl von Zugriffspunkten im das Setzen und Empfangen von View Optionen zu erlauben:

  • setView($view) erlaubt das Setzen des View Objektes für den ViewRenderer. Er wird als öffentliche Klasseneigenschaft $view gesetzt.

  • setNeverRender($flag = true) kann verwendet werden um das automatische rendern global ein- oder auszuschalten, z.B. für alle Kontroller. Wenn er auf true gesetzt wird, ruft postDispatch() nicht automatisch render() im aktuellen Kontroller auf. getNeverRender() empfängt den aktuellen Wert.

  • setNoRender($flag = true) kann verwendet werden um das automatische rendern ein- oder auszuschalten. Wenn er auf true gesetzt wird, wird postDispatch() render() im aktuellen Kontroller nicht automatisch aufrufen. Diese Einstellung wird jedesmal zurückgesetzt wenn preDispatch() aufgerufen wird (z.B. muß dieses Flag für jeden Kontroller gesetzt werden für den das automatische rendern nicht automatisch stattfinden soll). getNoRender() empfängt den aktuellen Wert.

  • setNoController($flag = true) kann verwendet werden um render() zu sagen das für Aktion Skripts nicht in einem Unterverzeichnis gesucht werden soll das nach dem Kontroller benannt ist (was das Standardverhalten ist). getNoController() empfängt den aktuellen Wert.

  • setNeverController($flag = true) ist analog zu setNoController(), arbeitet aber auf einem globalen Leven -- z.B. wird es nicht für jede ausgeführte Aktion resetiert. getNeverController() empfängt den aktuellen Wert.

  • setScriptAction($name) kann verwendet werden um das Aktion Skript zu spezifizieren das gerendert werden soll. $name sollte der Name des Skripts sein, ohne den Datei Suffix (und ohne das Kontroller Unterverzeichnis, ausser wenn noController eingeschaltet wurde). Wenn nicht spezifiziert, wird nach einem View Skript gesucht das nach der Aktion in Anfrage Objekt benannt ist. getScriptAction() empfängt den aktuellen Wert.

  • setResponseSegment($name) kann verwendet werden um zu spezifizieren in welches Segment das nach einem Antwort Objekt benannt ist, gerendert werden soll. Wenn nicht spezifiziert, wird in das Standard Segment gerendert. getResponseSegment() empfängt den aktuellen Wert.

  • initView($path, $prefix, $options kann aufgerufen werden um den Basis View Pfad, den Klassenprefix für Helfer, Filter Skripts und ViewRenderer Optionen zu spezifizieren. Es kann eines der folgenden Flags übergeben werden: neverRender, noRender, noController, scriptAction, und responseSegment.

  • setRender($action = null, $name = null, $noController = false) erlaubt es scriptAction, responseSegment, oder noController in einem Schritt zu übergeben. direct() ist ein Alias für diese Methode, und erlaubt es diese Methode einfach vom eigenen Kontroller aus aufzurufen:

    // Rendert 'foo' statt dem aktuellen Aktion Skript
    $this->_helper->viewRenderer('foo');
    
    // Rendert form.phtml zum 'html' Antwort Segment, ohne einen Kontroller aus dem
    // Unterverzeichnis des View Skripts zu verwenden:
    $this->_helper->viewRenderer('form', 'html', true);
    
                    

    Hinweis: setRender() und direct() don't actually render the view script, but instead set hints that postDispatch() and render() will use to render the view.

The constructor allows you to optionally pass the view object and ViewRenderer options; it accepts the same flags as initView():

$view    = new Zend_View(array('encoding' => 'UTF-8'));
$options = array('noController' => true, 'neverRender' => true);
$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view, $options);

        

Es gibt einige zusätzliche Methoden für das individualisieren von Pfadspezifikationen die für das Herausfinden des Basis View Pfades verwendet werden der dem View Objekt hinzugefügt wird, und den View Skript Pfad der verwendet wird wenn das View Skript zu dem gerendert werden soll automatisch herausgefunden wird. Diese Methoden nehmen alle ein oder mehrere der folgenden Platzhalter:

  • :moduleDir zeigt auf das aktuelle Modul Basisverzeichnis (von der Konvention her das Elternverzeicnis des Kontroller Verzeichnisses des Moduls).

  • :module zeigt auf den aktuellen Modulnamen.

  • :controller zeigt auf den aktuellen Kontrollernamen.

  • :action zeigt auf den aktuellen Aktionsnamen.

  • :suffix zeigt auf das aktuelle Suffix des View Skripts (welcher über setViewSuffix() gesetzt werden kann).

Die Methoden für das kontrollieren der Pfad Spezifikationen sind:

  • setViewBasePathSpec($spec) erlaubt die Änderung der Pfad Spezifikation die verwendet wird um den Basispfad herauszufinden zu dem das View Objekt hinzugefügt werden soll. Die aktuelle Spezifikation kann jederzeit durch Verwenden von getViewBasePathSpec() erhalten werden.

  • setViewScriptPathSpec($spec) erlaubt die Änderung der Pfad Spezifikation die verwendet wird um den Pfad zu einem individuellen View Skript herauszufinden (ohne den Basis View Skript Pfad). Die Standard Spezifikation ist :controller/:action.:suffix. Die aktuelle Spezifikation kann jederzeit durch Verwenden von getViewScriptPathSpec() erhalten werden.

  • setViewScriptPathNoControllerSpec($spec) erlaubt die Änderung der Pfad Spezifkiation die verwendet wird um den Pfad zu einem individuellen View Skript herauszufinden wenn noController aktiv ist (ohne den Basis View Skript Pfad). Die Standard Spezifikation ist :action.:suffix. Die aktuelle Spezikifation kann jederzeit durch Verwenden von getViewScriptPathNoControllerSpec() erhalten werden.

Die letzten Teile in der ViewRenderer API sind die Methoden für das aktuelle herausfinden von View Skript Pfaden und Rendern von Views. Diese beinhalten:

  • renderScript($script, $name) erlaubt es ein Skript mit einem selbst spezifizierten Pfad zu rendern, optional zu einem benannten Pfad Segment. Wenn diese Methode verwendet wird, ermittelt der ViewRenderer nicht automatisch den Skriptnamen sondern übergibt das $script Argument direkt der render() Methode des View Objekts.

    Hinweis: Sobald die View zum Antwort Objekt gerendert wurde, setzt diese noRender um irrtümliches mehrfaches rendern zum selben View Skript zu verhindern.

    Hinweis: Standardmäßig handelt Zend_Controller_Action::renderScript() in Vertretung zur renderScript() Methode des ViewRenderer's.

  • getViewScript($action, $vars) erstellt den Pfad zu einem View Skript das auf einer Aktion basiert die übergeben wird, und/oder allen Variablen die in $vars übergeben werden. Schlüssel für dieses Array können jede der Pfad Spezifikations Schhüssel enthalten ('moduleDir', 'module', 'controller', 'action', und 'suffix'). Jede übergebene Variable wird verwendet; andernfalls werden Werte die auf der aktuellen Anfrage basieren angewendet.

    getViewScript() verwendet entweder viewScriptPathSpec oder viewScriptPathNoControllerSpec basierend auf den Einstellungen des noController Flags.

    Wortbegrenzer die in Modul-, Kontroller- oder Aktionsnamen vorkommen werden mit Bindestrichen ('-') ersetzt. Deshalb resultiert, wenn der Kontrollername 'foo.bar' und die Aktion 'baz:bat' ist, die Verwendung der standard Pfad Spezifikation einen View Skript Pfad von 'foo-bar/baz-bat.phtml'.

    Hinweis: Standardmäßig handelt Zend_Controller_Action::getViewScript() in Vertretung zur getViewScript() Methode des ViewRenderer's.

  • render($action, $name, $noController) prüft zuerst ob entweder $name oder $noController übergeben wurde, und wenn dem so ist, wird das betreffende Flag (respektive responseSegment und noController) im ViewRenderer gesetzt. Dann übergibt er das $action Argument, wenn vorhanden, an getViewScript(). Am Ende wird der berechnete View Skript Pfad an renderScript() übergeben.

    Hinweis: Achtung vor den Nebeneffekten bei der Verwendung von render(): Die Werte die für den Anwort Segment Namen und für das noController Flag übergeben werden sind im Objekt dauerhaft. Zusätzlich wird noRender gesetzt nachdem das rendern fertig ist.

    Hinweis: Standardmäßig handelt Zend_Controller_Action::render() in Vertretung zur render() Methode des ViewRenderer's.

  • renderBySpec($action, $vars, $name) erlaubt es Pfad Spezifikations Variablen zu übergeben um den View Skript Pfad zu ermitteln der erstellt werden soll. Es übergibt $action und $vars an getScriptPath() und übergibt anschließend den resultierenden Skript Pfad und $name an renderScript().

Grundsätzliches Beispiel der Verwendung

Beispiel #5 Grundsätzliche Verwendung

Am einfachsten, wird einfach der ViewRenderer Helfer mit dem Helfer Broker in der eigenen Bootstrap Datei, initialisiert und registriert, und anschließend die Variablen in den Aktion Methoden gesetzt.

<?php
// In der Bootstrap Datei:
Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');

...

<?php
// 'foo' Modul, 'bar' Kontroller:
class Foo_BarController extends Zend_Controller_Action
{
    // Rendert standardmäßig bar/index.phtml; keine Aktion benötigt
    public function indexAction()
    {
    }

    // Rendert bar/populate.phtml wobei die Variable 'foo' auf 'bar' gesetzt wird.
    // Da das View Objekt beim preDispatch() definiert wird, ist es bereits vorhanden.
    public function populateAction()
    {
        $this->view->foo = 'bar';
    }

    // Rendert nichts da zu einer anderen Aktion weitergeleitet wird; die neue Akion
    // wird jegliches rendern durchführen
    public function bazAction()
    {
        $this->_forward('index');
    }

    // Rendert nichts da zu einer anderen Lokation weitergeleitet wird
    public function batAction()
    {
        $this->_redirect('/index');
    }
}
            

Hinweis: Benamungs Konventionen: Wort Begrenzer in Kontroller- und Aktionnamen
Wenn der Kontroller- oder Aktionsname aus mehreren Wörtern aufgebaut ist, müssen diese, da der Dispatcher das benötigt, seperiert sein durch die URL nach spezifischem Pfad und Wort Begrenzer Zeichen. Der ViewRenderer ersetzt jeden Pfad Begrenzer den er im Kontrollernamen findet mit einem aktuellen Pfad Begrenzer ('/'), und jeden Wort Begrenzer der gefunden wird mit einem Bindestrich ('-') wenn Pfade erstellt werden. Deshalb würde ein Aufruf der Aktion /foo.bar/baz.bat zu FooBarController::bazBatAction() in FooBarControll.php weiterleiten was wiederum foo-bar/baz-bat.phtml rendern würde; ein Aufruf der Aktion /bar_baz/baz-bat für dazu das Bar_BazController::bazBatAction() in Bar/BazController.php dispatched wird (betrachte die Seperation des Pfades) und bar/baz/baz-bat.phtml gerendert wird.
Es ist zu beachten das im zweiten Beispiel, das Modul noch immer das Standardmodul ist, aber das der Kontroller, wegen der Existenz eines Pfad Seperators, den Namen Bar_BazController in Bar/BazController.php empfängt. Der ViewRenderer emuliert die Kontroller Verzeichnis Hierarchie.

Beispiel #6 Automatisches rendern ausschalten

Für einige Aktionen oder Kontroller, kann es gewünscht sein das automatische Rendern auszuschalten -- zum Beispiel, wenn eine andere Art von Ausgabe (XML, JSON, etc) ausgegeben werden soll, oder wenn man einfach nichts ausgeben will. Es gibt zwei Optionen: Alle Fälle von automatischem Rendern ausschalten (setNeverRender()), oder dieses einfach für die aktuelle Aktion ausschalten (setNoRender()).

<?php
// Baz Kontroller Klasse, bar Modul:
class Bar_BazController extends Zend_Controller_Action
{
    public function fooAction()
    {
        // Diese Sektion nicht automatisch Rendern
        $this->_helper->viewRenderer->setNoRender();
    }
}

// Bat Kontroller Klasse, Bar Modul:
class Bar_BatController extends Zend_Controller_Action
{
    public function preDispatch()
    {
        // Die Aktionen dieses Kontroller nie automatisch Rendern
        $this->_helper->viewRenderer->setNoRender();
    }
}
            

Hinweis: In den meisten Fällen, macht es keinen Sinn das automatische Rendern global auszuschalten (ala setNeverRender()), da das einzige das man dann vom ViewRenderer erhält das automatische Setup des View Objekts ist.

Beispiel #7 Ein anderes View Skript auswählen

Einige Situationen erfordern das ein anderes Skript, als das nach der Aktion benannte, ausgeführt wird. Zum Beispiel, wenn man einen Kontroller hat der Aktionen sowohl hinzufügen als auch bearbeiten kann, und beide mit der selben 'form' View angezeigt werden, aber mit unterschiedlichen Werten gesetzt werden. Der Skript Name kann ganz einfach geändert werden. Entweder mit setScriptAction(), setRender() oder durch Aufruf des Helfers als Methode, was wiederum setRender() ausruft.

<?php
// Bar Kontroller Klasse, foo Modul:
class Foo_BarController extends Zend_Controller_Action
{
    public function addAction()
    {
        // Rendert 'bar/form.phtml' statt 'bar/add.phtml'
        $this->_helper->viewRenderer('form');
    }

    public function editAction()
    {
        // Rendert 'bar/form.phtml' statt 'bar/edit.phtml'
        $this->_helper->viewRenderer->setScriptAction('form');
    }

    public function processAction()
    {
        // einige Prüfungen durchführen...
        if (!$valid) {
            // Rendert 'bar/form.phtml' statt 'bar/process.phtml'
            $this->_helper->viewRenderer->setRender('form');
            return;
        }

        // andernfalls die Bearbeitung weiter durchführen...
    }

}
            

Beispiel #8 Die resigstrierte View ändern

Was wenn ein View Objekt modifiziert werden soll -- zum Beispiel, die Helfer Pfade ändern, oder die Kodierung? Das kann durch Modifikation des View Objekts, das im Kontroller gesetzt ist, gemacht werden, oder durch herausnehmen des View Objekts aus dem ViewRenderer; beide referenzieren auf das gleiche Objekt.

<?php
// Bar Kontroller Klasse, foo Modul:
class Foo_BarController extends Zend_Controller_Action
{
    public function preDispatch()
    {
        // Die Kodierung der View ändern
        $this->view->setEncoding('UTF-8');
    }

    public function bazAction()
    {
        // Das View Objekt erhalten, und den Kommentar Callback auf 'htmlspecialchars' setzen
        $view = $this->_helper->viewRenderer->view;
        $view->setEscape('htmlspecialchars');
    }
}
            

Erweiterte Beispiel der Verwendung

Beispiel #9 Die Pfad Spezifikationen ändern

In einigen Fällen, kann man entscheiden das die standardmäßige Pfad Spezifikation nicht den Notwendigkeiten der Seite entspricht. Zum Beispiel, wenn man einen einzelnen Template Baum haben will zu dem man dann Zugriff für Entwickler geben kann (das ist sehr typisch wenn man zum Beispiel » Smarty verwendet). In solchen Fällen, kann es gewünscht sein die Spezifkiation des View Basispfades hardkodiert zu erstellen und eine alternative Spezifikation für die Pfade der Aktions View Skripte selbst zu erstellen.

Für die Zwecke dieses Beispiels, nehmen wir an das der Basispfad zur View '/opt/vendor/templates' sein soll, und das die View Skripte durch ':moduleDir/:controller/:action.:suffix' referenziert werden sollen; wenn das noController Flag gesetzt wurde, soll aus dem Top Level statt aus einem Unterverzeichnis gerendert werden (':action.:suffix'). Zuletzt soll 'tpl' als View Skript Suffix für Dateinamen verwendet werden.

<?php
/**
 * In der Bootstrap Datei:
 */

// Unterschiedliche View Implmentation
$view = new ZF_Smarty();

$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
$viewRenderer->setViewBasePathSpec('/opt/vendor/templates')
             ->setViewScriptPathSpec(':module/:controller/:action.:suffix')
             ->setViewScriptPathNoControllerSpec(':action.:suffix')
             ->setViewSuffix('tpl');
Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
            

Beispiel #10 Mehrfache View Skripte von der gleichen Aktion rendern

Manchmal, ist es notwendig mehrfache View Skripte von einer einzelnen Aktion zu rendern. Das ist sehr geradlinig -- einfach mehrere Aufrufe zu render() machen:

<?php
class SearchController extends Zend_Controller_Action
{
    public function resultsAction()
    {
        // Annahme das $this->model das aktuelle Modell ist
        $this->view->results = $this->model->find($this->_getParam('query', '');

        // render() handelt standardmäßig in Vertretung zum ViewRenderer
        // Rendert zuerst die Such Form und anschließend die Ergebnisse
        $this->render('form');
        $this->render('results');
    }

    public function formAction()
    {
        // tue nichts; der ViewRenderer bearbeitet das View Skript automatisch
    }
}
            

Schreiben eigener Helfer

Aktions Helfer erweitern Zend_Controller_Action_Helper_Abstract, eine abstrakte Klasse die das Basisinterface bietet und vom Helfer Broker funktionell benötigt wird. Diese inkludiert die folgenden Methoden:

  • setActionController() wird verwendet um den aktuellen Aktion Kontroller zu setzen.

  • init(), wird vom Helfer Broker wärend der Instanzierung ausgeführt und kann verwendet werden um den Status zu resetieren wenn mehrere Kontroller den gleichen Helfer in einer verketteten Aktion verwenden.

  • preDispatch(), wird vor der ausführenden Aktion gestartet.

  • postDispatch() wird ausgeführt nachdem eine Aktion fertig ist -- selbst wenn ein preDispatch() Plugin die Aktion abgebrochen hat. Normalerweise nützlich für das Saubermachen.

  • getRequest() empfängt das aktuelle Anfrage Objekt.

  • getResponse() empfängt das aktuelle Antwort Objekt.

  • getName() empfängt den Helfernamen. Sie empfängt die Portion des Klassennamens der dem letzten Unterstrich-Zeichen folgt, oder andererseits den kompletten Klassennamen. Als Beispiel, wenn die Klasse Zend_Controller_Action_Helper_Redirector heißt, wird Redirector zurückgegeben; eine Klasse die FooMessage heißt wird einfach sich selbst zurückgeben.

Optional kann eine direct() Methode in der eigenen Helfer Klasse inkludiert werden. Wenn Sie definiert ist, erlaubt Sie den Helfer als eine Methode des Helfer Brokers zu verwenden, um eine einfache rein-raus Verwendung des Helfers zu ermöglichen. Als Beispiel definiert der Umleiter direct() als einen Alias von goto() und erlaubt damit die Verwendung des Helfers wie folgt:

<?php
// Umleiten zu /blog/view/item/id/42
$this->_helper->redirector('item', 'view', 'blog', array('id' => 42));
        

Intern schaut die __call() Methode des Helfer Brokers nach einem Helfer der redirector heißt, prüft anschließend ob der Helfer eine definierte direct Klasse besitzt und ruft diese mit den angegebenen Argumenten auf.

Wenn eine eigene Helfer Klasse erstellt wurde, kann man zu Ihr wie im obigen Kapitel beschrieben, Zugang erhalten.


Action Kontroller
blog comments powered by Disqus

Select a Version

Languages Available

Components

Search the Manual