Zend_Dojo-View-Dojo.xml 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15156 -->
  3. <!-- Reviewed: no -->
  4. <sect2 id="zend.dojo.view.dojo">
  5. <title>dojo() View Helfer</title>
  6. <para>
  7. Der <code>dojo()</code> View Helfer ist dazu gedacht das konfigurieren der Dojo Umgebung zu
  8. vereinfachen, was die folgenden Notwendigkeiten beinhaltet:
  9. </para>
  10. <itemizedlist>
  11. <listitem>
  12. <para>Spezifizieren eines CDN oder lokalen Pfades zu einer Dojo Installation.</para>
  13. </listitem>
  14. <listitem>
  15. <para>Spezifizieren von Pfaden zu eigenen Dojo Modulen.</para>
  16. </listitem>
  17. <listitem>
  18. <para>Spezifizieren von dojo.require Statements.</para>
  19. </listitem>
  20. <listitem>
  21. <para>Spezifizieren von Dijit Stylesheet Themen zur Verwendung.</para>
  22. </listitem>
  23. <listitem>
  24. <para>Spezifizieren von dojo.addOnLoad() Events.</para>
  25. </listitem>
  26. </itemizedlist>
  27. <para>
  28. Die <code>dojo()</code> View Helfer Implementation ist ein Beispiel einer Platzhalter
  29. Implementation. Das Datenset in Ihm ist persistent zwischen den View Objekten, und kann
  30. direkt im eigenen Layout Skript ausgegeben werden.
  31. </para>
  32. <example id="zend.dojo.view.dojo.usage">
  33. <title>Beispiel für die Verwendung des dojo() View Helfers</title>
  34. <para>
  35. Für dieses Beispiel nehmen wir an das der Entwickler Dojo von einem lokalen Pfad aus
  36. verwenden wird, verschiedene Dijits benötigt, und das Tundra Dijit Thema anpasst.
  37. </para>
  38. <para>
  39. Auf vielen Seiten, kann der Entwickler Dojo nicht einmal verwenden. Deshalb werden wir
  40. uns zuerst auf ein View Skript fokusieren indem Dojo benötigt wird, und dann auf das
  41. Layout Skript, indem wir einiges der Dojo Umgebung einstellen und anschließend
  42. darstellen werden.
  43. </para>
  44. <para>
  45. Zuerst müssen wir unserem View Objekt mitteilen das es die Dojo View Helferpfade
  46. verwenden soll. Das kann in der eigenen Bootstrap Datei getan werden oder in einem
  47. Plugin das früh abläuft; einfach das View Objekt nehmen und das folgende ausführen:
  48. </para>
  49. <programlisting role="php"><![CDATA[
  50. $view->addHelperPath('Zend/Dojo/View/Helper/', 'Zend_Dojo_View_Helper');
  51. ]]></programlisting>
  52. <para>
  53. Als nächstes das View Skript. In diesem Fall werden die spezifizieren das ein
  54. FilterSelect verwendet werden soll -- welcher einen eigenen Speicher basierend auf
  55. QueryReadStore verwenden wird, und den wir 'PairedStore' nennen und in unserem 'custom'
  56. Modul speichern.
  57. </para>
  58. <programlisting role="php"><![CDATA[
  59. <?php // Datenspeicher für FilteringSelect einstellen ?>
  60. <div dojoType="custom.PairedStore" jsId="stateStore"
  61. url="/data/autocomplete/type/state/format/ajax"
  62. requestMethod="get"></div>
  63. <?php // Eingabeelement: ?>
  64. State: <input id="state" dojoType="dijit.form.FilteringSelect"
  65. store="stateStore" pageSize="5" />
  66. <?php // Notwendige Dojo Elemente einstellen:
  67. $this->dojo()->enable()
  68. ->setDjConfigOption('parseOnLoad', true)
  69. ->registerModulePath('custom', '../custom/')
  70. ->requireModule('dijit.form.FilteringSelect')
  71. ->requireModule('custom.PairedStore'); ?>
  72. ]]></programlisting>
  73. <para>
  74. In unserem Layout Skript, prüfen wir anschließend ob Dojo aktiviert ist, und wenn das
  75. der Fall ist, erledigen wir einige generelle Konfigurationen und fügen Sie hinzu:
  76. </para>
  77. <programlisting role="php"><![CDATA[
  78. <?php echo $this->doctype() ?>
  79. <html>
  80. <head>
  81. <?php echo $this->headTitle() ?>
  82. <?php echo $this->headMeta() ?>
  83. <?php echo $this->headLink() ?>
  84. <?php echo $this->headStyle() ?>
  85. <?php if ($this->dojo()->isEnabled()){
  86. $this->dojo()->setLocalPath('/js/dojo/dojo.js')
  87. ->addStyleSheetModule('dijit.themes.tundra');
  88. echo $this->dojo();
  89. }
  90. ?>
  91. <?php echo $this->headScript() ?>
  92. </head>
  93. <body class="tundra">
  94. <?php echo $this->layout()->content ?>
  95. <?php echo $this->inlineScript() ?>
  96. </body>
  97. </html>
  98. ]]></programlisting>
  99. <para>
  100. An diesem Punkt muß man nur sicherstellen das die Dateien am richtigen Ort vorhanden
  101. sind und das man die Aktion des Endpunktes für das FilteringSelect erstellt hat!
  102. </para>
  103. </example>
  104. <sect3 id="zend.dojo.view.dojo.declarative">
  105. <title>Programtechnische und Deklarative Verwendung von Dojo</title>
  106. <para>
  107. Dojo erlaubt sowohl die <emphasis>deklarative</emphasis> als auch die
  108. <emphasis>programmtechnische</emphasis> Verwendung von vielen Ihrer Features.
  109. <emphasis>Deklarative</emphasis> Verwendung verwendet Standard HTML Elemente mit
  110. nicht-standard Attributen die geparst werden wenn die Seite geladen wird. Wärend das
  111. eine mächtige und einfach verwendbare Syntax ist, kann Sie für viele Entwickler Probleme
  112. bei der Überprüfung einer Seite verursachen.
  113. </para>
  114. <para>
  115. <emphasis>Programmtechnische</emphasis> Verwendung erlaubt dem Entwickler existierende
  116. Elemente zu dekorieren indem Sie anhand von ID oder CSS Selektoren geholt werden und dem
  117. entsprechenden Objektkonstruktoren in Dojo übergeben werden. Weil keine nicht-standard
  118. HTML Attribute verwendet werden, bleiben Seiten hiermit gültig.
  119. </para>
  120. <para>
  121. In der Praxis, erlauben beide Fälle eine zierliche Degeneration wenn Javascript
  122. ausgeschaltet ist, oder die verschiedenen Dojo Skriptresourcen nicht erreichbar sind. Um
  123. Standards und Dokumentüberprüfungen zu gestatten verwendet Zend Framework standardmäßig
  124. die programmtechnische Verwendung; die verschiedenen Viewhelfer erzeugen Javascript und
  125. übergeben dieses an den <code>dojo()</code> Viewhelfer für die Einbeziehung wenn er
  126. dargestellt wird.
  127. </para>
  128. <para>
  129. Entwickler die diese Technik verwenden wollen eventuell auch die Option kennenlernen mit
  130. der Sie Ihre eigene programmtechnische Deklaration auf der Seite schreiben können. Ein
  131. Vorteil wäre die Möglichkeit Handler für Dijit Events zu spezifizieren.
  132. </para>
  133. <para>
  134. Um das zu erlauben, wie auch die Möglichkeit die deklarative Syntax zu verwenden, sind
  135. es eine Anzahl von statischen Methoden vorhanden die dieses Verhalten global setzen.
  136. </para>
  137. <example id="zend.dojo.view.dojo.declarative.usage">
  138. <title>
  139. Spezifizieren der deklarativen und programmtechnischen Verwendung von Dojo
  140. </title>
  141. <para>
  142. Um die deklarative Verwendung zu spezifizieren muß einfach die statische
  143. <code>setUseDeclarative()</code> Methode aufgerufen werden:
  144. </para>
  145. <programlisting role="php"><![CDATA[
  146. Zend_Dojo_View_Helper_Dojo::setUseDeclarative();
  147. ]]></programlisting>
  148. <para>
  149. Wenn man stattdessen die programmtechnische Verwendung verwenden will, muß die
  150. statische <code>setUseProgrammatic()</code> Methode aufgerufen werden:
  151. </para>
  152. <programlisting role="php"><![CDATA[
  153. Zend_Dojo_View_Helper_Dojo::setUseProgrammatic();
  154. ]]></programlisting>
  155. <para>
  156. Letztendlich, wenn man programmtechnische Regeln selbst erstellen will, sollte man
  157. die programmtechnische Verwendung spezifizieren, aber den Wert '-1' übergeben; in
  158. diesem Fall wird kein Javascript, für die Dekoration von verwendeten Dijits,
  159. erstellt.
  160. </para>
  161. <programlisting role="php"><![CDATA[
  162. Zend_Dojo_View_Helper_Dojo::setUseProgrammatic(-1);
  163. ]]></programlisting>
  164. </example>
  165. </sect3>
  166. <sect3 id="zend.dojo.view.dojo.themes">
  167. <title>Themen</title>
  168. <para>
  169. Dojo erlaubt die Erstellung von Themen für seine Dijits (Widgets). Man kann eines
  170. auswählen indem ein Modulpfad übergeben wird:
  171. </para>
  172. <programlisting role="php"><![CDATA[
  173. $view->dojo()->addStylesheetModule('dijit.themes.tundra');
  174. ]]></programlisting>
  175. <para>
  176. Der Modulpfad wird durch die Verwendung des Zeichens '.' als Trennzeichen vom
  177. Verzeichnis erkannt und der Verwendung des letzten Wertes in der Liste als den Namen der
  178. CSS Datei die im Themenverzeichnis verwendet wird; im obigen Beispiel sucht Dojo das
  179. Thema in 'dijit/themes/tundra/tundra.css'.
  180. </para>
  181. <para>
  182. Wenn ein Thema verwendet wird ist es wichtig daran zu denken die Themenklasse, zumindest
  183. an den Container der jedes Dijit das verwendet wird umgibt, zu übergeben; im üblichsten
  184. Fällen wird es an den Body übergeben:
  185. </para>
  186. <programlisting role="html"><![CDATA[
  187. <body class="tundra">
  188. ]]>
  189. </programlisting>
  190. </sect3>
  191. <sect3 id="zend.dojo.view.dojo.layers">
  192. <title>Layer verwenden (eigene Builds)</title>
  193. <para>
  194. Wenn ein dojo.require Statement verwendet wird, wird Dojo standardmäßig eine Anfrage an
  195. den Server zurücksenden um die richtige Javascript Datei zu holen. Wenn man viele Dijits
  196. verwendet, resultiert das in vielen Anfragen an den Server -- was nicht optimal ist.
  197. </para>
  198. <para>
  199. Dojo's Antwort darauf ist es die Möglichkeit anzubieten
  200. <emphasis>eigene Builds</emphasis> zu erstellen. Builds machen verschiedene Dinge:
  201. </para>
  202. <itemizedlist>
  203. <listitem>
  204. <para>
  205. Benötigte Dateien in <emphasis>Layern</emphasis> gruppieren; ein Layer sammelt
  206. alle benötigten Dateien in eine einzelne JS Datei. (Daher der Name dieses
  207. Kapitels)
  208. </para>
  209. </listitem>
  210. <listitem>
  211. <para>
  212. "Interne" nicht-javascript Dateien die von Dijits verwendet werden
  213. (typischerweise Templatedateien). Diese werden auch in der gleichen JS Datei
  214. gruppiert wie der Layer.
  215. </para>
  216. </listitem>
  217. <listitem>
  218. <para>
  219. Die Datei wird an ShrinkSafe übergeben, welches Leerzeichen und Kommentare
  220. entfernt, sowie Variablennamen verkleinert.
  221. </para>
  222. </listitem>
  223. </itemizedlist>
  224. <para>
  225. Einige Dateien können nicht in einen Layer gelegt werden, aber der Buildprozess wird
  226. ein spezielles Releaseverzeichnis mit der Layerdatei und allen anderen Dateien
  227. erstellen. Das erlaubt es eine verkleinerte eigene Distribution für die eigene Site oder
  228. Anwendungen zu erhalten.
  229. </para>
  230. <para>
  231. Um einen Layer zu verwenden, hat der <code>dojo()</code> Viewhelfer eine
  232. <code>addLayer()</code> Methode für das hinzufügen von Pfaden zu benötigten Layern:
  233. </para>
  234. <programlisting role="html"><![CDATA[
  235. $view->dojo()->addLayer('/js/foo/foo.js');
  236. ]]></programlisting>
  237. <para>
  238. Für weitere Informationen über die Erstellung von eigenen Build, schauen Sie bitte
  239. <ulink url="http://dojotoolkit.org/book/dojo-book-0-9/part-4-meta-dojo/package-system-and-custom-builds">in
  240. die Dojo Builddokumentation</ulink>.
  241. </para>
  242. </sect3>
  243. <sect3 id="zend.dojo.view.dojo.methods">
  244. <title>Vorhandene Methoden</title>
  245. <para>
  246. Der <code>dojo()</code> Viewhelfer gibt immer eine Instanz des Dojo
  247. Platzhaltercontainers zurück. Dieses Containerobjekt bietet die folgenden Methoden an:
  248. </para>
  249. <itemizedlist>
  250. <listitem>
  251. <para>
  252. <code>setView(Zend_View_Interface $view)</code>: Setzt eine Viewinstanz
  253. im Container
  254. </para>
  255. </listitem>
  256. <listitem>
  257. <para><code>enable()</code>: Die Dojo Integration explizit einschalten.</para>
  258. </listitem>
  259. <listitem>
  260. <para><code>disable()</code>: Die Dojo Integration ausschalten.</para>
  261. </listitem>
  262. <listitem>
  263. <para>
  264. <code>isEnabled()</code>: Ermitteln ob die Dojo Integration eingeschaltet
  265. ist oder nicht.
  266. </para>
  267. </listitem>
  268. <listitem>
  269. <para>
  270. <code>requireModule($module)</code>: Ein <code>dojo.require</code>
  271. Statement konfigurieren.
  272. </para>
  273. </listitem>
  274. <listitem>
  275. <para><code>getModules()</code>: Erkennen welche Module benötigt werden.</para>
  276. </listitem>
  277. <listitem>
  278. <para>
  279. <code>registerModulePath($module, $path)</code>: Einen Dojo Modulpfad
  280. registrieren.
  281. </para>
  282. </listitem>
  283. <listitem>
  284. <para>
  285. <code>getModulePaths()</code>: Eine Liste von registrierten Modulpfaden
  286. erhalten.
  287. </para>
  288. </listitem>
  289. <listitem>
  290. <para>
  291. <code>addLayer($path)</code>: Einen Layerpfad (eigenen Build) für die
  292. Verwendung hinzufügen.
  293. </para>
  294. </listitem>
  295. <listitem>
  296. <para>
  297. <code>getLayers()</code>: Eine Liste von allen registrierten Layerpfaden (eigene
  298. Builds) erhalten.
  299. </para>
  300. </listitem>
  301. <listitem>
  302. <para>
  303. <code>removeLayer($path)</code>: Den Layer der <code>$path</code> entspricht
  304. von der Liste der registrierten Layer (eigene Builds) entfernen.
  305. </para>
  306. </listitem>
  307. <listitem>
  308. <para>
  309. <code>setCdnBase($url)</code>: Den Basis URL für ein CDN setzen; typischerweise
  310. ist das <classname>Zend_Dojo::CDN_BASE_AOL</classname> oder
  311. <classname>Zend_Dojo::CDN_BASE_GOOGLE</classname>, aber es wird der URL String
  312. vor der Versionsnummer benötigt.
  313. </para>
  314. </listitem>
  315. <listitem>
  316. <para>
  317. <code>getCdnBase()</code>: Den Basis CDN URL empfangen.
  318. </para>
  319. </listitem>
  320. <listitem>
  321. <para>
  322. <code>setCdnVersion($version = null)</code>: Setzen selche Version von Dojo vom
  323. CDN verwendet wird.
  324. </para>
  325. </listitem>
  326. <listitem>
  327. <para>
  328. <code>getCdnVersion()</code>: Die Dojo Version vom CDN erhalten die verwendet
  329. wird.
  330. </para>
  331. </listitem>
  332. <listitem>
  333. <para>
  334. <code>setCdnDojoPath($path)</code>: Setzt den relativen Pfad zur dojo.js oder
  335. dojo.xd.js Datei am CDN; typischerweise ist das entweder
  336. <classname>Zend_Dojo::CDN_DOJO_PATH_AOL</classname> oder
  337. <classname>Zend_Dojo::CDN_DOJO_PATH_GOOGLE</classname>, aber es wird der
  338. Pfadstring nach der Versionsnummer benötigt.
  339. </para>
  340. </listitem>
  341. <listitem>
  342. <para>
  343. <code>getCdnDojoPath()</code>: Das letzte Pfadsegment der CDN URL erhalten das
  344. auf die dojo.js Datei zeigt.
  345. </para>
  346. </listitem>
  347. <listitem>
  348. <para>
  349. <code>useCdn()</code>: Dem Container mitteilen das CDN verwendet werden soll;
  350. aktiviert die Integration implizit.
  351. </para>
  352. </listitem>
  353. <listitem>
  354. <para>
  355. <code>setLocalPath($path)</code>: Dem Container den Pfad zu einer lokalen Dojo
  356. Installation mitteilen (sollte ein Pfad relativ zum Server sein, und die dojo.js
  357. Datei selbst enthalten); aktiviert die Integration implizit.
  358. </para>
  359. </listitem>
  360. <listitem>
  361. <para>
  362. <code>getLocalPath()</code>: Erkennen welches lokale Pfad zu Dojo verwendet
  363. wird.
  364. </para>
  365. </listitem>
  366. <listitem>
  367. <para>
  368. <code>useLocalPath()</code>: Verwendet die Integration einen lokalen Dojopfad?
  369. </para>
  370. </listitem>
  371. <listitem>
  372. <para>
  373. <code>setDjConfig(array $config)</code>: Setzt Dojo/Dijit Konfigurationswerte
  374. (erwartet ein assoziatives Array).
  375. </para>
  376. </listitem>
  377. <listitem>
  378. <para>
  379. <code>setDjConfigOption($option, $value)</code>: Setzt einen einzelnen
  380. Dojo/Dijit Konfigurationswert.
  381. </para>
  382. </listitem>
  383. <listitem>
  384. <para>
  385. <code>getDjConfig()</code>: Retourniert alle Dojo/Dijit Konfigurationswerte.
  386. </para>
  387. </listitem>
  388. <listitem>
  389. <para>
  390. <code>getDjConfigOption($option, $default = null)</code>: Retourniert einen
  391. einzelnen Dojo/Dijit Konfigurationswert.
  392. </para>
  393. </listitem>
  394. <listitem>
  395. <para>
  396. <code>addStylesheetModule($module)</code>: Fügt ein Stylesheet hinzu basierend
  397. auf einem Modulthema.
  398. </para>
  399. </listitem>
  400. <listitem>
  401. <para>
  402. <code>getStylesheetModules()</code>: Retourniert die als Modulthema
  403. registrierten Modulthemen.
  404. </para>
  405. </listitem>
  406. <listitem>
  407. <para>
  408. <code>addStylesheet($path)</code>: Fügt einen lokalen Stylesheet zur Verwendung
  409. mit Dojo hinzu.
  410. </para>
  411. </listitem>
  412. <listitem>
  413. <para>
  414. <code>getStylesheets()</code>: Retourniert die lokalen Dojo Stylesheets.
  415. </para>
  416. </listitem>
  417. <listitem>
  418. <para>
  419. <code>addOnLoad($spec, $function = null)</code>: Fügt ein Lambda für dojo.onLoad
  420. hinzu das dieses aufruft. Wenn ein Argument übergeben wird, wird dieses entweder
  421. als Funktionsname oder als Javascriptabschluss angenommen. Wenn zwei Argumente
  422. übergeben werden, wird das erste als Name der Variablen der Objektinstanz
  423. angenommen und der zweite entweder als Methodenname in diesem Objekt oder ein
  424. Abschluß um dieses Objekt zu verwenden.
  425. </para>
  426. </listitem>
  427. <listitem>
  428. <para>
  429. <code>prependOnLoad($spec, $function = null)</code>: genau wie
  430. <code>addOnLoad()</code>, außer das vor den Anfang des onLoad Stacks angefügt
  431. wird.
  432. </para>
  433. </listitem>
  434. <listitem>
  435. <para>
  436. <code>getOnLoadActions()</code>: Gibt alle im Container registrierten
  437. dojo.onLoad Aktionen zurück. Das ist ein Array von Arrays.
  438. </para>
  439. </listitem>
  440. <listitem>
  441. <para>
  442. <code>onLoadCaptureStart($obj = null)</code>: Empfange Daten die als Lambda für
  443. dojo.onLoad() verwendet werden sollen. Wenn $obj angegeben wird, wird der
  444. bekommene JS Code als Abschluß angenommen der mit diesem Javascript Objekt
  445. verwendet werden soll.
  446. </para>
  447. </listitem>
  448. <listitem>
  449. <para>
  450. <code>onLoadCaptureEnd($obj = null)</code>: Beendet das Empfangen von Daten für
  451. die Verwendung mit dojo.onLoad().
  452. </para>
  453. </listitem>
  454. <listitem>
  455. <para>
  456. <code>javascriptCaptureStart()</code>: Empfange Javascript das im Dojo JS
  457. inkludiert werden soll (onLoad, require, und andere Anweisungen).
  458. </para>
  459. </listitem>
  460. <listitem>
  461. <para>
  462. <code>javascriptCaptureEnd()</code>: Beende das Empfangen von Javascript.
  463. </para>
  464. </listitem>
  465. <listitem>
  466. <para>
  467. <code>__toString()</code>: Castet den Container zu einem String; stellt alle
  468. HTML Stile und Skriptelemente dar.
  469. </para>
  470. </listitem>
  471. </itemizedlist>
  472. </sect3>
  473. </sect2>
  474. <!--
  475. vim:se ts=4 sw=4 et:
  476. -->