Programmer's Reference Guide
| View Scripte |
View Helfer
In deinen View Skripten ist es oft notwendig, bestimmte komplexe Funktionen immer wieder auszuführen, z.B. Datum formatieren, Formularelemente erstellen oder Links für Aktionen anzuzeigen. Du kannst Helferklassen verwenden, um diese Aufgaben für dich durchführen zu lassen.
Ein Helfer ist einfach eine Klasse. Nehmen wir an wir wollen einen Helfer der 'fooBar'
heißt. Standardmäßig wird der Klasse 'Zend_View_Helper_' vorangestellt (Es kann ein
eigener Prefix definiert werden wenn ein Pfad für die Helfer definiert wird), und das letzte
Segment des Klassennamens ist der Name des Helfers; Dieses Segment sollte Titel
Großgeschrieben sein; der volle Klassenname ist dann:
Zend_View_Helper_FooBar. Diese Klasse sollte mindestens eine einzelne
Methode enthalten, die nach dem Helfer benannt und camelCased ist: fooBar().
Hinweis: Betrachte den Fall
Namen von Helfern sind immer camelCased, bzw. beginnen Sie nie mit einem großgeschriebenen Zeichen. Der Klassenname selbst ist MixedCased, aber die Methode die aktuell ausgeführt wird ist camelCased.
Hinweis: Standard Helfer Pfad
Der Standard Helfer Pfad zeigt immer zu den View Helfern des Zend Frameworks, normalerweise 'Zend/View/Helper/'. Selbst wennsetHelperPath()ausgerufen wird um den existierenden Pfad zu überschreiben, wird dieser Pfad gesetzt um sicherzustellen das die Standard Helfer arbeiten.
Um einen Helfer in deinem View Skript zu verwenden, rufe ihn mittels
$this->helperName() auf. Im Hintergrund wird Zend_View
die Klasse Zend_View_Helper_HelperName laden, eine Objektinstanz der
Klasse erstellen und deren Methode helperName() aufrufen. Die Objektinstanz
bleibt innerhalb der Zend_View Instanz bestehen und wird bei allen
weiteren Aufrufen von $this->helperName() wiederverwendet.
Vorhandene Helfer
Zend_View enthält bereits einige vorhandene Helferklassen, die sich alle auf die Erstellung von Formularelementen beziehen und die notwendige Maskierung der Ausgaben automatisch vornehmen. Zusätzlich gibt es Helfer zum Erstellen Routen-basierter URLS and HTML Listen, genauso wie für das Deklarieren von Variablen. Die aktuell gelieferten Helfer beinhalten:
declareVars(): Primär benutzt mitstrictVars(), kann dieser Helfer verwendet werden um template Variablen zu deklarieren welche bereits, oder noch nicht, im View Objekt bereits gesetzt sind, sowie auch Standard Werte. Arrays welche als Argument dieser Methode übergeben werden, werden verwendet um Standard Werte zu setzen; Andernfalls, wenn die Variable nicht existiert, wird diese mit einem leeren String gesetzt.fieldset($name, $content, $attribs):Erstellt ein XHTML Fieldset. Wenn$attribseinen 'legend' Schlüssel enthält, wird der Wert für die Fieldset Beschriftung verwendet. Das Fieldset wird$contentumfassen wie vom Helfer angeboten.form($name, $attribs, $content):Erzeugt eine XHTML Form. Alle$attribswerden als XHTML Attribute des Form Tags escaped und dargestellt. Wenn$contentvorhanden und kein boolsches false ist, dann wird dieser Inhalt innerhalb der Start und End Form Tags dargestellt werden; wenn$contentein boolsches false ist (der Standard), wird nur das beginnende Formtag erzeugt.formButton($name, $value, $attribs): Erstellt ein <button /> Element.-
formCheckbox($name, $value, $attribs, $options):Erstellt ein <input type="checkbox" /> Element.Standardmäßig, wenn kein $value angegeben und keine $options vorhanden sind, wird '0' als ungecheckter Wert, und '1' als gecheckter Wert angenommen. Wenn ein $value übergeben wird, aber keine $options vorhanden sind, wird der gecheckte Wert and der übergebene Wert angenommen.
$options sollte ein Array sein. Wenn das Array indiziert ist, ist der erste Wert der gecheckte Wert, und der zweite der ungecheckte Wert; alle anderen Werte werden ignoriert. Es kann auch ein assoziatives Array mit den Schlüsseln 'checked' und 'unChecked' übergeben werden.
Wenn $options übergeben wurden und $value mit dem gecheckten Wert übereinstimmt, dann wird das Element als gecheckt markiert. Das Element kann auch als gecheckt oder ungecheckt markiert werden indem ein boolscher Wert für das Attribut 'checked' übergeben wird.
Das obige wird möglicherweise am besten mit einigen Beispielen zusammengefasst:
// '1' und '0' als gecheckte/ungecheckte Optionen; nicht gecheckt echo $this->formCheckbox('foo'); // '1' und '0' als gecheckte/ungecheckte Optionen; gecheckt echo $this->formCheckbox('foo', null, array('checked' => true)); // 'bar' und '0' als gecheckte/ungecheckte Optionen; nicht gecheckt echo $this->formCheckbox('foo', 'bar'); // 'bar' und '0' als gecheckte/ungecheckte Optionen; gecheckt echo $this->formCheckbox('foo', 'bar', array('checked' => true)); // 'bar' und 'baz' als gecheckte/ungecheckte Optionen; nicht gecheckt echo $this->formCheckbox('foo', null, null, array('bar', 'baz'); // 'bar' und 'baz' als gecheckte/ungecheckte Optionen; nicht gecheckt echo $this->formCheckbox('foo', null, null, array( 'checked' => 'bar', 'unChecked' => 'baz' )); // 'bar' und 'baz' als gecheckte/ungecheckte Optionen; gecheckt echo $this->formCheckbox('foo', 'bar', null, array('bar', 'baz'); echo $this->formCheckbox('foo', null, array('checked' => true), array('bar', 'baz'); // 'bar' und 'baz' als gecheckte/ungecheckte Optionen; nicht gecheckt echo $this->formCheckbox('foo', 'baz', null, array('bar', 'baz'); echo $this->formCheckbox('foo', null, array('checked' => false), array('bar', 'baz');In allen Fällen, wird das Markup einem versteckten Element mit dem nicht gecheckten Wert vorangestellt; auf diesem Weg erhält man trotzdem einen gültigen Wert von der Form selbst wenn der Wert nicht gecheckt wird.
-
formErrors($errors, $options):Erzeugt eine ungeordnete XHTML Liste und zeigt Fehler an.$errorssollte ein String oder ein Array von Strings sein;$optionssollte irgendein Attribut sein das im beginnenden List Tag platziert werden soll.Es kann alternativer beginnender, schließender und seperierter Inhalt spezifiziert werden wenn Fehler dargestellt werden durch aufruf von verschiedenen Methoden auf dem Helfer:
setElementStart($string); Standard ist '<ul class="errors"%s"><li>', wobei %s mit den in$optionsspezifizierten Attributen ersetzt wird.setElementSeparator($string); Standard ist '</li><li>'.setElementEnd($string); Standard ist '</li></ul>'.
formFile($name, $attribs): Erstellt ein <input type="file" /> Element.formHidden($name, $value, $attribs): Erstellt ein <input type="hidden" /> Element.formLabel($name, $value, $attribs): Erstellt ein <label> Element, setzt dasforAttribut auf$name, und den aktuellen Labeltext auf$value. Wenndisableanattribsübergeben wird, wird nichts zurückgegeben.formMultiCheckbox($name, $value, $attribs, $options, $listsep):Erstellt eine Liste von Checkboxen.$optionssollte ein assoziatives Array sein und kann beliebig tief werden.$valuekann ein einzelner Wert oder ein Array von ausgewählten Werten sein die Schlüsseln im$optionsArray entsprechen.$listsepist standardmäßig ein HTML Break ("<br />"). Standardmäßig wird dieses Element als Array behandelt; alle Checkboxen teilen den gleichen Namen, und werden als Array übertragen.formPassword($name, $value, $attribs): Erstellt ein <input type="password" /> Element.formRadio($name, $value, $attribs, $options): Erstellt eine Reihe von <input type="radio" /> Elementen, eine für jeden der $options Elemente. Im $options Array ist der Elementschlüssel der Wert und der Elementwert die Bezeichnung des Radio-Buttons. Der $value Radiobutton wird für dich vorgewählt.formReset($name, $value, $attribs): Erstellt ein <input type="reset" /> Element.formSelect($name, $value, $attribs, $options): Erstellt einen <select>...</select> block mit einer <option>one für jedes $options Element. Im $options Array ist der Elementschlüssel der Optionswert und der Elementwert die Optionsbezeichnung. Die $value Optionen werden für dich vorgewählt.formSubmit($name, $value, $attribs): Erstellt ein <input type="submit" /> Element.formText($name, $value, $attribs): Erstellt ein <input type="text" /> Element.formTextarea($name, $value, $attribs): Erstellt einen <textarea>...</textarea> Block.url($urlOptions, $name, $reset):Erstelle einen URL String basierend auf dem Namen der Route.$urlOptionssollte ein assoziatives Array von Schlüßel/Werte Paaren sein, welche bon der speziellen Route verwendet wird.htmlList($items, $ordered, $attribs, $escape):erzeugt ungeordnete und geordnete Listen welche auf den$itemsbasieren die übergeben wurden. Wenn$itemsein multidimensionales Array ist, wird eine verschachtelte Liste gebaut. Wenn das$escapeFlag true ist (standard), werden individuelle Abschnitte escaped durch Verwendung des Escaping Mechanismus der im View Objekt registriert wurde; ein false Wert wird übergeben wenn Markups in den Listen gewünscht werden.
Die Verwendung dieser Helfer in deinem View Skript ist sehr einfach, hier ist ein Beispiel. Beachte, dass du diese Helfer nur aufzurufen brauchst; sie werden automatisch geladen und instanziiert, sobald sie benötigt werden.
// Innerhalb deines View Skriptes, verweist $this auf die Zend_View
// Instanz.
//
// Sagen wir, dass du bereits eine Serie von Auswahlwerten der Variable
// $countries in Form eines Arrays zugewiesen hast
// ('us' => 'United States', 'il' => 'Israel', 'de' => 'Germany')
?>
<form action="action.php" method="post">
<p><label>Deine Email:
<?php echo $this->formText('email', 'you@example.com', array('size' => 32)) ?>
</label></p>
<p><label>Dein Land:
<?php echo $this->formSelect('country', 'us', null, $this->countries) ?>
</label></p>
<p><label>Möchtest Du hinzugefügt werden?
<?php echo $this->formCheckbox('opt_in', 'yes', null, array('yes', 'no')) ?>
</label></p>
</form>
Die Ausgabe des View Skriptes wird in etwa so aussehen:
<form action="action.php" method="post">
<p><label>Deine Email:
<input type="text" name="email" value="you@example.com" size="32" />
</label></p>
<p><label>Dein Land:
<select name="country">
<option value="us" selected="selected">Amerika</option>
<option value="il">Israel</option>
<option value="de">Deutschland</option>
</select>
</label></p>
<p><label>Möchtest Du hinzugefügt werden?
<input type="hidden" name="opt_in" value="no" />
<input type="checkbox" name="opt_in" value="yes" checked="checked" />
</label></p>
</form>
Action View Helfer
Der Action View Helfer ermöglicht es View Skripten eine gegebene Kontroller
Aktion auszuführen; das Ergebnis des Antwortsobjektes das der Ausführung folgt wird dann
zurückgegeben. Dieses kann verwendet werden wenn eine bestimmte Aktion wiederverwendbare
Inhalte oder "helfende" Inhalte erstellt.
Aktionen die zu einem _forward() oder einer Umleitung führen werden als
ungültig angenommen, und als leerer String zurückgegeben.
Die API für den Action View Helfer folgt dem der meisten MVC Komponenten die
Kontroller Aktionen aufrufen:
action($action, $controller, $module = null, array $params = array()).
$action und $controller werden benötigt; wenn kein Modul angegeben
wird, dann wird das Standardmodul angenommen.
Beispiel #1 Grundsätzliche Verwendung von Action View Helfern
Als Beispiel, könnte man einen CommentController mit einer
listAction() Methode haben die man in Reihenfolge ausführen will, um eine
Liste von Kommentaren für die aktuelle Anfrage herauszuholen:
<div id="sidebar right">
<div class="item">
<?php echo $this->action('list',
'comment',
null,
array('count' => 10)); ?>
</div>
</div>
Cycle Helfer
Der Cycle Helfer wird verwendet um ein Set von Werte zu ändern.
Beispiel #2 Grundsätzliche Verwendung des Cycle Helfers
Um Elemente hinzuzufügen die man durchlaufen will müssen diese im Constructor
spezifiziert oder die assign(array $data) Funktion verwendet werden.
<?php foreach ($this->books as $book):?>
<tr style="background-color:<?php echo $this->cycle(array("#F0F0F0",
"#FFFFFF"))
->next()?>">
<td><?php echo $this->escape($book['author']) ?></td>
</tr>
<?php endforeach;?>
// Rückwärts bewegen und die assign Funktion verwenden
$this->cycle()->assign(array("#F0F0F0","#FFFFFF"));
$this->cycle()->prev();
?>
Die Ausgabe
<tr style="background-color:'#F0F0F0'"> <td>Erstes</td> </tr> <tr style="background-color:'#FFFFFF'"> <td>Zweites</td> </tr>
Beispiel #3 Mit einem oder mehreren Zyklen arbeiten
Um zwei Zyklen zu verwenden muß man den Namen des Zyklus verwenden. Einfach zwei Parameter
in der cycle Methode setzen. $this->cycle(array("#F0F0F0","#FFFFFF"),'cycle2').
Man kann auch die setName($name) Funktion verwenden.
<?php foreach ($this->books as $book):?>
<tr style="background-color:<?php echo $this->cycle(array("#F0F0F0",
"#FFFFFF"))
->next()?>">
<td><?php echo $this->cycle(array(1,2,3),'number')->next()?></td>
<td><?php echo $this->escape($book['author'])?></td>
</tr>
<?php endforeach;?>
Partielle Helfer
Der Partial (Partielle) View Helfer wird verwendet um ein spezielles Template
innerhalb seines eigenen variablen Bereichs zu rendern. Primär wird er für wiederverwendbare
Templatefragmente verwendet bei denen man keine Vorsorge wegen variablen Namenskonflikten
aufpassen muß. Zusätzlich erlauben Sie es Teile von View Skripten von speziellen Modulen zu
spezifizieren.
Ein Geschwisterteil zum Partial ist der PartialLoop View Helfer
der es erlaubt Daten zu übergeben die durchlaufen werden können, und einen Abschnitt für
jedes Teil auszugeben.
Hinweis: PartialLoop Zähler
DerPartialLoopView Helfer fügt der View eine Variable hinzu diepartialCounterheißt und die die aktuelle Position des Arrays zum View Skript übergibt. Das bietet einen einfachen Weg um alternative Farbgebungen zum Bespiel bei Tabellenzeilen zu haben.
Beispiel #4 Grundsätzliche Verwendung von Partials
Die grundsätzliche Verwendung von Partials ist die Ausgabe von Templatefragmenten im eigenen Viewbereich. Es wird das folgende teilweise Skript angenommen:
<?php // partial.phtml ?>
<ul>
<li>Von: <?php echo $this->escape($this->from) ?></li>
<li>Subjekt: <?php echo $this->escape($this->subject) ?></li>
</ul>
Dieses würde dann vom View Skript aufgerufen indem das folgende verwendet wird:
<?php echo $this->partial('partial.phtml', array(
'from' => 'Team Framework',
'subject' => 'Teil der View')); ?>
Was dann das folgende ausgibt:
<ul>
<li>From: Team Framework</li>
<li>Subject: Teil der View</li>
</ul>
Hinweis: Was ist ein Modell?
Ein Modell das mit demPartialView Helfer verwendet wird kann eines der folgenden sein:
Wenn das eigene Modell ein Objekt ist, kann es gewünscht sein, es als Objekt an das Partielle Skript zu übergeben, statt es in ein Array von Variablen zu serialisieren. Das kann durch das Setzen der 'objectKey' Eigenschaft des betreffenden Helfers getan werden:
Array. Wenn ein Array übergeben wird, sollte es assoziativ sein, und seine Schlüssel/Werte Paare werden der View mit dem Schlüssel als View Variable zugeordnet.
Objekt das die toArray() Methode implementiert. Wenn ein Objekt übergeben wird das eine
toArray()Methode besitzt, wird das Ergebnis vontoArray()dem View Objekt als View Variablen zugeordnet.Standard Objekt. Jedes andere Objekt wird die Ergebnisse von
object_get_vars()(essentiell alle öffentlichen Eigenschaften des Objektes) dem View Objekt zuordnen.
Diese Technik ist speziell dann sinnvoll wenn Zend_Db_Table_Rowsets an// Dem Partiellen mitteilen das ein Objekt als 'model' Variable übergeben wird $view->partial()->setObjectKey('model'); // Dem Partiellen mitteilen das ein Objekt von partialLoop als 'model' // Variable im letzten Partiellen View Skript übergeben wird $view->partialLoop()->setObjectKey('model');partialLoop()übergeben werden, da man dann kompletten Zugriff auf die Zeilenobjekte im View Skript hat, was es einem erlaubt Ihre Methoden auszurufen (wie das empfangen von Werten bei Eltern- oder abhängigen Zeilen).
Beispiel #5 Verwendung von PartialLoop um iterierbare Modelle darzustellen
Typischerweise, wird man Partials in einer Schleife verwenden um das selbe Inhaltsfragment, viele Male, darzustellen; auf diesem Weg können große Blöcke von wiederholenden Inhalten oder komplexe Anzeigelogik auf einen einzelnen Platz gegeben werden. Trotzdem hat das einen Geschwindigkeitsnachteil, da der partielle Helfer einmal für jede Iteration aufgerufen werden muß.
Der PartialLoop View Helfer hilft bei der Lösung dieses Problems. Er
erlaubt es einen wiederholenden Teil (Array oder Objekt das einen Iterator
implementiert) als Modell zu übergeben. Er iteriert dann darüber, und übergibt dessen
Teile dem Partial Skript als Modell. Teil in diesem Iterator kann jedes Modell sein das
der Partial View Helfer erlaubt.
Es wird das folgende teilweise View Skript angenommen:
<?php // partialLoop.phtml ?>
<dt><?php echo $this->key ?></dt>
<dd><?php echo $this->value ?></dd>
Und das folgende "Modell":
$model = array(
array('key' => 'Säugetier', 'value' => 'Kamel'),
array('key' => 'Vogel', 'value' => 'Pinguin'),
array('key' => 'Reptil', 'value' => 'Viper'),
array('key' => 'Fisch', 'value' => 'Flunder'),
);
Im View Skript wird dann der PartialLoop Helfer aufgerufen:
<dl>
<?php echo $this->partialLoop('partialLoop.phtml', $model) ?>
</dl>
<dl>
<dt>Säugetier</dt>
<dd>Kamel</dd>
<dt>Vogel</dt>
<dd>Pinguin</dd>
<dt>Reptil</dt>
<dd>Viper</dd>
<dt>Fisch</dt>
<dd>Flunder</dd>
</dl>
Beispiel #6 Partials in anderen Modulen darstellen
Zeitweise existiert ein Parial in einem anderen Modul. Wenn der Name des Moduls bekannt
ist, kann dieses als zweites Argument entweder partial() oder
partialLoop() übergeben werden, indem das $model Argument an
dritte Stelle verschoben wird.
Wenn zum Beispiel, eine Teilseite existiert im 'list' Modul existiert die verwendet werden soll, kann diese wie folgt genommen werden:
<?php echo $this->partial('pager.phtml', 'list', $pagerData) ?>
Auf diesem Weg, können Teile wiederverwendet werden die speziell für andere Module erstellt wurden. Deshalb ist es besser, wiederverwendbare Teile in einen Pfad für geteilt View Skripte zu geben.
Platzhalter (PlaceHolder) Helfer
Der Placeholder View Helfer wird verwendet um Inhalte zwischen View Skripten
und View Instanzen persistent zu machen. Er bietet auch einige nützliche Features wie
Inhalte zu vereinigen, Inhalte von View Skripten zu erfassen und Vor- sowie Nach-Texte zu
Inhalten hinzuzufügen (und eigene Separatoren für vereinigte Inhalte).
Beispiel #7 Grundsätzliche Verwendung von Platzhaltern
Die grundsätzliche Verwendung von Platzhaltern ist die persistenz von View Daten. Jeder
Aufruf des Placeholder Helfers erwartet einen Platzhalter Namen; der Helfer
gibt dann ein Platzhalter Container Objekt zurück das entweder manipuliert oder einfach
ausgegeben werden kann.
<?php $this->placeholder('foo')->set("Ein Text für später") ?>
<?php
echo $this->placeholder('foo');
// Ausgabe "Ein Text für später"
?>
Beispiel #8 Platzhalter verwenden um Inhalt zu vereinigen
Inhalt über Platzhalter zu vereinigen kann zeitweise auch sehr nützlich sein. Zum Beispiel kann ein View Skript ein variables Array besitzen von dem Nachrichten empfangen werden sollen um diese später darzustellen; ein späteres View Skript kann diese dann eruieren wie diese dargestellt werden sollen.
Der Placeholder View Helfer verwendet Container die
ArrayObject erweitern, und ein reichhaltiges Set von Features für die
Manipulation von Arrays bieten. Zusätzlich bietet es eine Anzahl von Methoden für die
Formatierung des Inhalts der im Container gespeichert ist:
-
setPrefix($prefix)setzt Text der dem Inhalt vorgesetzt wird.getPrefix()kann verwendet werden um jederzeit festzustellen wie die aktuellen Einstellungen sind. -
setPostfix($prefix)setzt Text der dem Inhalt angehängt wird.getPostfix()kann verwendet werden um jederzeit festzustellen wie die aktuellen Einstellungen sind. -
setSeparator($prefix)setzt Text mit dem zusammengefügte Inhalte seperiert werden.getSeparator()kann verwendet werden um jederzeit festzustellen wie die aktuellen Einstellungen sind. -
setIndent($prefix)kann verwendet werden um einen Markierungswert für den Inhalt zu setzen. Wenn ein Integer übergeben wird, wird diese Anzahl an Leerzeichen verwendet; wenn ein String übergeben wird, wird dieser String verwendet.getIndent()kann verwendet werden um jederzeit festzustellen wie die aktuellen Einstellungen sind.
<!-- Erstes View Skript -->
<?php $this->placeholder('foo')->exchangeArray($this->data) ?>
<!-- Späteres View Skript -->
<?php
$this->placeholder('foo')->setPrefix("<ul>\n <li>")
->setSeparator("</li><li>\n")
->setIndent(4)
->setPostfix("</li></ul>\n");
?>
<?php
echo $this->placeholder('foo');
// Ausgabe als unsortierte Liste mit schöner Einrückung
?>
Weil die Placeholder Container Objekte ArrayObject erweitern,
können Inhalte einem speziellen Schlüssel im Container sehr einfach zugeordnet werden,
statt diese einfach an den Container anzufügen. Auf Schlüssel kann entweder als Objekt
Eigenschaften oder als Array Schlüssel zugegriffen werden.
<?php $this->placeholder('foo')->bar = $this->data ?>
<?php echo $this->placeholder('foo')->bar ?>
<?php
$foo = $this->placeholder('foo');
echo $foo['bar'];
?>
Beispiel #9 Verwenden von Platzhaltern um Inhalt zu erfassen
Gelegentlich will man Inhalte für einen Platzhalter in einem View Skript haben die
einfachst als Vorlage zu verwenden sind; der Placeholder View Helfer
erlaubt es willkürliche Inhalte zu erfassen um diese später durch Verwendung der
folgenden API darstellen zu können.
-
captureStart($type, $key)beginnt die Erfassung der Inhalte.$typesollte eine derPlaceholderKonstantenAPPENDoderSETsein.APPENDfügt erfasste Inhalte der Liste der aktuellen Inhalte im Placeholder an;SETverwendet erfasste Inhalte als einzigen Wert für den Platzhalter (überschreibt potentiell alle vorherigen Inhalte). Standardmäßig ist$typeAPPEND.$keykann verwendet werden um einen speziellen Schlüssel im Placeholder Container zu spezifizieren an dem der Inhalt erfasst werden soll.captureStart()sperrt die Erfassung biscaptureEnd()aufgerufen wurde; Erfassungen können nicht mit dem selben Placeholder Container verschachtelt werden. Das führt zu einer Ausnahme. -
captureEnd()stoppt die Erfassung von Inhalten, und platziert Ihn im Container Objekt anhängig davon wiecaptureStart()aufgerufen wurde.
<!-- Standarderfassung: anhängen -->
<?php $this->placeholder('foo')->captureStart();
foreach ($this->data as $datum): ?>
<div class="foo">
<h2><?php echo $datum->title ?></h2>
<p><?php echo $datum->content ?></p>
</div>
<?php endforeach; ?>
<?php $this->placeholder('foo')->captureEnd() ?>
<?php echo $this->placeholder('foo') ?>
<!-- Erfassung zum Schlüssel -->
<?php $this->placeholder('foo')->captureStart('SET', 'data');
foreach ($this->data as $datum): ?>
<div class="foo">
<h2><?php echo $datum->title ?></h2>
<p><?php echo $datum->content ?></p>
</div>
<?php endforeach; ?>
<?php $this->placeholder('foo')->captureEnd() ?>
<?php echo $this->placeholder('foo')->data ?>
Konkrete Platzhalter Implementationen
Zend Framework kommt mit einer Anzahl an "konkreten" Platzhalter Implementationen. Diese sind für üblich verwendete Platzhalter: Doctype, Seitentitel, und verschiedene <head> Elemente. In allen Fällen gibt der Aufruf des Platzhalters ohne Argumente das Element selbst zurück.
Die Dokumentation für jedes Element wird separat behandelt, wie anbei beschrieben:
Doctype Helfer
Gültige HTML und XHTML Dokumente sollten eine DOCTYPE Deklaration enthalten.
Neben der Schwierigkeit sich diese zu merken, können Sie auch beeinflussen wie bestimmte
Elemente im Dokument dargestellt werden sollen (zum Beispiel, CDATA Kommentierung in
<script> und <style> Elementen.
Der Doctype Helfer erlaubt die Spezifikation von einem der folgenden Typen:
XHTML11XHTML1_STRICTXHTML1_TRANSITIONALXHTML_BASIC1XHTML1_FRAMESETHTML4_STRICTHTML4_LOOSEHTML4_FRAMESETHTML5
Es kann auch ein eigener DocType spezifiziert werden solange dieser richtig formatiert ist.
Der Doctype Helfer ist eine konkrete Implementation des
Platzhalter Helfers.
Beispiel #10 Grundsätzliche Verwendung des Doctype Helfers
Der Doctype kann jederzeit spezifiziert werden. Trotzdem werden Helfer die vom Doctype abhängen, diesen erst erkennen wenn er gesetzt wurde, sodas der einfachste Weg darin besteht Ihn in der Bootstrap zu spezifizieren:
$doctypeHelper = new Zend_View_Helper_Doctype();
$doctypeHelper->doctype('XHTML1_STRICT');
Und Ihn dann am Beginn des Layout Scripts ausgeben:
<?php echo $this->doctype() ?>
Beispiel #11 Empfangen des Doctypes
Wenn man den Doctype wissen will, kann einfach getDoctype() auf dem Objekt
aufgerufen werden, welches vom aufgerufenen Helfer zurückgegeben wird.
$doctype = $view->doctype()->getDoctype();
Typischerweise wird man einfach wissen wollen, ob der Doctype XHTML ist oder nicht;
hierfür ist die isXhtml() Methode ausreichend:
if ($view->doctype()->isXhtml()) {
// etwas anderes machen
}
HeadLink Helfer
Das HTML <link> Element wird immer mehr für das Verlinken einer Vielzahl
von Ressourcen der eigenen Site verwendet: Stylesheets, Feeds, FavIcons, Trackbacks, und
andere. Der HeadLink Helfer bietet ein einfaches Interface für die Erstellung
und das Anhäufen dieser Elemente für das spätere Empfangen und deren Ausgabe im eigenen
Layout Skript.
Der HeadLink Helfer hat spezielle Methode für das hinzufügen von Stylesheet
Links zu seinem Stack:
appendStylesheet($href, $media, $conditionalStylesheet, $extras)offsetSetStylesheet($index, $href, $media, $conditionalStylesheet, $extras)prependStylesheet($href, $media, $conditionalStylesheet, $extras)setStylesheet($href, $media, $conditionalStylesheet, $extras)
Der $media Wert ist standardmäßig 'screen', kann aber jeder gültige Media Wert
sein. $conditionalStylesheet ist ein String oder boolsches false und wird
verwendet um wärend der Darstellung zu erkennen ob spezielle Kommentare inkludiert werden
sollen um das Laden dieser Stylesheets auf diversen Plattformen zu verhindern.
$extras ist ein Array von extra Werten die man dem Tag hinzufügen will.
Zusätzlich hat der HeadLink Helfer eine spezielle Methode für das Hinzufügen
von 'alternativen' (alternate) Links zu seinem Stack:
appendAlternate($href, $type, $title, $extras)offsetSetAlternate($index, $href, $type, $title, $extras)prependAlternate($href, $type, $title, $extras)setAlternate($href, $type, $title, $extras)
Die headLink() Helfer Methode erlaubt das Spezifizieren aller Attribute die für
ein <link> Element notwendig sind, und erlaubt auch die Spezifizfikation
der Platzierung --- entweder ersetzt das neue Element alle anderen, wird vorangestellt (an
den Beginn des Stacks) , oder angefügt (an das Ende des Stacks).
Der HeadLink Helfer ist eine konkrete Implementation des
Platzhalter Helfers.
Beispiel #12 Grundsätzliche Verwendung des HeadLink Helfers
headLink kann jederzeit spezifiziert werden. Typischerweise wird ein
globaler Link im eigenen Layout Skript spezifiziert, und anwendungsspezifische Links in
den View Skripten der Anwendung. Im Layoutskript, in der <head> Sektion, muß das
der Helfer ausgegeben werden.
<?php // Links in einem View Skript setzen:
$this->headLink()->appendStylesheet('/styles/basic.css')
->headLink(array('rel' => 'favicon',
'href' => '/img/favicon.ico'),
'PREPEND')
->prependStylesheet('/styles/moz.css',
'screen',
true,
array('id' => 'my_stylesheet'));
?>
<?php // Darstellen der Links: ?>
<?php echo $this->headLink() ?>
HeadMeta Helfer
Das HTML Element <meta> wird verwendet um Meta Informationen über das
HTML Dokument anzubieten -- typischerweise Schlüsselwörter. Dokument Zeichensätze, Cache
Pragmas, usw. Meta Tags können entweder 'http-equiv' oder 'name' Typen sein, müssen ein
'content' Attribut enthalten, und können auch eines der 'lang' oder 'scheme' Modifikator
Attributen enthalten.
Der HeadMeta Helfer unterstützt die folgenden Methoden für das Setzen und
Hinzufügen von Meta Tags:
appendName($keyValue, $content, $conditionalName)offsetSetName($index, $keyValue, $content, $conditionalName)prependName($keyValue, $content, $conditionalName)setName($keyValue, $content, $modifiers)appendHttpEquiv($keyValue, $content, $conditionalHttpEquiv)offsetSetHttpEquiv($index, $keyValue, $content, $conditionalHttpEquiv)prependHttpEquiv($keyValue, $content, $conditionalHttpEquiv)setHttpEquiv($keyValue, $content, $modifiers)
Das $keyValue Element wird verwendet um einen Wert für den 'name' oder
'http-equiv' Schlüssel zu definieren; $content ist der Wert für den 'content'
Schlüssel, und $modifiers ist ein optionales assoziatives Array das Schlüssel
für 'land und/oder 'scheme' enthalten kann.
Meta Tags können auch gesetzt werden indem die headMeta() Helfermethode
verwendet wird, welche die folgende Signatur hat: headMeta($content, $keyValue,
$keyType = 'name', $modifiers = array(), $placement = 'APPEND').
$keyValue ist der Intalt für den Schlüssel der in $keyType
spezifiziert ist, und welche entweder 'name' oder 'http-equiv' sein sollte.
$placement kann entweder 'SET' (überschreibt alle vorher gespeicherten Werte),
'APPEND' (fügt an das Ende des Stacks hinzu), oder 'PREPEND' (fügt an den Beginn des Stacks
hinzu) sein.
HeadMeta überschreibt append(), offsetSet(),
prepend(), und set() um die Verwendung der speziellen Methoden wie
oben gelistet zu erzwingen. Intern wird jedes Element als stdClass Token
gespeichert, welches später durch Verwendung der itemToString() Methode
serialisiert wird. Das erlaubt es Prüfungen an den Elementen im Stack durchzuführen, und
diese Elemente optional zu verändern indem einfach das zurückgegebene Objekt verändert wird.
Der HeadMeta Helfer ist eine konkrete Implementation des
Platzhalter Helfers.
Beispiel #13 Grundsätzliche Verwendung des HeadMeta Helfers
Neue Meta Tags können jederzeit spezifiziert werden. Typischerweise werden Clientseitige Cacheregeln oder SEO Schlüsselwörter spezifiziert.
Wenn zum Beispiel ein spezielles SEO Schlüsselwort spezifiziert werden soll, kann das durch die Erstellung eines Meta Nametags, mit dem Namen 'keywords' und dem Inhalt des Schlüsselworts das mit der Seite assoziiert werden soll, geschehen:
// Meta Schlüsselwörter setzen
$this->headMeta()->appendName('keywords', 'framework php productivity');
Wenn Clientseitige Cacheregeln gesetzt werden sollen, können http-equiv Tags mit den Regeln die erzwungen werden sollen, gesetzt werden:
// Clientseitiges cachen verhindern
$this->headMeta()->appendHttpEquiv('expires',
'Wed, 26 Feb 1997 08:21:57 GMT')
->appendHttpEquiv('pragma', 'no-cache')
->appendHttpEquiv('Cache-Control', 'no-cache');
Ein anderer populärer Verwendungszweck für Meta Tags ist das Setzen des Inhalt-Typs, Zeichensatzes, und der Sprache:
// Setzen des Inhalttyps und des Zeichensatzes
$this->headMeta()->appendHttpEquiv('Content-Type',
'text/html; charset=UTF-8')
->appendHttpEquiv('Content-Language', 'en-US');
Als letztes Beispiel, ein einfacher Weg um eine kurze Nachricht anzuzeigen bevor mit Hilfe eines "Meta Refreshes" weitergeleitet wird:
// Einen Meta Refresh mit 3 Sekunden zu einer neuen URL setzen:
$this->headMeta()->appendHttpEquiv('Refresh',
'3;URL=http://www.some.org/some.html');
Wenn man bereit ist die Meta Tags im Layout zu platzieren, muß einfach der Helfer ausgegeben werden:
<?php echo $this->headMeta() ?>
HeadScript Helfer
Das HTML <script> Element wird verwendet um entweder Clientseitige
Skriptelemente Inline zu ermöglichen oder um eine entfernte Ressource zu verlinken die
Clientseitigen Skriptcode enthält. Der HeadScript Helfer erlaubt es beides zu
Managen.
Der HeadScript Helfer unterstützt die folgenden Methoden für das Setzen und
Hinzufügen von Skripten:
appendFile($src, $type = 'text/javascript', $attrs = array())offsetSetFile($index, $src, $type = 'text/javascript', $attrs = array())prependFile($src, $type = 'text/javascript', $attrs = array())setFile($src, $type = 'text/javascript', $attrs = array())appendScript($script, $type = 'text/javascript', $attrs = array())offsetSetScript($index, $script, $type = 'text/javascript', $attrs = array())prependScript($script, $type = 'text/javascript', $attrs = array())setScript($script, $type = 'text/javascript', $attrs = array())
Im Falle der *File() Methoden ist $src der entfernte Ort des
Skriptes das geladen werden soll; das ist üblicherweise in der Form einer URL oder eines
Pfades. Für die *Script() Methoden sind $script die clientseitigen
Skript Direktiven die in diesem Element verwendet werden sollen.
Hinweis: Abhängige Kommentare setzen
HeadScripterlaubt es ein Script Tag in abhängige Kommentare zu setzen, das es erlaubt es vor speziellen Browsern zu verstecken. Um abhängige Tags zu setzen, muß der abhängige Wert als Teil des$attrsParameters im Methodenaufruf übergeben werden.
Beispiel #14 Headscript mit abhängigen Kommentaren
// Scripte hinzufügen $this->headScript()->appendFile( '/js/prototype.js', 'text/javascript', array('conditional' => 'lt IE 7') );
HeadScript erlaubt auch das Erfassen von Skripten; das kann nützlich sein wenn
man ein Clientseitiges Skript programmtechnisch erstellen und es dann woanders platzieren
will. Seine Verwendung wird in einem Beispiel anbei gezeigt.
Letztendlich kann die headScript() Methode verwendet werden um Skript Elemente
schnell hinzuzufügen; die Signatur hierfür ist headScript($mode = 'FILE', $spec,
$placement = 'APPEND'). Der $mode ist
entweder 'FILE' oder 'SCRIPT', anhängig davon ob das Skript verlinkt oder definiert wird.
$spec ist entweder die Skriptdatei die verlinkt wird, oder der Skriptcode
selbst. $placement sollte entweder 'APPEND', 'PREPEND' oder 'SET' sein.
HeadScript überschreibt append(), offsetSet(),
prepend(), und set() um um die Verwendung der speziellen Methoden
wie vorher gezeigt zu erzwingen. Intern wird jedes Element als stdClass Token
gespeichert, welches später mit Hilfe der itemToString() Methode serialisiert
wird. Das erlaubt es Prüfungen an den Elementen im Stack vorzunehmen, und diese Elemente
optional zu ändern, einfach durch das Modifizieren des zurückgegebenen Objektes.
Der HeadScript Helfer ist eine konkrete Implementation des
Platzhalter Helfers.
Hinweis: InlineScript für HTML Body Skripte verwenden
HeadScript's Schwester Helfer, InlineScript, sollte verwendet werden wenn man Inline Skripte im HTMLbodyinkludieren will. Die Platzierung von Skripten am Ende des Dokuments ist eine gängige Praxis für die schnellere Auslieferung von Seiten, speziell wenn 3rd Party Analyse Skripte verwendet werden.
Hinweis: Andere Attribute werden stanadrdmäßig ausgeschaltet
Standardmäßig wirdHeadScriptnur<script>Attribute darstellen die von W3C abgesegnet sind. Diese beinhalten 'type', 'charset', 'defer', 'language', und 'src'. Trotzdem, verwenden einige Javascript Frameworks, vorallem » Dojo, eigene Attribute um Verhalten zu ändern. Um solche Attribute zu erlauben, können diese über diesetAllowArbitraryAttributes()Methode eingeschaltet werden:
$this->headScript()->setAllowArbitraryAttributes(true);
Beispiel #15 Grundsätzliche Verwendung des HeadScript Helfers
Neue Skript Tags können jederzeit spezifiziert werden. Wie vorher beschrieben können diese Links auf externe Ressourcen Dateien oder Skripte sein.
// Skripte hinzufügen
$this->headScript()->appendFile('/js/prototype.js')
->appendScript($onloadScript);
Die Reihenfolge ist oft wichtig beim Clientseitigen Skripting; es kann notwendig sein sicherzustellen das Bibliotheken in einer speziellen Reihenfolge geladen werden da Sie Abhängigkeiten zueinander haben; die verschiedenen append, prepend und offsetSet Direktiven können hierbei helfen:
// Skripte in eine Reihenfolge bringen
// An einem bestimmten Offset Platzieren um Sicherzustellen
// das es als letztes geladen wird
$this->headScript()->offsetSetFile(100, '/js/myfuncs.js');
// Scriptige Effekte verwenden (append verwendet den nächsten Index, 101)
$this->headScript()->appendFile('/js/scriptaculous.js');
// Aber Basis Prototype Skripte müssen immer als erstes geladen werden
$this->headScript()->prependFile('/js/prototype.js');
Wenn man letztendlich damit fertig ist am alle Skripte im Layoutskript darzustellen, muß der Helfer einfach ausgegeben werden:
<?php echo $this->headScript() ?>
Beispiel #16 Skripte einfachen mit Hilfe des HeadScript Helfers
Manchmal mit ein Clientseitiges Skript programmtechnisch erstellt werden. Wärend man
Strings zusammenhängen, Heredocs und ähnliches verwenden könnte, ist es oft einfacher
nur das Skript zu erstellen und in PHP Tags einzubetten. HeadScript lässt
das zu, und erfasst es in den Stack:
<?php $this->headScript()->captureStart() ?>
var action = '<?php echo $this->baseUrl ?>';
$('foo_form').action = action;
<?php $this->headScript()->captureEnd() ?>
Die folgenden Annahmen werden gemacht:
-
Das Skript wird an den Stack angefügt. Wenn es den Stack ersetzen soll oder an den Anfang hinzugefügt werden soll, muß 'SET' oder 'PREPEND' als erstes Argument an
captureStart()übergeben werden. -
Der MIME Typ des Skripts wird mit 'text/javascript' angenommen; wenn ein anderer Typ spezifiziert werden soll muß dieser als zweites Argument an
captureStart()übergeben werden. -
Wenn irgendwelche zusätzlichen Attribute für das
<script>Tag spezifiziert werden sollen, müssen diese in einem Array als drittes Argument ancaptureStart()übergeben werden.
HeadStyle Helfer
Das HTML Element <style> wird verwendet um CSS Stylesheets im HTML
Element <head> zu inkludieren.
Hinweis: HeadLink verwenden um CSS Dateien zu verlinken
HeadLink sollte verwendet werden um<link>Elemente zu Erstellen die externe Stylesheets enthalten.HeadScriptwird verwendet wenn man Stylesheets inline definieren will.
Der HeadStyle Helfer unterstützt die folgenden Methoden für das Setzen und
Hinzufügen von Stylesheet Deklarationen:
appendStyle($content, $attributes = array())offsetSetStyle($index, $content, $attributes = array())prependStyle($content, $attributes = array())setStyle($content, $attributes = array())
In allen Fällen ist $content die aktuelle CSS Deklaration.
$attributes sind alle zusätzlichen Attribute die das style Tag
erhalten soll: lang, title, media, oder dir sind alle möglich.
Hinweis: Abhängige Kommentare setzen
HeadStyleerlaubt es ein Script Tag in abhängige Kommentare zu setzen, das es erlaubt es vor speziellen Browsern zu verstecken. Um abhängige Tags zu setzen, muß der abhängige Wert als Teil des$attrsParameters im Methodenaufruf übergeben werden.
Beispiel #17 Headstyle mit abhängigen Kommentaren
// Skripte hinzufügen $this->headStyle()->appendStyle($styles, array('conditional' => 'lt IE 7');
HeadStyle erlaubt auch das Erfassen von Style Deklarationen; das kann nützlich
sein wenn eine Deklaration programmtechnisch erstellt werden soll und Sie dann woanders
platziert wird. Die Verwendung hierfür wird in einem unten angeführten Beispiel gezeigt.
Letztendlich kann auch die headStyle() Methode verwendet werden um schnellstens
Deklarationselemente hinzuzufügen; die Signatur dafür ist
headStyle($content$placement = 'APPEND', $attributes = array()).
$placement sollte entweder 'APPEND', 'PREPEND', oder 'SET' sein.
HeadStyle überschreibt jedes append(), offsetSet(),
prepend(), und set() um die Verwendung der oben gelisteten
speziellen Methoden zu forcieren. Intern wird jeder Teil als stdClass Token
gespeichert, welches später serialisiert wird durch Verwendung der
itemToString() Methode. Das erlaubt es die Teile im Stack zu Prüfen, und
optional auch zu Ändern durch einfaches Modifizieren des zurückgegebenen Objektes.
Der HeadStyle Helfer ist eine konkrete Implementation des
Platzhalter Helfers.
Beispiel #18 Grundsätzliche Verwendung des HeadStyle Helfers
Ein neues Style Tag kann jederzeit spezifiziert werden:
// Stile hinzufügen $this->headStyle()->appendStyle($styles);
Die Reihenfolge ist in CSS sehr wichtig; es könnte sein das man sichergestellen muß das Deklarationen in einer speziellen Reihenfolge geladen werden wegen der Reihenfolge der Kaskade; die verschiedenen append, prepend und offsetSet Direktiven können für diesen Zweck verwendet werden:
// Styles in Reihenfolge bringen // Ein spezielles Offset platzieren: $this->headStyle()->offsetSetStyle(100, $customStyles); // Am Ende platzieren: $this->headStyle()->appendStyle($finalStyles); // Am Anfang platzieren: $this->headStyle()->prependStyle($firstStyles);
Wenn man damit fertig ist und alle Style Deklarationen im Layout Skript ausgegeben werden können kann der Helfer einfach wiederholt werden:
<?php echo $this->headStyle() ?>
Beispiel #19 Den HeadStyle Helfer verwenden um Style Deklarationen zu Erfassen
Hier und da müssen CSS Style Deklarationen programmtechnisch erstellt werden. Wärend
String Kopplungen, HereDocs und ähnliches verwendet werden könnte, ist es oft einfacher
das durch erstellen der Styles und deren Einfügung in PHP Tags zu machen.
HeadStyle lässt das zu indem es in den Stack erfasst wird:
<?php $this->headStyle()->captureStart() ?>
body {
background-color: <?php echo $this->bgColor ?>;
}
<?php $this->headStyle()->captureEnd() ?>
Die folgenden Annahmen werden gemacht:
-
Die Style Deklarationen werden dem Stack angefügt. Wenn Sie den Stack ersetzen sollen oder an den Anfang hinzugefügt werden sollten muß 'SET' oder 'PREPEND' als erstes Argument an
captureStart()übergeben werden -
Wenn zusätzliche Attribute für das
<style>Tag spezifiziert werden sollen, dann müssen diese in einem Array als zweites Argument ancaptureStart()übergeben werden.
HeadTitle Helfer
Das HTML <title> Element wird verwendet um einen Titel für ein HTML
Dokument anzubieten. Der HeadTitle Helfer erlaubt es Titel für späteren Empfang
und Ausgabe programmtechnisch zu Erstellen und zu Speichern.
Der HeadTitle Helfer ist eine konkrete Implementation des
Plaltzhalter Helfer. Er
überschreibt die toString() Methode um die erstellung des
<title> Elements zu erzwingen, und fgt eine headTitle()
Methode für das schnelle und einfache Einstellen und Ändern von Titel Elementen hinzu. Die
Signatur dieser Methode ist headTitle($title, $setType = 'APPEND');
standardmäßig, wird der Wert dem Stack angefügt (Anhäufen von Title Segmenten), aber es kann
auch 'PREPEND' (Platzierung am Anfang des Stacks) oder 'SET' (Stack überschreiben)
spezifiziert werden.
Beispiel #20 Grundsätzliche Verwendung des HeadTitle Helfers
Es kann jederzeit ein Titel Tag spezifiziert werden. Die typische Verwendung besteht darin das Titel Segment bei jedem Level an Tiefe in der Anwendung: Site, Kontroller, Aktion und potentiell Ressourcen.
// Setzen des Kontroller und Aktion Namens als Titel Segment:
$request = Zend_Controller_Front::getInstance()->getRequest();
$this->headTitle($request->getActionName())
->headTitle($request->getControllerName());
// Setzen der Site im Titel; möglicherweise das Layout Skript:
$this->headTitle('Zend Framework');
// Setzen eines Separator Strings für Segmente:
$this->headTitle()->setSeparator(' / ');
Wenn man letztendlich damit fertig ist den Titel im Layoutskript darzustellen, muß dieser einfach ausgegeben werden:
<!-- Darstellung <action> / <controller> / Zend Framework --> <?php echo $this->headTitle() ?>
HTML Objekt Helfer
Das HTML <object> Element wird für das Einbetten von Medien wie
Flash oder Quicktime in Webseiten verwendet. Der Object View Helfer übernimmt die Einbettung
von Medien mit einem minimalen Aufwand.
Es gibt initial view Objekt Helfer:
-
formFlashErzeugt Markup für die Einbettung von Flash Dateien. -
formObjectErzeugt Markup für die Einbettung von eigenen Objekten. -
formPageErzeugt Markup für die Einbettung anderer (X)HTML Seiten. -
formQuicktimeErzeugt Markup für die Einbettung von QuickTime Dateien.
Alle diese Helfer teilen sich das gleiche Interface. Aus diesem Grund enthält diese Dokumentation nur Beispiele für zwei dieser Helfer.
Beispiel #21 Flash Helfer
Die Einbettung von Flash in die eigene Seite mit Hilfe des Helfers ist recht direkt. Das einzige benötigte Argument ist die Ressource URI.
<?php echo $this->htmlFlash('/path/to/flash.swf'); ?>
Das gibt das folgende HTML aus:
<object data="/path/to/flash.swf"
type="application/x-shockwave-flash"
classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">
</object>
Zusätzlich können Attribute, Parameter und Inhalte definiert werden die mit dem
<object> dargestellt werden. Das wird durch Verwendung des
htmlObject Helfers demonstriert.
Beispiel #22 Anpassen des Objekts durch die Übergabe von zusätzlichen Argumenten
Das erste Argument des Objekt Helfers wird immer benötigt. Es ist die URI zu der
Ressource die man einbetten will. Das zweite Argument wird nur im
htmlObject Helfer benötigt. Die anderen Helfer enthalten bereits den
wichtigen Wert für dieses Argument. Der dritte Parameter wird für die Übergabe von
Argumenten an das Objekt Element verwendet. Es akzeptiert nur ein Array mit
Schlüssel-Wert Paaren. Die classid und codebase sind Beispiel
für solche Attribute. Das vierte Argument nimmt auch Schlüssel-Wert Paare und verwendet
diese für die Erstellung von <param> Elementen. Sie sehen in
Kürze ein Beispiel hierfür. Letztendlich, gibt es eine Option für das zur
Verfügungstellen von zusätzlichen Inhalten beim Objekt. Jetzt folgt ein Beispiel welches
alle Argumente verwendet.
echo $this->htmlObject(
'/path/to/file.ext',
'mime/type',
array(
'attr1' => 'aval1',
'attr2' => 'aval2'
),
array(
'param1' => 'pval1',
'param2' => 'pval2'
),
'some content'
);
/*
Das würde folgendes ausgeben:
<object data="/path/to/file.ext" type="mime/type"
attr1="aval1" attr2="aval2">
<param name="param1" value="pval1" />
<param name="param2" value="pval2" />
some content
</object>
*/
InlineScript Helfer
Das HTML <script> Element wird verwendet um entweder Clientseitige
Skriptelemente Inline zu ermöglichen oder um eine entfernte Ressource zu verlinken die
Clientseitigen Skriptcode enthält. Der InlineScript Helfer erlaubt es beides zu
managen. Er ist von HeadScript
abgeleitet und jede Methode dieses Helfers ist vorhanden; trotzdem, sollte die
inlineScript() Methode statt headScript() verwendet werden.
Hinweis: InlineScript für HTML Body Skripte verwenden
InlineScript, sollte verwendet werden wenn man Skripte im HTMLbodyinkludieren will. Skripte am Ende des Dokuments zu platzieren ist eine gute Praxis um das Versenden von Seiten schneller zu machen, speziell wen 3rd Party Analyse Skripte verwendet werden.
Einige JS Bibliotheken müssen im HTMLhead; für diese Skripte sollte HeadScript verwendet werden.
JSON Helfer
Wenn Views erstellt werden die JSON zurückgeben ist es wichtig auch den entsprechenden Antwort-Header zu setzen. Der JSON View Helfer macht exakt das. Zusätzlich schaltet er, standardmäßig, Layouts aus (wenn diese aktuell eingeschaltet sind), weil Layouts generell nicht mit JSON Antworten verwendet werden.
Der JSON Helfer setzt die folgenden Header:
Content-Type: application/json
Die meisten AJAX Bibliotheken sehen nach diesem Header wenn die Antworten geparst werden um festzustellen wie der Inhalt handzuhaben ist.
Die Verwendung des JSON Helfers ist sehr geradlienig:
<?php echo $this->json($this->data) ?>
Hinweis: Layouts behalten und Encoding einschalten durch Verwendung von Zend_Json_Expr
Jede Methode im JSON Helfer akzwptiert ein zweites, optionales, Argument. Dieses zweite Argument kan ein boolsches Flag sein um Layouts ein- oder auszuschalten, oder ein Array von Optionen die anZend_Json::encode()übergeben und intern verwendet werden um Daten zu kodieren.
Um Layouts zu behalten muß der zweite Parameter ein boolschestruesein. Wenn der zweite Parameter ein Array ist, können Layouts behalten werden indem einkeepLayoutsSchlüssel mit dem boolschen Werttrueeingefügt wird.
Zend_Json::encode erlaubt es native JSON Ausdrücke zu kodieren indem Zend_Json_Expr Objekte verwendet werden. Diese Option ist standardmäßig deaktiviert. Um diese Option zu aktivieren, muß ein boolsches// Ein boolsches true als zweites Argument aktiviert Layouts: echo $this->json($this->data, true); // Oder ein boolsches true als "keepLayouts" Schlüssel: echo $this->json($this->data, array('keepLayouts' => true));truean denenableJsonExprFinderSchlüssel des Options Arrays übergeben werden:
<?php echo $this->json($this->data, array( 'enableJsonExprFinder' => true, 'keepLayouts' => true, )) ?>
Übersetzungs Helfer
Oft sind Webseiten in verschiedenen Sprachen vorhanden. Um den Inhalt einer Site zu
übersetzen sollte ganz einfach Zend Translate verwendet werden, und um
Zend Translate in der eigenen View zu integrieren sollte der
Translate View Helfer verwendet werden.
In allen folgenden Beispielen verwenden wir den einfachen Array Übersetzungs Adapter.
Natürlich kann jede Instanz von Zend_Translate und genauso jede
Subklasse von Zend_Translate_Adapter verwendet werden. Es gibt
verschiedene Wege den Translate View Helfer zu initiieren:
-
Registriert, durch eine vorher in Zend_Registry registrierte Instanz
-
Danach, durch das Fluent Interface
-
Direkt, durch Instanzierung der Klasse
Eine registrierte Instanz von Zend_Translate ist die bevorzugte Verwendung für diesen Helfer. Bevor der Adapter der Registry hinzugefügt wird, kann das zu verwendende Gebietsschema einfach ausgewählt werden.
Hinweis: Wir sprechen hier von Gebietsschemata (Locale) statt von Sprachen weil eine Sprache auch in verschiedenen Regionen vorhanden sein kann. Zum Beispiel wird Englisch in verschiedenen Dialekten gesprochen. Es könnte eine Übersetzung für Britisch und eine für Amerikanisches Englisch geben. Deswegen sagen wir Gebietsschema "locale" statt Sprache.
Beispiel #42 Registrierte Instanz
Um eine registrierte Instanz zu verwenden muß einfach eine Instanz von Zend_Translate oder Zend_Translate_Adapter erstellt werden und in Zend_Registry durch Verwendung des Schlüssels Zend_Translate registriert werden.
// unser Beispieladapter
$adapter = new Zend_Translate('array', array('simple' => 'einfach'), 'de');
Zend_Registry::set('Zend_Translate', $adapter);
// In der View
echo $this->translate('simple');
// gibt 'einfach' zurück
Wenn man mit dem Fluent Interface besser zurecht kommt, kann eine Instanz auch in der View erstellt werden und der Helfer im Nachhinein initiiert werden.
Beispiel #43 In der View
Um das Fluid Interface zu verwenden muß eine Instanz von
Zend_Translate oder Zend_Translate_Adapter
erstellt werden, der Helfer ohne Parameter und anschließend die
setTranslator() Methode aufgerufen werden.
// in der View
$adapter = new Zend_Translate('array', array('simple' => 'einfach'), 'de');
$this->translate()->setTranslator($adapter)->translate('simple');
// das gibt 'einfach' zurück
Wenn der Helfer ohne Zend_View verwendet werden soll kann er auch direkt angesprochen werden.
Beispiel #44 Direkte Verwendung
// unser Beispieladapter
$adapter = new Zend_Translate('array', array('simple' => 'einfach'), 'de');
// den Helfer initiieren
$translate = new Zend_View_Helper_Translate($adapter);
print $translate->translate('simple'); // das gibt 'einfach' zurück
Dieser Weg kann verwendet werden wenn man nicht mit Zend_View arbeitet und übersetzte Ausgaben erzeugen muß.
Wie man bereits sehen konnte, wird die translate() Methode verwendet um die
Übersetzung zurückzugeben. Sie muss nur mit der benötigten messageid des
Übersetzungsadapters aufgerufen werden. Aber sie kann auch Parameter im Übersetzungsstring
ersetzen. Deswegen akzeptiert Sie variable Parameter in zwei Wegen: entweder als Liste von
Parametern, oder als Array von Parametern. Als Beispiel:
Beispiel #45 Einzelne Parameter
Um einen einzelnen Parameter zu verwenden muss dieser einfach der Methode angefügt werden.
// innerhalb der View
$date = "Montag";
$this->translate("Today is %1\$s", $date);
// könnte 'Heute ist Montag' zurückgeben
Hinweis: Wenn man Parameter verwendet die auch Text sind ist zu beachten das es auch nötig sein kann diese Parameter zu übersetzen.
Beispiel #46 Liste von Parametern
Oder eine Liste von Parametern verwenden und diese der Methode hinzufügen.
// innerhalb der View
$date = "Monday";
$month = "April";
$time = "11:20:55";
$this->translate("Today is %1\$s in %2\$s. Actual time: %3\$s",
$date,
$month,
$time);
// könnte 'Heute ist Monday in April. Aktuelle Zeit: 11:20:55' zurückgeben
Beispiel #47 Array von Parametern
Oder ein Array von Parametern verwenden und dieses der Methode hinzufügen.
// innerhalb der View
$date = array("Monday", "April", "11:20:55");
$this->translate("Today is %1\$s in %2\$s. Actual time: %3\$s", $date);
// könnte 'Heute ist Monday in April. Aktuelle Zeit: 11:20:55' zurückgeben
Manchmal ist es notwendig das Gebietsschema der Übersetzung zu Ändern. Das kann entweder dynamisch pro Übersetzung oder statisch für alle folgenden Übersetzungen durchgeführt werden. Dies kann mit beidem, einer Liste von Paramtern oder einem Array von Parametern, verwendet werden. In beiden Fällen muss das als letzter einzelner Parameter angegeben werden.
Beispiel #48 Das Gebietsschema dynamisch wechseln
// innerhalb der View
$date = array("Monday", "April", "11:20:55");
$this->translate("Today is %1\$s in %2\$s. Actual time: %3\$s", $date, 'it');
Dieses Beispiel gibt die italienische Übersetzung für die messageid zurück. Aber Sie wird nur einmal verwendet. Die nächste Übersetzung verwendet wieder das Gebietsschema des Adapters. Normalerweise wird das gewünschte Gebietsschema im Übersetzungsadapter gesetzt bevor dieser der Registry hinzugefügt wird. Das Gebietsschema kann aber auch im Helfer gesetzt werden:
Beispiel #49 Das Gebietsschema statisch wechseln
// innerhalb der View
$date = array("Monday", "April", "11:20:55");
$this->translate()->setLocale('it');
$this->translate("Today is %1\$s in %2\$s. Actual time: %3\$s", $date);
Das obige Beispiel setzt 'it' als neues standardmäßiges Gebietsschema welches
für alle weiteren Übersetzungen verwendet wird.
Natürlich gibt es auch eine getLocale() Methode um das aktuell gesetzte
Gebietsschema zu erhalten.
Beispiel #50 Das aktuell gesetzte Gebietsschema erhalten
// innerhalb der View
$date = array("Monday", "April", "11:20:55");
// gibt 'de' als standardmäßig gesetztes Gebietsschema
// vom obigen Beispiel zurück
$this->translate()->getLocale();
$this->translate()->setLocale('it');
$this->translate("Today is %1\$s in %2\$s. Actual time: %3\$s", $date);
// gibt 'it' als neues standardmäßig gesetztes Gebietsschema zurück
$this->translate()->getLocale();
Helfer Pfade
Wie bei den View Skripten kann der Controller für Zend_View auch
einen Stapel an Pfaden festlegen, in dem nach Hilfsklassen gesucht werden soll.
Standardmäßig sucht Zend_View in "Zend/View/Helper/*" nach
Hilfsklassen. Du kannst Zend_View mit Hilfe der Methoden
setHelperPath() und addHelperPath() mitteilen, auch in anderen
Verzeichnissen zu suchen. Zusätzlich kann man einen Klassenpräfix angeben, um Helfer in
dem bereit gestellten Pfad verwenden zu können, um eigene Namensräume für die
Helferklassen zu verwenden. Standardmäßig wird 'Zend_View_Helper_' angenommen, wenn kein
Präfix angegeben wird.
$view = new Zend_View();
// Setze den Pfad auf /path/to/more/helpers, mit dem Präfix 'My_View_Helper'
$view->setHelperPath('/path/to/more/helpers', 'My_View_Helper');
Durch Verwendung der addHelperPath() Methode können die Pfade "gestapelt"
werden. Wenn du Pfade zu diesem Stapelspeicher hinzufügst, wird
Zend_View im zuletzt hinzugefügten Pfad nach der angeforderten
Hilfsklasse schauen. Dies erlaubt dir, zu den vorhandenen Helfern weitere hinzufügen
oder diese durch eigene zu ersetzen.
$view = new Zend_View();
// Füge /path/to/some/helpers mit Klassenpräfix 'My_View_Helper' hinzu
$view->addHelperPath('/path/to/some/helpers', 'My_View_Helper');
// Füge /other/path/to/helpers mit Klassenpräfix 'Your_View_Helper' hinzu
$view->addHelperPath('/other/path/to/helpers', 'Your_View_Helper');
// wenn nun $this->helperName() aufgerufen wird, wird Zend_View zuerst nach
// "/path/to/some/helpers/HelperName" mit dem Klassennamen
// "Your_View_Helper_HelperName", dann nach
// "/other/path/to/helpers/HelperName.php" mit dem Klassennamen
// "My_View_Helper_HelperName", und zuletzt nach
// "Zend/View/Helpers/HelperName.php" mit dem Klassennamen
// "Zend_View_Helper_HelperName" schauen.
Eigene Helfer schreiben
Eigene Helfer zu schreiben ist einfach; du mußt nur diese Regeln befolgen:
Wärend das nicht strikt notwendig ist, ist es empfohlen entweder Zend_View_Helper_Interface zu implementieren oder Zend_View_Helper_Abstract zu erweitern wenn eigene Helfer erstellt werden. Eingeführt mit 1.6.0, definieren diese einfach die
setView()Methode; trotzdem, in kommenden Releases, ist es geplant ein Strategy Pattern zu implementieren das vieles der Namensschemas einfacher mach wie anbei beschrieben. Wenn darauf aufgebaut wird hilft das, das der eigene Code Zukunftssicher ist.Der Klassenname muss mindestens auf den Helfernamen unter Verwendung der MixedCaps selber enden. Wenn du z.B. einen Helfer mit Namen "specialPurpose" schreibst, muss der Klassenname mindestens "SpecialPurpose" lauten. Man kann, und sollte, dem Klassennamen einen Präfix geben und es wird empfohlen, 'View_Helper' als Teil des Präfix zu verwenden: "My_View_Helper_SpecialPurpose" (man muss den Präfix mit oder oder abschließenden Unterstrich an
addHelperPath()odersetHelperPath()übergeben).Die Klasse muss eine öffentliche Methode mit dem Namen des Helfers haben. Dies ist die Methode, welche vom View Skript durch "$this->specialPurpose()" aufgerufen wird. In unserem "specialPurpose" Beispiel, würde die notwendige Deklaration dieser Methode "public function specialPurpose()" lauten.
Im Allgemeinen sollte die Klasse keine Ausgaben durch echo(), print() oder auf andere Weise erstellen. Stattdessen sollte es die auszugebenen Werte zurückgeben. Die zurückgegebenen Werte sollten entsprechend maskiert werden.
Diese Klasse muss sich in einer Datei befinden, die nach der Helfermethode benannt ist. Bezogen auf unser "specialPurpose" Beispiel, muss der Dateiname "SpecialPurpose.php" lauten.
Platziere die Hilfsklasse irgendwo in deinem Stapelspeicher für Hilfspfade und Zend_View wird den Helfer automatisch für dich laden, instanziieren, speichern und ausführen.
Hier ist ein Beispiel für unseren SpecialPurpose Helfer:
class My_View_Helper_SpecialPurpose extends Zend_View_Helper_Abstract
{
protected $_count = 0;
public function specialPurpose()
{
$this->_count++;
$output = "Ich habe 'The Jerk' {$this->_count} Mal(e) gesehen.";
return htmlspecialchars($output);
}
}
Dann rufst du in einem View Skript den SpecialPurpose Helfer so oft auf,
wie du möchtest; er wird einmal instanziiert und bleibt für die Lebensdauer der
Zend_View Instanz bestehen.
// denke daran, dass $this in deinem View Skript auf die // Zend_View Instanz verweist. echo $this->specialPurpose(); echo $this->specialPurpose(); echo $this->specialPurpose();
Die Ausgabe wird in etwa so aussehen:
Ich habe 'The Jerk' 1 Mal(e) gesehen. Ich habe 'The Jerk' 2 Mal(e) gesehen. Ich habe 'The Jerk' 3 Mal(e) gesehen.
Hier und da ist es notwendig das aufrufende Zend_View Objekt
aufzurufen -- zum Beispiel, wenn es notwendig ist die registrierte Verschöüsselung zu
verwenden, oder wenn ein anderes View Skript gerendert werden soll, als Teil des eigenen
Helfers. Um Zugriff zum View Objekt zu erhalten, sollte die eigene Helfer Klasse eine
setView($view) Methode wie folgt besitzen:
class My_View_Helper_ScriptPath
{
public $view;
public function setView(Zend_View_Interface $view)
{
$this->view = $view;
}
public function scriptPath($script)
{
return $this->view->getScriptPath($script);
}
}
Wenn die Helfer Klasse eine setView() Methode hat, wird diese aufgerufen
wenn die Helfer Klasse das erste Mal instanziert wird, und das aktuelle View Objekt
übergeben wird. Es liegt an einem selbst das Objekt in der Klasse zu fixieren, genau so
wie herauszufinden wie auf dieses zugegriffen werden sollte.
Wenn Zend_View_Helper_Abstract erweitert wird, muß diese Methode nicht selbst definiert werden da Sie schon vordefiniert ist.
| View Scripte |
