Zend_Controller-ActionHelpers-AutoComplete.xml 14 KB

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