| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.dojo.build-layers">
- <title>Support für den Build Layer von Zend_Dojo</title>
- <sect2 id="zend.dojo.build-layers.introduction">
- <title>Einführung</title>
- <para>
- Dojo Build Layer bieten einen reinen Pfad von der Entwicklung zur Produktion wenn Dojo
- für den eigenen UI Layer verwendet wird. In der Entwicklung kann man auf-Wunsch laden,
- und schnelles Anwendungs Prototyping erhalten; ein Build Layer nimmt alle Abhängigkeiten
- von Dojo und kompiliert diese in eine einzelne Datei, wobei optional Leerzeichen und
- Kommentare herausgenommen werden, führt Code Heuristiken durch um weitere
- Minimalisierungen von Variablennamen zu erlauben. Zusätzlich kann es auch
- <acronym>CSS</acronym> Minimalisierungen durchführen.
- </para>
- <para>
- Um einen Build Layer zu erstellen würde man traditioneller Weise eine JavaScript Datei
- erstellen die <command>dojo.require</command> Anweisungen für jede Abhängigkeit hat, und
- optional einigen zusätzlichen Code den man ausführen will wen das Skript geladen wird.
- Als Beispiel:
- </para>
- <programlisting language="javascript"><![CDATA[
- dojo.provide("custom.main");
- dojo.require("dijit.layout.TabContainer");
- dojo.require("dijit.layout.ContentPane");
- dojo.require("dijit.form.Form");
- dojo.require("dijit.form.Button");
- dojo.require("dijit.form.TextBox");
- ]]></programlisting>
- <para>
- Auf dieses Skript wird generell als "layer" Skript referiert.
- </para>
- <para>
- Im eigenen Anwendungs Layer, würde man dann Dojo instruieren dieses Modul zu laden:
- </para>
- <programlisting language="html"><![CDATA[
- <html>
- <head>
- <script type="text/javascript" src="/js/dojo/dojo.js"></script>
- <script type="text/javascript">
- dojo.registerModulePath("custom", "../custom/");
- dojo.require("custom.main");
- </script>
- ]]></programlisting>
- <para>
- Wenn man <classname>Zend_Dojo</classname> verwendet um das zu tun, würde man das
- folgende durchführen:
- </para>
- <programlisting language="php"><![CDATA[
- $view->dojo()->registerModulePath('custom', '../custom/')
- ->requireModule('custom.main');
- ]]></programlisting>
- <para>
- Aber da <classname>Zend_Dojo</classname> die verschiedenen
- <command>dojo.require</command> Anweisungen zusammenfügt, wie kann man das eigene Layer
- Skript erstellen? Man könnte jede Seite öffnen, die erstellten
- <command>dojo.require</command> Anweisungen anschauen und Sie herausschneiden und in
- eine Layer Skript Datei manuell einfügen.
- </para>
- <para>
- Trotzdem existiert eine bessere Lösung: Da <classname>Zend_Dojo</classname> diese
- Informationen bereits zusammenfügt, kann man diese Information einfach herausziehen und
- die eigene Layer Datei erstellen. Das ist der Sinn von
- <classname>Zend_Dojo_BuildLayer</classname>.
- </para>
- </sect2>
- <sect2 id="zend.dojo.build-layers.usage">
- <title>Erstellen eigener Modul Layer mit Zend_Dojo_BuildLayer</title>
- <para>
- Am einfachsten kann man einfach <classname>Zend_Dojo_BuildLayer</classname>
- instanziieren, es dem View Objekt zusammen mit dem Namen des eigenen Modul Layers
- füttern, und es den Inhalt der Layer Datei erstellen lassen; es liegt an einem selbst
- diese anschließend auf die Festplatte zu schreiben.
- </para>
- <para>
- Nehmen wir als Beispiel an dass man den Modul Layer "<filename>custom.main</filename>"
- erstellen will. Angenommen man folgt der vorgeschlagenen Projekt Verzeichnisstruktur,
- und man will JavaScript Dateien unter <filename>public/js/</filename> speichern, dann
- könnte man das folgende tun:
- </para>
- <programlisting language="php"><![CDATA[
- $build = new Zend_Dojo_BuildLayer(array(
- 'view' => $view,
- 'layerName' => 'custom.main',
- ));
- $layerContents = $build->generateLayerScript();
- $filename = APPLICATION_PATH . '/../public/js/custom/main.js';
- if (!dir_exists(dirname($filename))) {
- mkdir(dirname($filename));
- }
- file_put_contents($filename, $layerContents);
- ]]></programlisting>
- <para>
- Wann sollte man das obige durchführen? Damit es korrekt arbeitet, muß man es nach
- der Darstellung aller View Skripte und des Layouts tun um sicherzustellen das der
- <methodname>dojo()</methodname> Helfer vollständig bestückt wurde. Ein einfacher
- Weg um das zu tun ist die Verwendung des Front Controller Plugins, mit einem
- <methodname>dispatchLoopShutdown()</methodname> Hook:
- </para>
- <programlisting language="php"><![CDATA[
- class App_Plugin_DojoLayer extends Zend_Controller_Plugin_Abstract
- {
- public $layerScript = APPLICATION_PATH . '/../public/js/custom/main.js';
- protected $_build;
- public function dispatchLoopShutdown()
- {
- if (!file_exists($this->layerScript)) {
- $this->generateDojoLayer();
- }
- }
- public function getBuild()
- {
- $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
- 'ViewRenderer'
- );
- $viewRenderer->initView();
- if (null === $this->_build) {
- $this->_build = new Zend_Dojo_BuildLayer(array(
- 'view' => $viewRenderer->view,
- 'layerName' => 'custom.main',
- ));
- }
- return $this->_build;
- }
- public function generateDojoLayer()
- {
- $build = $this->getBuild();
- $layerContents = $build->generateLayerScript();
- if (!dir_exists(dirname($this->layerScript))) {
- mkdir(dirname($this->layerScript));
- }
- file_put_contents($this->layerScript, $layerContents);
- }
- }
- ]]></programlisting>
- <note>
- <title>Den Layer nicht in jeder Seite erstellen</title>
- <para>
- Es ist verführerisch das Layer Skript auf jeder einzelnen Seite zu erstellen.
- Aber das ist Ressourcen intensiv da hierbei für jede Seite auf die Festplatte
- geschrieben werden muß. Zusätzlich erhält man keine Vorteile von Client seitigem
- Cachen, da mtime von der Datei sich jedesmal ändert. Die Datei sollte nur
- einmal geschrieben werden.
- </para>
- </note>
- <sect3 id="zend.dojo.build-layers.usage.options">
- <title>Optionen für BuildLayer</title>
- <para>
- Die obige Funktionalität wird in den meisten Situationen ausreichen. Für jene die
- weitere Anpassungen benötigen, können eine Vielzahl von Optionen verwendet werden.
- </para>
- <sect4 id="zend.dojo.build-layers.usage.options.view">
- <title>Setzen des View Objekts</title>
- <para>
- Wärend das View Objekt während der Instanzierung übergeben werden kann, kann es
- einer Instanz auch über die <methodname>setView()</methodname> Methode
- übergeben werden:
- </para>
- <programlisting language="php"><![CDATA[
- $build->setView($view);
- ]]></programlisting>
- </sect4>
- <sect4 id="zend.dojo.build-layers.usage.options.layername">
- <title>Setzen des Namen eines Layers</title>
- <para>
- Wärend der Name des Layers während Instanzierung übergeben werden kann, kann er
- der Instanz auch über die <methodname>setLayerName()</methodname> Methode
- übergeben werden:
- </para>
- <programlisting language="php"><![CDATA[
- $build->setLayerName("custom.main");
- ]]></programlisting>
- </sect4>
- <sect4 id="zend.dojo.build-layers.usage.options.onload">
- <title>Einfügen von onLoad Events im erstellten Layer</title>
- <para>
- <command>dojo.addOnLoad</command> ist eine nützliche Utility für die
- Spezifikation von Actions welche getriggert werden sollen wenn der
- <acronym>DOM</acronym> fertig geladen wurde. Der <methodname>dojo()</methodname>
- View Helfer kann diese Statements über seine Methoden
- <methodname>addOnLoad()</methodname> und
- <methodname>onLoadCapture()</methodname> erstellen. In einigen Fällen macht es
- Sinn diese in die eigene Layer Datei zu geben statt diese über das eigene View
- Skript darzustellen.
- </para>
- <para>
- Standardmäßig werden Sie nicht dargestellt; um das zu aktivieren muß der
- Konfigurationsschlüssel <property>consumeOnLoad</property> bei der
- Instanzierung angegeben werden:
- </para>
- <programlisting language="php"><![CDATA[
- $build = new Zend_Dojo_BuildLayer(array(
- 'view' => $view,
- 'layerName' => 'custom.main',
- 'consumeOnLoad' => true,
- ));
- ]]></programlisting>
- <para>
- Alternativ kann die <methodname>setConsumeOnLoad()</methodname> Methode nach
- der Instanzierung verwendet werden:
- </para>
- <programlisting language="php"><![CDATA[
- $build->setConsumeOnLoad(true);
- ]]></programlisting>
- </sect4>
- <sect4 id="zend.dojo.build-layers.usage.options.javascript">
- <title>Geholtes Javascript in den erstellten Layer einfügen</title>
- <para>
- Der <methodname>dojo()</methodname> View Helfer enthält Methoden für das
- Fangen von jeglichem JavaScript um diesen im <script> einzufügen, welches
- die verschiedenen <command>dojo.require</command> und
- <command>dojo.addOnLoad</command> Anweisungen enthält. Das kann bei der
- Erstellung von standardmäßigen Datenspeichern oder Objekten mit globaler
- Sichtbarkeit nützlich sein welche in der gesamten Anwendung verwendet werden.
- </para>
- <para>
- Standardmäßig werden Sie nicht dargestellt; um das zu aktivieren muß der
- Konfigurationsschlüssel <property>consumeJavascript</property> bei der
- Instanzierung angegeben werden:
- </para>
- <programlisting language="php"><![CDATA[
- $build = new Zend_Dojo_BuildLayer(array(
- 'view' => $view,
- 'layerName' => 'custom.main',
- 'consumeJavascript' => true,
- ));
- ]]></programlisting>
- <para>
- Alternativ kann die <methodname>setConsumeJavascript()</methodname> Methode
- nach der Instanzierung verwendet werden:
- </para>
- <programlisting language="php"><![CDATA[
- $build->setConsumeJavascript(true);
- ]]></programlisting>
- </sect4>
- </sect3>
- </sect2>
- <sect2 id="zend.dojo.build-layers.profiles">
- <title>Erstellung von Build Profilen mit Zend_Dojo_BuildLayer</title>
- <para>
- Einer der Hauptvorteile eines Dojo build Layers ist die Möglichkeit der Erstellung eines
- eigenen Builds. <classname>Zend_Dojo_BuildLayer</classname> bietet Funktionalitäten für
- die Erstellung von Build Profilen.
- </para>
- <para>
- Der einfachste Usecase is die Verwendung der
- <methodname>generateBuildProfile()</methodname> Methode und dem Senden der Ausgabe in
- eine Datei:
- </para>
- <programlisting language="php"><![CDATA[
- $build = new Zend_Dojo_BuildLayer(array(
- 'view' => $view,
- 'layerName' => 'custom.main',
- ));
- $profile = $build->generateBuildProfile();
- $filename = APPLICATION_PATH . '/../misc/scripts/custom.profile.js';
- file_put_contents($filename, $profile);
- ]]></programlisting>
- <para>
- Wie bei der Erstellung von Layern kann es gewünscht sein das über einen
- <methodname>dispatchLoopShutdown()</methodname> Plugin Hook zu automatisieren; man
- könnte sogar einfach den einen, der für die Erstellung der Layer angezeigt wird,
- so ändern das er wie folgt gelesen wird:
- </para>
- <programlisting language="php"><![CDATA[
- class App_Plugin_DojoLayer extends Zend_Controller_Plugin_Abstract
- {
- public $layerScript = APPLICATION_PATH
- . '/../public/js/custom/main.js';
- public $buildProfile = APPLICATION_PATH
- . '/../misc/scripts/custom.profile.js';
- protected $_build;
- public function dispatchLoopShutdown()
- {
- if (!file_exists($this->layerScript)) {
- $this->generateDojoLayer();
- }
- if (!file_exists($this->buildProfile)) {
- $this->generateBuildProfile();
- }
- }
- public function generateDojoLayer() { /* ... */ }
- public function generateBuildProfile()
- {
- $profile = $this->getBuild()->generateBuildProfile();
- file_put_contents($this->buildProfile, $profile);
- }
- }
- ]]></programlisting>
- <para>
- Wie bei den Modul Layern beschrieben sollte man die Datei nur einmal erstellen.
- </para>
- <sect3 id="zend.dojo.build-layers.profiles.options">
- <title>Optionen für ein Build Profil</title>
- <para>
- Die obige Funktionalität wird in den meisten Situationen ausreichend sein. Der
- einzige Weg um die Erstellung der Build Profile anzupassen besteht darin
- zusätzliche Optionen für Build Profile verwenden.
- </para>
- <para>
- Als Beispiel will man zum Beispiel spezifizieren welche Art von Optimierung
- durchgeführt werden soll, ob die <acronym>CSS</acronym> Dateien im Layer optimiert
- werden sollen, oder nicht, ob Test in den Build kopiert werden sollen, oder nicht,
- usw. Für eine Aufstellung vorhandener Optionen, sollte man die
- <ulink url="http://docs.dojocampus.org/build/index">Dojo Build Dokumentation</ulink>
- und die <ulink
- url="http://dojotoolkit.org/reference-guide/dojo/index.html#package-system">begleitende
- Dokumentation</ulink> lesen.
- </para>
- <para>
- Das Setzen dieser Optionen ist trivial: durch Verwendung der
- <methodname>addProfileOption()</methodname>,
- <methodname>addProfileOptions()</methodname>, oder
- <methodname>setProfileOptions()</methodname> Methoden. Die erste Methode fügt einen
- einzelnes Schlüssel und Werte Options Paar hinzu, die zweite fügt mehrere hinzu,
- und die dritte überschreibt alle Optionen in der Liste von Schlüssel und Werte
- Paaren angegeben sind.
- </para>
- <para>
- Standardmäßig werden die folgenden Optionen gesetzt:
- </para>
- <programlisting language="javascript"><![CDATA[
- {
- action: "release",
- optimize: "shrinksafe",
- layerOptimize: "shrinksafe",
- copyTests: false,
- loader: "default",
- cssOptimize: "comments"
- }
- ]]></programlisting>
- <para>
- Man kann jegliche Schlüssel und Werte Paare übergeben; das Dojo Build Skript
- ignoriert jene die es nicht versteht.
- </para>
- <para>
- Als Beispiel für das Setzen von Optionen:
- </para>
- <programlisting language="php"><![CDATA[
- // Eine einzelne Option:
- $build->addProfileOption('version', 'zend-1.3.1');
- // Mehrere Optionen:
- $build->addProfileOptions(array(
- 'loader' => 'xdomain',
- 'optimize' => 'packer',
- ));
- // Oder Optionen überschreiben:
- $build->setProfileOptions(array(
- 'version' => 'custom-1.3.1',
- 'loader' => 'shrinksafe',
- 'optimize' => 'shrinksafe',
- ));
- ]]></programlisting>
- </sect3>
- </sect2>
- </sect1>
|