Zend_Controller-ActionHelpers-AutoComplete.xml 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 16509 -->
  3. <!-- Reviewed: no -->
  4. <sect3 id="zend.controller.actionhelpers.autocomplete">
  5. <title>AutoComplete</title>
  6. <para>
  7. Viele <acronym>AJAX</acronym> Javascript Bibliotheken bieten Funktionalitäten an für eine
  8. automatische Vervollständigung wobei eine Auswahlliste von potentiell passenden Ergebnissen
  9. angezeigt wird wärend der Benutzer tippt. Der <emphasis>AutoComplete</emphasis> Helfer
  10. zielt darauf ab einfach akzeptierbare Ergebnisse zu solchen Methoden zurückzugeben.
  11. </para>
  12. <para>
  13. Da nicht alle JS Bibliotheken automatische Vervollständigung auf die gleiche Art
  14. implementieren bietet der <emphasis>AutoComplete</emphasis> Helfer einige grundsätzliche
  15. abstrakte Funktionalitäten zu vielen Bibliotheken und konkrete Implementierungen für
  16. individuelle Bibliotheken. Zurückgegebene Typen sind generell entweder
  17. <acronym>JSON</acronym> Arrays von Strings, <acronym>JSON</acronym> Arrays von Arrays (mit
  18. jedem Mitgliedsarray das ein assoziatives Array von Metadaten ist, das verwendet wird um
  19. die Auswahlliste zu erstellen), oder <acronym>HTML</acronym>.
  20. </para>
  21. <para>
  22. Die grundsätzliche Verwendung ist für jede Implementierung die selbe:
  23. </para>
  24. <programlisting language="php"><![CDATA[
  25. class FooController extends Zend_Controller_Action
  26. {
  27. public function barAction()
  28. {
  29. // etwas Logik durchführen...
  30. // Verschlüsseln und Antwort senden;
  31. $this->_helper->autoCompleteDojo($data);
  32. // oder explizit:
  33. $response = $this->_helper->autoCompleteDojo
  34. ->sendAutoCompletion($data);
  35. // oder einfach die Antwort der automatischen
  36. // Vervollständigung vorbereiten;
  37. $response = $this->_helper->autoCompleteDojo
  38. ->prepareAutoCompletion($data);
  39. }
  40. }
  41. ]]></programlisting>
  42. <para>
  43. Standardmäßig mach die automatische Vervollständigung folgendes:
  44. </para>
  45. <itemizedlist>
  46. <listitem><para>
  47. Layouts und ViewRenderer ausschalten.
  48. </para></listitem>
  49. <listitem><para>
  50. Die richtigen Antwort Header zu setzen.
  51. </para></listitem>
  52. <listitem><para>
  53. Antwort Body mit verschlüsselten oder formatierten automatisch vervollständigten
  54. Daten setzen.
  55. </para></listitem>
  56. <listitem><para>
  57. Antwort senden.
  58. </para></listitem>
  59. </itemizedlist>
  60. <para>
  61. Mögliche Methoden des Helfers beinhalten:
  62. </para>
  63. <itemizedlist>
  64. <listitem><para>
  65. <methodname>disableLayouts()</methodname> kann verwendet werden um Layouts und den
  66. ViewRenderer auszuschalten. Typischerweise wird das innerhalb von
  67. <methodname>prepareAutoCompletion()</methodname> aufgerufen.
  68. </para></listitem>
  69. <listitem><para>
  70. <methodname>encodeJson($data, $keepLayouts = false)</methodname> verschlüsselt
  71. Daten zu <acronym>JSON</acronym>, und aktiviert oder deaktiviert Layouts optional.
  72. Typischerweise wird das innerhalb von
  73. <methodname>prepareAutoCompletion()</methodname> aufgerufen.
  74. </para></listitem>
  75. <listitem><para>
  76. <methodname>prepareAutoCompletion($data, $keepLayouts = false)</methodname> wird
  77. verwendet um Daten im Antwortformat vorzubereiten wenn das für die konkrete
  78. Implementation notwendig ist, wobei Layouts optional aktiviert oder deaktiviert
  79. werden können. Der Rückgabewert variiert basierend auf der Implementierung.
  80. </para></listitem>
  81. <listitem><para>
  82. <methodname>sendAutoCompletion($data, $keepLayouts = false)</methodname> wird
  83. verwendet um Daten im Antwortformat zu senden was für die konkrete Implementierung
  84. notendig ist. Sie ruft <methodname>prepareAutoCompletion()</methodname> und sendet
  85. dann die Antwort.
  86. </para></listitem>
  87. <listitem><para>
  88. <methodname>direct($data, $sendNow = true, $keepLayouts = false)</methodname> wird
  89. verwendet wenn der Helfer als Methode des Helfer Brokers aufgerufen wird. Das
  90. <varname>$sendNow</varname> Flag wird verwendet um festzustellen ob
  91. <methodname>sendAutoCompletion()</methodname> oder
  92. <methodname>prepareAutoCompletion()</methodname> aufgerufen werden muß.
  93. </para></listitem>
  94. </itemizedlist>
  95. <para>
  96. Aktuell unterstützt <emphasis>AutoComplete</emphasis> die folgenden Dojo und Scriptaculous
  97. <acronym>AJAX</acronym> Bibliotheken.
  98. </para>
  99. <sect4 id="zend.controller.actionhelpers.autocomplete.dojo">
  100. <title>AutoCompletion mit Dojo</title>
  101. <para>
  102. Dojo hat per se keinen AutoCompletion Wizard, hat aber zwei Wizards die AutoCompletion
  103. ausführen können: ComboBox und FilteringSelect. In beiden Fällen benötigen Sie einen
  104. Datenspeicher der QueryReadStore implementiert; für mehr Informationen über dieses
  105. Thema siehe die <ulink
  106. url="http://dojotoolkit.org/book/dojo-book-0-9/part-3-programmatic-dijit-and-dojo/data-retrieval-dojo-data-0">dojo.data</ulink>
  107. Dokumentation.
  108. </para>
  109. <para>
  110. Im Zend Framework kann ein einfaches indiziertes Array an den AutoCompletionDojo Helfer
  111. übergeben werden, und er wird eine <acronym>JSON</acronym> Antwort zurückgeben die
  112. passend für die Verwendung in so einem Speicher ist:
  113. </para>
  114. <programlisting language="php"><![CDATA[
  115. // In der Controller Aktion:
  116. $this->_helper->autoCompleteDojo($data);
  117. ]]></programlisting>
  118. <example id="zend.controller.actionhelpers.autocomplete.dojo.example1">
  119. <title>AutoCompletion mit Dojo und der Verwendung von Zend MVC</title>
  120. <para>
  121. AutoCompletion mit Dojo, über Zend <acronym>MVC</acronym>, benötigt verschiedene
  122. Dinge: Erstellung eines Form Objekts für die Kombobox bei der man AutoCompletion
  123. will, eine Controller Action für das anbieten der AutoCompletion Ergebnisse,
  124. Erstellung eines eigenen QueryReadSote um die AutoCompletion Aktion damit zu
  125. verbinden, und Erstellung des Javascripts das zur Initialisierung der
  126. AutoCompletion auf der Serverseite zu verwenden ist.
  127. </para>
  128. <para>
  129. Schauen wir uns zuerst das benötigte Javascript an. Dojo bietet ein komplettes
  130. Framework für die Erstellung von <acronym>OOP</acronym> Javascript, so wie Zend
  131. Framework für <acronym>PHP</acronym>. Teile davon sind die Möglichkeit
  132. Pseudo-Namespaces zu erstellen indem die Verzeichnis Hirarchie verwendet wird. Wir
  133. erstellen ein 'custom' Verzeichnis auf dem gleichen Level wie das Dojo Verzeichnis
  134. das Teil der Distribution von Dojo ist. In diesem Verzeichnis, erstellen wir eine
  135. Javascript Datei, <filename>TestNameReadStore.js</filename>, mit den folgenden
  136. Inhalten:
  137. </para>
  138. <programlisting language="javascript"><![CDATA[
  139. dojo.provide("custom.TestNameReadStore");
  140. dojo.declare("custom.TestNameReadStore", dojox.data.QueryReadStore, {
  141. fetch:function (request) {
  142. request.serverQuery = { test:request.query.name };
  143. return this.inherited("fetch", arguments);
  144. }
  145. });
  146. ]]></programlisting>
  147. <para>
  148. Diese Klasse ist einfach eine Erweiterung von Dojo's eigenem QueryReadStore,
  149. welche selbst eine Abstrakte Klasse ist. Wir definieren einfach eine Methode mit
  150. der angefragt werden soll, und verknüpfen Sie mit dem 'test' Element.
  151. </para>
  152. <para>
  153. Als nächstes, erstellen wir das Form Element für das wir AutoCompletion wollen:
  154. </para>
  155. <programlisting language="php"><![CDATA[
  156. class TestController extends Zend_Controller_Action
  157. {
  158. protected $_form;
  159. public function getForm()
  160. {
  161. if (null === $this->_form) {
  162. $this->_form = new Zend_Form();
  163. $this->_form->setMethod('get')
  164. ->setAction(
  165. $this->getRequest()->getBaseUrl() . '/test/process'
  166. )
  167. ->addElements(array(
  168. 'test' => array('type' => 'text', 'options' => array(
  169. 'filters' => array('StringTrim'),
  170. 'dojoType' => array('dijit.form.ComboBox'),
  171. 'store' => 'testStore',
  172. 'autoComplete' => 'false',
  173. 'hasDownArrow' => 'true',
  174. 'label' => 'Your input:',
  175. )),
  176. 'go' => array('type' => 'submit',
  177. 'options' => array('label' => 'Go!'))
  178. ));
  179. }
  180. return $this->_form;
  181. }
  182. }
  183. ]]></programlisting>
  184. <para>
  185. Hier erstellen wir einfach eine Form mit den 'test' und 'go' Methoden. Die 'test'
  186. Methode fügt verschiedene spezielle, Dojo-spezifische Attribute hinzu: dojoType,
  187. store, autoComplete, und hasDownArrow. Der dojoType wird verwendet um anzuzeigen
  188. das wir eine ComboBox erstellen, und wir Sie zum Datenspeicher von 'testStore'
  189. verbinden wollen (Schlüssel 'store') -- mehr dazu später. Die Spezifizierung von
  190. 'autoComplete' mit <constant>FALSE</constant> sagt Dojo das der erste passende
  191. Eintrag nicht automatisch ausgewählt wird, aber stattdessen eine Liste von
  192. Entsprechnungen angezeigt wird. Letztendlich, erstellt 'hasDownArrow' einen
  193. Abwärtspfeil ähnlich einer Selectbox sodas Wir die Entsprechnungen zeigen und
  194. verstecken können.
  195. </para>
  196. <para>
  197. Fügen wir eine Methode hinzu um die Form anzuzeigen, sowie einen Endpunkt für die
  198. Bearbeitung der AutoCompletion:
  199. </para>
  200. <programlisting language="php"><![CDATA[
  201. class TestController extends Zend_Controller_Action
  202. {
  203. // ...
  204. /**
  205. * Startseite
  206. */
  207. public function indexAction()
  208. {
  209. $this->view->form = $this->getForm();
  210. }
  211. public function autocompleteAction()
  212. {
  213. if ('ajax' != $this->_getParam('format', false)) {
  214. return $this->_helper->redirector('index');
  215. }
  216. if ($this->getRequest()->isPost()) {
  217. return $this->_helper->redirector('index');
  218. }
  219. $match = trim($this->getRequest()->getQuery('test', ''));
  220. $matches = array();
  221. foreach ($this->getData() as $datum) {
  222. if (0 === strpos($datum, $match)) {
  223. $matches[] = $datum;
  224. }
  225. }
  226. $this->_helper->autoCompleteDojo($matches);
  227. }
  228. }
  229. ]]></programlisting>
  230. <para>
  231. in unserer <methodname>autocompleteAction()</methodname> machen wir eine Anzahl von
  232. Dingen. Zuerst schauen wir darauf eine Post Anfrage durchzuführen, und das dort ein
  233. 'format' Parameter auf den Wert 'ajax' gesetzt ist; das hilft einfach störende
  234. Anfragen zur Aktion zu reduzieren. Als nächstes prüfen wir auf den 'test'
  235. Parameter, und vergleichen Ihn mit unseren Daten. (wir haben absichtlich die
  236. Implementation von <methodname>getData()</methodname> hier ausgelassen -- es können
  237. einfach jede Art von Datenquelle sein.) Letztendlich senden wir unsere
  238. Entsprechungen zum AutoCompletion Helfer.
  239. </para>
  240. <para>
  241. Jetzt da wir alle Teile des Backends haben, sehen wir uns an was wir benötigen um
  242. es in unserem View Skript für die Startseite auszugeben. Zuerst müssen wir unseren
  243. Datenspeicher einstellen, dann unsere Form darstellen, und letztendlich
  244. sicherstellen das die richtigen Dojo Bibliotheken -- inklusive unserer eigenen
  245. Datenspeicher -- geladen werden. Schauen wir uns das View Skript an, das die
  246. Schritte kommentiert:
  247. </para>
  248. <programlisting language="php"><![CDATA[
  249. <?php // Den Datenspeicher einstellen: ?>
  250. <div dojoType="custom.TestNameReadStore" jsId="testStore"
  251. url="<?php echo $this->baseUrl() ?>/unit-test/autocomplete/format/ajax"
  252. requestMethod="get"></div>
  253. <?php // Die Form darstellen: ?>
  254. <?php echo $this->form ?>
  255. <?php // Das Dojo-betreffende CSS einstellen das im
  256. // HTML Head geladen werden soll: ?>
  257. <?php $this->headStyle()->captureStart() ?>
  258. @import "<?php echo $this->baseUrl()
  259. ?>/javascript/dijit/themes/tundra/tundra.css";
  260. @import "<?php echo $this->baseUrl() ?>/javascript/dojo/resources/dojo.css";
  261. <?php $this->headStyle()->captureEnd() ?>
  262. <?php // Javascript einstellen das im HTML Head geladen werden soll,
  263. // inklusive aller benötigten Dojo Bibliotheken: ?>
  264. <?php $this->headScript()
  265. ->setAllowArbitraryAttributes(true)
  266. ->appendFile($this->baseUrl() . '/javascript/dojo/dojo.js',
  267. 'text/javascript',
  268. array('djConfig' => 'parseOnLoad: true'))
  269. ->captureStart() ?>
  270. djConfig.usePlainJson=true;
  271. dojo.registerModulePath("custom","../custom");
  272. dojo.require("dojo.parser");
  273. dojo.require("dojox.data.QueryReadStore");
  274. dojo.require("dijit.form.ComboBox");
  275. dojo.require("custom.TestNameReadStore");
  276. <?php $this->headScript()->captureEnd() ?>
  277. ]]></programlisting>
  278. <para>
  279. Beachte die Aufrufe zu den View Helfern wie headStyle und headScript; das sind
  280. Platzhalter, welche dann in der <acronym>HTML</acronym> Head Sektion des Layout
  281. View Skripts dargestellt werden können.
  282. </para>
  283. <para>
  284. Wir haben jetzt alle Teil um mit Dojo AutoCompletion zu arbeiten.
  285. </para>
  286. </example>
  287. </sect4>
  288. <sect4 id="zend.controller.actionhelpers.autocomplete.scriptaculous">
  289. <title>AutoCompletion mit Scriptaculous</title>
  290. <para>
  291. <ulink
  292. url="http://wiki.script.aculo.us/scriptaculous/show/Ajax.Autocompleter">Scriptaculous</ulink>
  293. erwartet eine <acronym>HTML</acronym> Antwort in einem speziellen Format.
  294. </para>
  295. <para>
  296. Der Helfer der mit dieser Bibliothek zu verwenden ist 'AutoCompleteScriptaculous'.
  297. Es muß einfach ein Array von Daten angegeben werden, und der Helfer wird eine
  298. <acronym>HTML</acronym> Antwort erstellen die mit Ajax.Autocompleter kompatibel ist.
  299. </para>
  300. </sect4>
  301. </sect3>
  302. <!--
  303. vim:se ts=4 sw=4 et:
  304. -->