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 desFlashMessengers, wirdaddMessage()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 einexit()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 angoto()übergeben wird. Verwendet die API vonZend_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 angotoUrl()übergeben wird. Akzeptiert einen einzelnen URL String. -
setPrependBase()kann verwendet werden um die BasisURL des Anfrage Objektes einer mitsetGotoUrl(),gotoUrl()odergotoUrlAndExit()definierten URL, voranzustellen. -
setUseAbsoluteUri()kann verwendet werden um denRedirectordazu 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()verwendetsetGoto()(_forward()-ähnlcihe API) um eine URL zu erstellen und eine Umleitung durchzuführen. -
gotoRoute()verwendetsetGotoRoute()(route-assembly) um eine URL zu erstellen und eine Umleitung durchzuführen. -
gotoUrl()verwendetsetGotoUrl()(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 einrendermanuell durchführt, wird kein automatisches rendern erfolgen, da man beim Ausführen von jeder dieser Aktionen demViewRenderermitteilt das man seine eigene Ausgabe durchführen will.
Hinweis: Der
ViewRendererist standardmäßig aktiviert. Man kann Ihn über den ParameternoViewRendererdes Frontkontrollers deaktivieren ($front->setParam('noViewRenderer', true)) oder den Helfer vom Helfer Broker Stack entfernen (Zend_Controller_Action_HelperBroker::removeHelper('viewRenderer')).
Wenn man Einstellungen vomViewRenderervor der Ausführung des Front Kontrollers ändern will, kann das auf zwei Wegen getan werden:
Instanzieren und Registrieren eines eigenen
ViewRendererObjekts 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
ViewRendererObjekts 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 denViewRenderer. Er wird als öffentliche Klasseneigenschaft$viewgesetzt. -
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, ruftpostDispatch()nicht automatischrender()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, wirdpostDispatch()render()im aktuellen Kontroller nicht automatisch aufrufen. Diese Einstellung wird jedesmal zurückgesetzt wennpreDispatch()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 umrender()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 zusetNoController(), 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.$namesollte der Name des Skripts sein, ohne den Datei Suffix (und ohne das Kontroller Unterverzeichnis, ausser wennnoControllereingeschaltet 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, $optionskann aufgerufen werden um den Basis View Pfad, den Klassenprefix für Helfer, Filter Skripts undViewRendererOptionen zu spezifizieren. Es kann eines der folgenden Flags übergeben werden:neverRender,noRender,noController,scriptAction, undresponseSegment. -
setRender($action = null, $name = null, $noController = false)erlaubt esscriptAction,responseSegment, odernoControllerin 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()unddirect()don't actually render the view script, but instead set hints thatpostDispatch()andrender()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:
-
:moduleDirzeigt auf das aktuelle Modul Basisverzeichnis (von der Konvention her das Elternverzeicnis des Kontroller Verzeichnisses des Moduls). -
:modulezeigt auf den aktuellen Modulnamen. -
:controllerzeigt auf den aktuellen Kontrollernamen. -
:actionzeigt auf den aktuellen Aktionsnamen. -
:suffixzeigt auf das aktuelle Suffix des View Skripts (welcher übersetViewSuffix()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 vongetViewBasePathSpec()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 vongetViewScriptPathSpec()erhalten werden. -
setViewScriptPathNoControllerSpec($spec)erlaubt die Änderung der Pfad Spezifkiation die verwendet wird um den Pfad zu einem individuellen View Skript herauszufinden wennnoControlleraktiv ist (ohne den Basis View Skript Pfad). Die Standard Spezifikation ist:action.:suffix. Die aktuelle Spezikifation kann jederzeit durch Verwenden vongetViewScriptPathNoControllerSpec()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 derViewRenderernicht automatisch den Skriptnamen sondern übergibt das$scriptArgument direkt derrender()Methode des View Objekts.Hinweis: Sobald die View zum Antwort Objekt gerendert wurde, setzt diese
noRenderum irrtümliches mehrfaches rendern zum selben View Skript zu verhindern.Hinweis: Standardmäßig handelt
Zend_Controller_Action::renderScript()in Vertretung zurrenderScript()Methode desViewRenderer'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 entwederviewScriptPathSpecoderviewScriptPathNoControllerSpecbasierend auf den Einstellungen desnoControllerFlags.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 zurgetViewScript()Methode desViewRenderer's.
-
render($action, $name, $noController)prüft zuerst ob entweder$nameoder$noControllerübergeben wurde, und wenn dem so ist, wird das betreffende Flag (respektive responseSegment und noController) im ViewRenderer gesetzt. Dann übergibt er das$actionArgument, wenn vorhanden, angetViewScript(). Am Ende wird der berechnete View Skript Pfad anrenderScript()ü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 zurrender()Methode desViewRenderer'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$actionund$varsangetScriptPath()und übergibt anschließend den resultierenden Skript Pfad und$nameanrenderScript().
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. DerViewRendererersetzt 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.batzuFooBarController::bazBatAction()in FooBarControll.php weiterleiten was wiederumfoo-bar/baz-bat.phtmlrendern würde; ein Aufruf der Aktion/bar_baz/baz-batfür dazu dasBar_BazController::bazBatAction()inBar/BazController.phpdispatched wird (betrachte die Seperation des Pfades) undbar/baz/baz-bat.phtmlgerendert 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 NamenBar_BazControllerinBar/BazController.phpempfä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 vomViewRenderererhä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 einpreDispatch()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 KlasseZend_Controller_Action_Helper_Redirectorheißt, wirdRedirectorzurückgegeben; eine Klasse dieFooMessageheiß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 |
Select a Version
Languages Available
Components
Search the Manual
Navigation
- Programmierer Referenzhandbuch
- Programmierer Referenzhandbuch
- Zend_Controller
- Zend_Controller Schnellstart
- Zend_Controller Grundlagen
- Der Front Controller
- Das Request Objekt
- Der Standard Router: Zend_Controller_Router_Rewrite
- Der Dispatcher
- Action Kontroller
- Action Helfer
- Das Response Objekt
- Plugins
- Eine konventionelle modulare Verzeichnis Struktur verwenden
- MVC Ausnahmen
- Migration von vorhergehenden Versionen
