| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- Reviewed: no -->
- <sect1 id="learning.view.placeholders.standard">
- <title>Standard Platzhalter</title>
- <para>
- In der <link linkend="learning.view.placeholders.basics">vorherigen Sektion</link>, haben
- wir den <methodname>placeholder()</methodname> View Helfer kennengelernt, und wie er für das
- Sammeln eigener Inhalte verwendet werden kann. In dieser Sektion sehen wir uns einige
- konkrete Platzhalter an die mit Zend Framework ausgeliefert werden, und wie Sie für den
- eigenen Vorteil verwendet werden können wenn komplexe kombinierte Layouts erstellt werden.
- </para>
- <para>
- Die meisten mitgelieferten Platzhalter sind für die Erstellung von Inhalten der
- <emphasis><head></emphasis> Sektion des Layout Inhalts -- ein Areal das man
- normalerweise nicht direkt über Anwendungs View Skripte manipuliert, aber eines das man
- beeinflussen will. Als Beispiel: Wenn man will das der Titel auf jeder Seite bestimmte
- Inhalte enthält, aber spezifische Inhalte auf dem Controller und/oder der Aktion basieren;
- wenn man <acronym>CSS</acronym> Dateien spezifizieren will um Sie basieren auf der Sektion
- in der man sich befindet zu Laden; wenn man spezifische JavaScript Skripts zu
- unterschiedlichen Zeiten laden will; oder wenn man die <emphasis>DocType</emphasis>
- Deklaration setzen will.
- </para>
- <para>
- Zend Framework wird mit einer Platzhalter Implementation für jede dieser Situationen
- ausgeliefert, und verschiedenen mehr.
- </para>
- <sect2 id="learning.view.placeholders.standard.doctype">
- <title>Setzen vom DocType</title>
- <para>
- Die <emphasis>DocType</emphasis> Deklaration ist problematisch zu merken, und oft ist es
- essentiell Sie in die Dokumente einzubinden um sicherzustellen das der Browser den
- Inhalt richtig darstellt. Der <methodname>doctype()</methodname> View Helfer erlaubt es
- einfache String Merkmale zu verwenden um den gewünschten <emphasis>DocType</emphasis> zu
- spezifizieren; zusätzlich fragen andere Helfer den <methodname>doctype()</methodname>
- ab, um sicherzustellen dass die erzeugte Ausgabe mit dem angefragten
- <emphasis>DocType</emphasis> übereinstimmt.
- </para>
- <para>
- Wenn man als Beispiel <acronym>XHTML1</acronym> Strict <acronym>DTD</acronym> verwenden
- will kann man einfach folgendes spezifizieren:
- </para>
- <programlisting language="php"><![CDATA[
- $this->doctype('XHTML1_STRICT');
- ]]></programlisting>
- <para>
- Neben anderen vorhandenen Gedächnishilfen sind die folgenden Typen zu finden:
- </para>
- <variablelist>
- <varlistentry>
- <term>XHTML1_STRICT</term>
- <listitem>
- <para>
- <acronym>XHTML</acronym> 1.0 Strict
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>XHTML1_TRANSITIONAL</term>
- <listitem>
- <para>
- <acronym>XHTML</acronym> 1.0 Transitional
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>HTML4_STRICT</term>
- <listitem>
- <para>
- <acronym>HTML</acronym> 4.01 Strict
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>HTML4_Loose</term>
- <listitem>
- <para>
- <acronym>HTML</acronym> 4.01 Loose
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>HTML5</term>
- <listitem>
- <para>
- <acronym>HTML</acronym> 5
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- <para>
- Man kann den Typ zuordnen und die Deklaration in einem einzelnen Aufruf darstellen:
- </para>
- <programlisting language="php"><![CDATA[
- echo $this->doctype('XHTML1_STRICT');
- ]]></programlisting>
- <para>
- Trotzdem ist der bessere Ansatz den Typ in der Bootstrap zuzuordnen, und Ihn dann im
- Layout darzustellen. Man könnte versuchen das folgende in der Bootstrap Klasse
- hinzuzufügen:
- </para>
- <programlisting language="php"><![CDATA[
- class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
- {
- protected function _initDocType()
- {
- $this->bootstrap('View');
- $view = $this->getResource('View');
- $view->doctype('XHTML1_STRICT');
- }
- }
- ]]></programlisting>
- <para>
- Und dann im Layout Skript einfach auf dem Helfer am Beginn der Datei
- <methodname>echo()</methodname> ausrufen:
- </para>
- <programlisting language="php"><![CDATA[
- <?php echo $this->doctype() ?>
- <html>
- <!-- ... -->
- ]]></programlisting>
- <para>
- Das stellt sicher dass DocType-beachtende View Helfer das richtige Markup darstellen,
- das der Typ richtig gesetzt ist bevor das Layout dargestellt wird, und bietet einen
- einzelnen Ort an dem der DocType geändert werden kann.
- </para>
- </sect2>
- <sect2 id="learning.view.placeholders.standard.head-title">
- <title>Den Titel der Seite spezifizieren</title>
- <para>
- Oft will eine Site den Namen der Site oder der Firma als Teil des Seitentitels einfügen,
- und dann zusätzliche Informationen basieren auf dem Ort in dieser Site einfügen. Als
- Beispiel enthält die Website <filename>zend.com</filename> den String
- "<filename>Zend.com</filename>" auf allen Seiten und fügt Informationen basierend auf
- der Seite voran: "Zend Server - <filename>Zend.com</filename>". Im Zend Framework
- kann der <methodname>headTitle()</methodname> View Helfer helfen diese Aufgabe zu
- vereinfachen.
- </para>
- <para>
- Am einfachsten erlaubt es der <methodname>headTitle()</methodname> Helfer den Inhalt zu
- für das <emphasis><title></emphasis> Tag zu sammeln; wenn man es ausgibt, wird es
- basierend auf der Reihenfolge mit der es hinzugefügt wurde zusammengefügt. Man kann die
- Reihenfolge kontrollieren indem <methodname>prepend()</methodname> und
- <methodname>append()</methodname> verwendet werden, und einen Separator angegeben
- welcher zwischen den Segmenten zu verwenden ist, indem die Methode
- <methodname>setSeparator()</methodname> verwendet wird.
- </para>
- <para>
- Typischerweise sollten jene Segmente die in allen Seiten gemeinsam sind in der Bootstrap
- spezifiziert werden, ähnlich wie wir den DocType definiert haben. In diesem Fall
- definieren wir eine <methodname>_initPlaceholders()</methodname> Methode um auf den
- verschiedenen Platzhaltern zu arbeiten, und einen initialen Titel sowie einen Separator
- zu spezifizieren.
- </para>
- <programlisting language="php"><![CDATA[
- class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
- {
- // ...
- protected function _initPlaceholders()
- {
- $this->bootstrap('View');
- $view = $this->getResource('View');
- $view->doctype('XHTML1_STRICT');
- // Setzt den initialen Titel und Separator:
- $view->headTitle('Meine Site')
- ->setSeparator(' :: ');
- }
- // ...
- }
- ]]></programlisting>
- <para>
- Im View Skript könnten wir ein weiteres Segment hinzufügen:
- </para>
- <programlisting language="php"><![CDATA[
- <?php $this->headTitle()->append('Eine Seite'); // Nach anderen Segmenten platzieren ?>
- <?php $this->headTitle()->prepend('Eine Seite'); // Davor platzieren ?>
- ]]></programlisting>
- <para>
- In unserem Layout geben wie den <methodname>headTitle()</methodname> Helfer einfach aus:
- </para>
- <programlisting language="php"><![CDATA[
- <?php echo $this->doctype() ?>
- <html>
- <?php echo $this->headTitle() ?>
- <!-- ... -->
- ]]></programlisting>
- <para>
- Das erzeugt die folgende Ausgabe:
- </para>
- <programlisting language="html"><![CDATA[
- <!-- Wenn append() verwendet wurde: -->
- <title>Meine Site :: Eine Seite</title>
- <!-- Wenn prepend() verwendet wurde: -->
- <title>Eine Seite :: Meine Site</title>
- ]]></programlisting>
- </sect2>
- <sect2 id="learning.view.placeholders.standard.head-link">
- <title>Stylesheets mit HeadLink spezifizieren</title>
- <para>
- Gute <acronym>CSS</acronym> Entwickler erstellen oft ein generisches Stylesheet für
- Siteweite Stile, und individuelle Stylesheets für spezifische Sektionen oder Seite der
- Website, und laden die zweiteren über Konditionen um die Menge der Daten zu verringern
- die bei jeder Anfrage übertragen werden müssen. Der <methodname>headLink()</methodname>
- Platzhalter macht die Sammlung von solchen konditionellen Stylesheets in der Anwendung
- trivial.
- </para>
- <para>
- Um das zu ermöglichen definiert <methodname>headLink()</methodname> eine Anzahl von
- "virtuellen" Methoden (durch Überladen) welche den Prozess trivial machen. Jene mit
- denen wir uns befassen sind <methodname>appendStylesheet()</methodname> und
- <methodname>prependStylesheet()</methodname>. Jede nimmt bis zu vier Argumente,
- <varname>$href</varname> (den relativen Pfad zum Stylesheet), <varname>$media</varname>
- (den <acronym>MIME</acronym> Typ, der standardmäßig "text/css" ist),
- <varname>$conditionalStylesheet</varname> (kann verwendet werden um eine "Kondition" zu
- spezifizieren bei dem das Stylesheet evaluiert wird), und <varname>$extras</varname>
- (ein assoziatives Array von Schlüssel und Werte Paare, üblicherweise verwendet um einen
- Schlüssel für "media" zu definieren). In den meisten Fällen muss man nur das erste
- Argument spezifizieren, den relativen Pfad zum Stylesheet.
- </para>
- <para>
- In unserem Beispiel nehmen wir an das alle Seiten das Stylesheet laden mussen welches in
- "<filename>/styles/site.css</filename>" vorhanden ist (relativ zum Dokument Root); wir
- spezifizieren dass in unserer Bootstrap Methode
- <methodname>_initPlaceholders()</methodname>.
- </para>
- <programlisting language="php"><![CDATA[
- class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
- {
- // ...
- protected function _initPlaceholders()
- {
- $this->bootstrap('View');
- $view = $this->getResource('View');
- $view->doctype('XHTML1_STRICT');
- // Setzt den initialen Titel und Separator:
- $view->headTitle('Meine Site')
- ->setSeparator(' :: ');
- // Setzt das initiale Stylesheet:
- $view->headLink()->prependStylesheet('/styles/site.css');
- }
- // ...
- }
- ]]></programlisting>
- <para>
- Später, im Controller oder einem Action-spezifischen View Skript, können wir weitere
- Stylesheets hinzufügen:
- </para>
- <programlisting language="php"><![CDATA[
- <?php $this->headLink()->appendStylesheet('/styles/user-list.css') ?>
- ]]></programlisting>
- <para>
- In unserem Layout View Skript geben wir den Platzhalter einfach wieder aus:
- </para>
- <programlisting language="php"><![CDATA[
- <?php echo $this->doctype() ?>
- <html>
- <?php echo $this->headTitle() ?>
- <?php echo $this->headLink() ?>
- <!-- ... -->
- ]]></programlisting>
- <para>
- Das erzeugt die folgende Ausgabe:
- </para>
- <programlisting language="html"><![CDATA[
- <link rel="stylesheet" type="text/css" href="/styles/site.css" />
- <link rel="stylesheet" type="text/css" href="/styles/user-list.css" />
- ]]></programlisting>
- </sect2>
- <sect2 id="learning.view.placeholders.standard.head-script">
- <title>Sammeln von Skripten durch Verwendung von HeadScript</title>
- <para>
- Eine andere gemeinsame Taktik um lange Ladezeiten bei Seiten zu verhindern besteht darin
- JavaScript nur dann zu Laden wenn es notwendig ist. So gesehen benötigt man verschiedene
- Layer von Skripten: möglicherweise einen für die fortlaufende Verbesserung der Menüs der
- Site, und einen weiteren für Seiten-spezifische Inhalte. In diesen Situationen bietet
- der <methodname>headScript()</methodname> Helfer eine Lösung.
- </para>
- <para>
- Ähnlich wie der <methodname>headLink()</methodname> Helfer bietet
- <methodname>headScript()</methodname> die Möglichkeit Skripte der Sammlung anzuhängen
- oder voranzustellen, und dann das komplette Set auszugeben. Es bietet die Flexibilität
- Skriptdateien zu spezifizieren damit diese selbst geladen werden, als auch explizit
- JavaScript. Man hat auch die Option JavaScript über
- <methodname>captureStart()</methodname>/<methodname>captureEnd()</methodname>
- einzufangen, was es erlaubt JavaScript einfach im Code zu haben statt notwendigerweise
- einen zusätzlichen Aufruf zum Server zu machen.
- </para>
- <para>
- So wie <methodname>headLink()</methodname> bietet <methodname>headScript()</methodname>
- "virtuelle" Methoden durch Überladen als Bequemlichkeit wenn Elemente spezifiziert
- werden um Sie zu sammeln; übliche Methoden sind <methodname>prependFile()</methodname>,
- <methodname>appendFile()</methodname>, <methodname>prependScript()</methodname>, und
- <methodname>appendScript()</methodname>. Die ersten zwei erlauben es Dateien zu
- spezifizieren auf die im <varname>$src</varname> Attribut des
- <emphasis><script></emphasis> Tags referenziert wird; die letzteren zwei nehmen
- den angegebenen Inhalt und stellen Ihn als literales JavaScript im
- <emphasis><script></emphasis> Tag dar.
- </para>
- <para>
- In diesem Beispiel spezifizieren wir ein Skript, "<filename>/js/site.js</filename>"
- muss bei jeder Seite geladen werden; wir aktualisieren die
- <methodname>_initPlaceholders()</methodname> Methode in der Bootstrap um das zu tun.
- </para>
- <programlisting language="php"><![CDATA[
- class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
- {
- // ...
- protected function _initPlaceholders()
- {
- $this->bootstrap('View');
- $view = $this->getResource('View');
- $view->doctype('XHTML1_STRICT');
- // Setzt den initialen Titel und Separator:
- $view->headTitle('My Site')
- ->setSeparator(' :: ');
- // Setzt das initiale Stylesheet:
- $view->headLink()->prependStylesheet('/styles/site.css');
- // Setzt das initiale JS das geladen werden soll:
- $view->headScript()->prependFile('/js/site.js');
- }
- // ...
- }
- ]]></programlisting>
- <para>
- In einem View Skript können wir dann eine extra Skript Datei der Quelle hinzufügen um
- etwas JavaScript zu sammeln und es in unserem Dokument einzufügen.
- </para>
- <programlisting language="php"><![CDATA[
- <?php $this->headScript()->appendFile('/js/user-list.js') ?>
- <?php $this->headScript()->captureStart() ?>
- site = {
- baseUrl: "<?php echo $this->baseUrl() ?>"
- };
- <?php $this->headScript()->captureEnd() ?>
- ]]></programlisting>
- <para>
- In unserem Layout Skript wird der Platzhalter dann einfach ausgegeben, wie wir es
- bereits bei den anderen gemacht haben:
- </para>
- <programlisting language="php"><![CDATA[
- <?php echo $this->doctype() ?>
- <html>
- <?php echo $this->headTitle() ?>
- <?php echo $this->headLink() ?>
- <?php echo $this->headScript() ?>
- <!-- ... -->
- ]]></programlisting>
- <para>
- Das erstellt die folgende Ausgabe:
- </para>
- <programlisting language="html"><![CDATA[
- <script type="text/javascript" src="/js/site.js"></script>
- <script type="text/javascript" src="/js/user-list.js"></script>
- <script type="text/javascript">
- site = {
- baseUrl: "<?php echo $this->baseUrl() ?>"
- };
- </script>
- ]]></programlisting>
- <note>
- <title>InlineScript Variante</title>
- <para>
- Viele Browser blockieren oft die Anzeige von Seiten bis alle Skripte und Stylesheets
- geladen wurden auf die in der <emphasis><head></emphasis> Sektion referenziert
- wird. Wenn man eine Anzahl solcher Direktiven hat, kann das Einfluß darauf haben wie
- bald jemand damit beginnen kann sich die Seite anzuschauen:
- </para>
- <para>
- Ein Weg darum zu kommen besteht darin die <emphasis><script></emphasis> Tags
- einfach nach dem schließenden <emphasis><body></emphasis> Tag des Dokuments
- auszugeben. (Das ist eine Praxis die speziell vom <ulink
- url="http://developer.yahoo.com/yslow/">Y! Slow Projekt</ulink> empfohlen wird)
- </para>
- <para>
- Zend Framework unterstützt das auf zwei unterschiedlichen Wegen:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- Man kann das <methodname>headScript()</methodname> Tag im Layout Skript
- überall wo man will darstellen; nur weil der Titel auf "head" referenziert
- heißt das nicht dass er an dieser Position dargestellt werden muss.
- </para>
- </listitem>
- <listitem>
- <para>
- Alternativ kann der <methodname>inlineScript()</methodname> Helfer verwendet
- werden der einfach eine Variante von <methodname>headScript()</methodname>
- ist und das selbe Verhalten hat, aber eine eigene Registry verwendet.
- </para>
- </listitem>
- </itemizedlist>
- </note>
- </sect2>
- </sect1>
|