Zend_Controller-ActionHelpers-AutoComplete.xml 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 14978 -->
  3. <!-- Reviewed: no -->
  4. <sect3 id="zend.controller.actionhelpers.autocomplete">
  5. <title>AutoComplete</title>
  6. <para>
  7. Viele AJAX Javascript Bibliotheken bieten Funktionalitäten an für eine automatische
  8. Vervollständigung wobei eine Auswahlliste von potentiell passenden Ergebnissen angezeigt
  9. wird wärend der Benutzer tippt. Der <code>AutoComplete</code> Helfer zielt darauf ab
  10. 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 <code>AutoComplete</code> Helfer einige grundsätzliche abstrakte
  15. Funktionalitäten zu vielen Bibliotheken und konkrete Implementierungen für individuelle
  16. Bibliotheken. Zurückgegebene Typen sind generell entweder JSON Arrays von Strings, JSON
  17. Arrays von Arrays (mit jedem Mitgliedsarray das ein assoziatives Array von Metadaten ist,
  18. das verwendet wird um die Auswahlliste zu erstellen), oder HTML.
  19. </para>
  20. <para>
  21. Die grundsätzliche Verwendung ist für jede Implementierung die selbe:
  22. </para>
  23. <programlisting role="php"><![CDATA[
  24. class FooController extends Zend_Controller_Action
  25. {
  26. public function barAction()
  27. {
  28. // etwas Logik durchführen...
  29. // Verschlüsseln und Antwort senden;
  30. $this->_helper->autoCompleteDojo($data);
  31. // oder explizit:
  32. $response = $this->_helper->autoCompleteDojo
  33. ->sendAutoCompletion($data);
  34. // oder einfach die Antwort der automatischen
  35. // Vervollständigung vorbereiten;
  36. $response = $this->_helper->autoCompleteDojo
  37. ->prepareAutoCompletion($data);
  38. }
  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/formatierten automatisch vervollständigten Daten
  54. 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. <code>disableLayouts()</code> kann verwendet werden um Layouts und den ViewRenderer
  66. auszuschalten. Typischerweise wird das innerhalb von
  67. <code>prepareAutoCompletion()</code> aufgerufen.
  68. </para></listitem>
  69. <listitem><para>
  70. <code>encodeJson($data, $keepLayouts = false)</code> verschlüsselt Daten zu JSON,
  71. und aktiviert oder deaktiviert Layouts optional. Typischerweise wird das innerhalb
  72. von <code>prepareAutoCompletion()</code> aufgerufen.
  73. </para></listitem>
  74. <listitem><para>
  75. <code>prepareAutoCompletion($data, $keepLayouts = false)</code> wird verwendet um
  76. Daten im Antwortformat vorzubereiten wenn das für die konkrete Implementation
  77. notwendig ist, wobei Layouts optional aktiviert oder deaktiviert werden können.
  78. Der Rückgabewert variiert basierend auf der Implementierung.
  79. </para></listitem>
  80. <listitem><para>
  81. <code>sendAutoCompletion($data, $keepLayouts = false)</code> wird verwendet um
  82. Daten im Antwortformat zu senden was für die konkrete Implementierung notendig ist.
  83. Sie ruft <code>prepareAutoCompletion()</code> und sendet dann die Antwort.
  84. </para></listitem>
  85. <listitem><para>
  86. <code>direct($data, $sendNow = true, $keepLayouts = false)</code> wird verwendet
  87. wenn der Helfer als Methode des Helfer Brokers aufgerufen wird. Das
  88. <code>$sendNow</code> Flag wird verwendet um festzustellen ob
  89. <code>sendAutoCompletion()</code> oder <code>prepareAutoCompletion()</code>
  90. aufgerufen werden muß.
  91. </para></listitem>
  92. </itemizedlist>
  93. <para>
  94. Aktuell unterstützt <code>AutoComplete</code> die folgenden Dojo und Scriptaculous AJAX
  95. Bibliotheken.
  96. </para>
  97. <sect4 id="zend.controller.actionhelpers.autocomplete.dojo">
  98. <title>AutoCompletion mit Dojo</title>
  99. <para>
  100. Dojo hat per se keinen AutoCompletion Wizard, hat aber zwei Wizards die AutoCompletion
  101. ausführen können: ComboBox und FilteringSelect. In beiden Fällen benötigen Sie einen
  102. Datenspeicher der QueryReadStore implementiert; für mehr Informationen über dieses
  103. Thema siehe die
  104. <ulink url="http://dojotoolkit.org/book/dojo-book-0-9/part-3-programmatic-dijit-and-dojo/data-retrieval-dojo-data-0">dojo.data</ulink>
  105. Dokumentation.
  106. </para>
  107. <para>
  108. Im Zend Framework kann ein einfaches indiziertes Array an den AutoCompletionDojo Helfer
  109. übergeben werden, und er wird eine JSON Antwort zurückgeben die passend für die
  110. Verwendung in so einem Speicher ist:
  111. </para>
  112. <programlisting role="php"><![CDATA[
  113. // In der Controller Aktion:
  114. $this->_helper->autoCompleteDojo($data);
  115. ]]>
  116. </programlisting>
  117. <example id="zend.controller.actionhelpers.autocomplete.dojo.example1">
  118. <title>AutoCompletion mit Dojo und der Verwendung von Zend MVC</title>
  119. <para>
  120. AutoCompletion mit Dojo, über Zend MVC, benötigt verschiedene Dinge: Erstellung
  121. eines Form Objekts für die Kombobox bei der man AutoCompletion will, eine
  122. Kontroller Action für das anbieten der AutoCompletion Ergebnisse, Erstellung eines
  123. eigenen QueryReadSote um die AutoCompletion Aktion damit zu verbinden, und
  124. Erstellung des Javascripts das zur Initialisierung der AutoCompletion auf der
  125. Serverseite zu verwenden ist.
  126. </para>
  127. <para>
  128. Schauen wir uns zuerst das benötigte Javascript an. Dojo bietet ein komplettes
  129. Framework für die Erstellung von OOP Javascript, so wie Zend Framework für PHP.
  130. Teile davon sind die Möglichkeit Pseudo-Namespaces zu erstellen indem die
  131. Verzeichnis Hirarchie verwendet wird. Wir erstellen ein 'custom' Verzeichnis auf
  132. dem gleichen Level wie das Dojo Verzeichnis das Teil der Distribution von Dojo ist.
  133. In diesem Verzeichnis, erstellen wir eine Javascript Datei, TestNameReadStore.js,
  134. mit den folgenden Inhalten:
  135. </para>
  136. <programlisting role="javascript"><![CDATA[
  137. dojo.provide("custom.TestNameReadStore");
  138. dojo.declare("custom.TestNameReadStore", dojox.data.QueryReadStore, {
  139. fetch:function (request) {
  140. request.serverQuery = { test:request.query.name };
  141. return this.inherited("fetch", arguments);
  142. }
  143. });
  144. ]]>
  145. </programlisting>
  146. <para>
  147. Diese Klasse ist einfach eine Erweiterung von Dojo's eigenem QueryReadStore,
  148. welche selbst eine Abstrakte Klasse ist. Wir definieren einfach eine Methode mit
  149. der angefragt werden soll, und verknüpfen Sie mit dem 'test' Element.
  150. </para>
  151. <para>
  152. Als nächstes, erstellen wir das Form Element für das wir AutoCompletion wollen:
  153. </para>
  154. <programlisting role="php"><![CDATA[
  155. class TestController extends Zend_Controller_Action
  156. {
  157. protected $_form;
  158. public function getForm()
  159. {
  160. if (null === $this->_form) {
  161. $this->_form = new Zend_Form();
  162. $this->_form->setMethod('get')
  163. ->setAction(
  164. $this->getRequest()->getBaseUrl() . '/test/process'
  165. )
  166. ->addElements(array(
  167. 'test' => array('type' => 'text', 'options' => array(
  168. 'filters' => array('StringTrim'),
  169. 'dojoType' => array('dijit.form.ComboBox'),
  170. 'store' => 'testStore',
  171. 'autoComplete' => 'false',
  172. 'hasDownArrow' => 'true',
  173. 'label' => 'Your input:',
  174. )),
  175. 'go' => array('type' => 'submit',
  176. 'options' => array('label' => 'Go!'))
  177. ));
  178. }
  179. return $this->_form;
  180. }
  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 false sagt Dojo das der erste passende Eintrag nicht automatisch
  191. ausgewählt wird, aber stattdessen eine Liste von Entsprechnungen angezeigt wird.
  192. Letztendlich, erstellt 'hasDownArrow' einen Abwärtspfeil ähnlich einer Selectbox
  193. sodas Wir die Entsprechnungen zeigen und verstecken können.
  194. </para>
  195. <para>
  196. Fügen wir eine Methode hinzu um die Form anzuzeigen, sowie einen Endpunkt für die
  197. Bearbeitung der AutoCompletion:
  198. </para>
  199. <programlisting role="php"><![CDATA[
  200. class TestController extends Zend_Controller_Action
  201. {
  202. // ...
  203. /**
  204. * Startseite
  205. */
  206. public function indexAction()
  207. {
  208. $this->view->form = $this->getForm();
  209. }
  210. public function autocompleteAction()
  211. {
  212. if ('ajax' != $this->_getParam('format', false)) {
  213. return $this->_helper->redirector('index');
  214. }
  215. if ($this->getRequest()->isPost()) {
  216. return $this->_helper->redirector('index');
  217. }
  218. $match = trim($this->getRequest()->getQuery('test', ''));
  219. $matches = array();
  220. foreach ($this->getData() as $datum) {
  221. if (0 === strpos($datum, $match)) {
  222. $matches[] = $datum;
  223. }
  224. }
  225. $this->_helper->autoCompleteDojo($matches);
  226. }
  227. }
  228. ]]>
  229. </programlisting>
  230. <para>
  231. in unserer <code>autocompleteAction()</code> machen wir eine Anzahl von Dingen.
  232. 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 <code>getData()</code> hier ausgelassen -- es können einfach
  237. jede Art von Datenquelle sein.) Letztendlich senden wir unsere Entsprechungen zum
  238. 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 role="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. ]]>
  278. </programlisting>
  279. <para>
  280. Beachte die Aufrufe zu den View Helfern wie headStyle und headScript; das sind
  281. Platzhalter, welche dann in der HTML Head Sektion des Layout View Skripts
  282. dargestellt werden können.
  283. </para>
  284. <para>
  285. Wir haben jetzt alle Teil um mit Dojo AutoCompletion zu arbeiten.
  286. </para>
  287. </example>
  288. </sect4>
  289. <sect4 id="zend.controller.actionhelpers.autocomplete.scriptaculous">
  290. <title>AutoCompletion mit Scriptaculous</title>
  291. <para>
  292. <ulink url="http://wiki.script.aculo.us/scriptaculous/show/Ajax.Autocompleter">Scriptaculous</ulink>
  293. erwartet eine HTML Antwort in einem speziellen Format.
  294. </para>
  295. <para>
  296. Der Helfer der mit dieser Bibliothek zu verwenden ist ist 'AutoCompleteScriptaculous'.
  297. Es muß einfach ein Array von Daten angegeben werden, und der Helfer wird eine HTML
  298. Antwort erstellen die mit Ajax.Autocompleter kompatibel ist.
  299. </para>
  300. </sect4>
  301. </sect3>
  302. <!--
  303. vim:se ts=4 sw=4 et:
  304. -->