1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- EN-Revision: 16509 -->
4 <sect3 id="zend.controller.actionhelpers.autocomplete">
5 <title>AutoComplete</title>
8 Muchas bibliotecas de Javascript con
9 <acronym>AJAX</acronym>
10 ofrecen funcionalidad para
11 proporcionar autocompletado según la cual un selectlist de
13 potencialmente concordantes se visualiza a medida que el usuario tipea.
15 <emphasis>AutoComplete</emphasis>
16 pretende simplificar el retorno
17 de respuestas aceptables a esos métodos.
21 Dado que no todas la bibliotecas JS implementan el autocompletado de
24 <emphasis>AutoComplete</emphasis>
26 funcionalidades abstractas de base necesarias para muchas bibliotecas,
28 implementaciones concretas para distintas bibliotecas.
29 Los tipos de datos de retorno son
30 generalmente o bien arrays de strings
31 <acronym>JSON</acronym>
33 <acronym>JSON</acronym>
34 (donde cada miembro del array está en un array
35 asociativo de metadatos utilizado para crear
37 <acronym>HTML</acronym>
42 El uso básico para cada aplicación es el mismo:
45 <programlisting language="php"><![CDATA[
46 class FooController extends Zend_Controller_Action
48 public function barAction()
50 // Ejecutar alguna lógica...
52 // Codificar y enviar la respuesta;
53 $this->_helper->autoCompleteDojo($data);
56 $response = $this->_helper->autoCompleteDojo
57 ->sendAutoCompletion($data);
59 // O prepare simplemente la respuesta de autocompletado:
60 $response = $this->_helper->autoCompleteDojo
61 ->prepareAutoCompletion($data);
67 Por defecto, el autocompletado hace lo siguiente:
73 Desactiva esquemas y a ViewRenderer.
79 Establece las cabeceras apropiadas para la respuesta.
85 Establece el cuerpo de la respuesta con datos
86 codificados o formateados para
99 Los métodos disponibles para el ayudante incluyen:
105 <methodname>disableLayouts()</methodname>
106 puede ser utilizada para
107 desactivar esquemas y a ViewRenderer. Típicamente, esto se
109 <methodname>prepareAutoCompletion()</methodname>
116 <methodname>encodeJson($data, $keepLayouts = false)</methodname>
118 <acronym>JSON</acronym>
119 , y opcionalmente habilitando o
120 deshabilitando esquemas. Típicamente, esto se llama
122 <methodname>prepareAutoCompletion()</methodname>
129 <methodname>prepareAutoCompletion($data, $keepLayouts = false)</methodname>
130 se utiliza para preparar datos en el formato necesario de la
132 aplicación concreta, opcionalmente los
133 esquemas pueden habilitarse o deshabilitarse.
134 El valor de retorno variará dependiendo de la implementación.
140 <methodname>sendAutoCompletion($data, $keepLayouts = false)</methodname>
141 se utiliza para preparar datos en el formato necesario de la
143 aplicación concreta. Esta llama a
144 <methodname>prepareAutoCompletion()</methodname>
145 , y entonces envía la
152 <methodname>direct($data, $sendNow = true, $keepLayouts =
154 se utiliza cuando se llama al ayudante como
155 un método del ayudante intermediario. El flag
156 <varname>$sendNow</varname>
157 se utiliza para determinar si se debe
159 <methodname>sendAutoCompletion()</methodname>
161 <methodname>prepareAutoCompletion()</methodname>
169 <emphasis>AutoComplete</emphasis>
170 soporta las bibliotecas
171 <acronym>AJAX</acronym>
173 Dojo y Scriptaculous.
176 <sect4 id="zend.controller.actionhelpers.autocomplete.dojo">
177 <title>AutoCompletado con Dojo</title>
180 Dojo no tiene un widget de autocompletado per se, pero tiene dos
182 ejecutar AutoCompletado: ComboBox y
183 FilteringSelect. En ambos casos, necesitan de un
185 que implemente QueryReadStore; para obtener más información sobre
187 temas, ver la documentación en
189 url="http://dojotoolkit.org/book/dojo-book-0-9/part-3-programmatic-dijit-and-dojo/data-retrieval-dojo-data-0"
194 En Zend Framework, puede pasar un simple array indexado al ayudante
196 este regresará una adecuada respuesta
197 <acronym>JSON</acronym>
198 para su uso como almacenamiento:
201 <programlisting language="php"><![CDATA[
202 // dentro del controlador de acción:
203 $this->_helper->autoCompleteDojo($data);
206 <example id="zend.controller.actionhelpers.autocomplete.dojo.example1">
207 <title>AutoCompletion con Dojo Usando Zend MVC</title>
210 AutoCompletion con Dojo via Zend
211 <acronym>MVC</acronym>
212 requiere varias cosas:
213 generar un objeto form para el ComboBox en el que usted quiere
214 AutoCompletado, un controlador de acción para prestar servicio
216 AutoCompletion, creando un QueryReadStore
217 personalizado para conectar a la acción
219 y la generación del Javascript a utilizar en la inicializción
221 AutoCompletion del lado del servidor.
225 En primer lugar, veamos el Javascript necesario. Dojo ofrece
226 un marco completo para
228 <acronym>OOP</acronym>
231 <acronym>PHP</acronym>
232 . Parte de eso es la capacidad de
233 crear pseudo-namespaces utilizando la jerarquía de
235 Crearemos un directorio 'custom' en el mismo nivel en el cual
237 directorio de Dojo forma parte de la distribución Dojo.
238 Dentro del directorio,
239 crearemos un archivo Javascript,
240 <filename>TestNameReadStore.js</filename>
241 , con el siguiente contenido:
244 <programlisting language="javascript"><![CDATA[
245 dojo.provide("custom.TestNameReadStore");
246 dojo.declare("custom.TestNameReadStore", dojox.data.QueryReadStore, {
247 fetch:function (request) {
248 request.serverQuery = { test:request.query.name };
249 return this.inherited("fetch", arguments);
255 Esta clase es simplemente una extensión del propio
256 QueryReadStore de Dojo, que es
257 de por sí misma una clase
258 abstracta. Simplemente definimos un método por el cual
259 realizamos la solicitud, y se le asigna al elemento 'test'.
263 A continuación, vamos a crear el elemento form para el que
264 queremos AutoCompletion:
267 <programlisting language="php"><![CDATA[
268 class TestController extends Zend_Controller_Action
272 public function getForm()
274 if (null === $this->_form) {
275 $this->_form = new Zend_Form();
276 $this->_form->setMethod('get')
278 $this->getRequest()->getBaseUrl() . '/test/process'
281 'test' => array('type' => 'text', 'options' => array(
282 'filters' => array('StringTrim'),
283 'dojoType' => array('dijit.form.ComboBox'),
284 'store' => 'testStore',
285 'autoComplete' => 'false',
286 'hasDownArrow' => 'true',
287 'label' => 'Your input:',
289 'go' => array('type' => 'submit',
290 'options' => array('label' => 'Go!'))
299 Aquí, estamos simplemente creando un formulario con los métodos
301 método 'test' agrega varios atributos
302 especiales específicos de Dojo: dojoType,
304 <emphasis>AutoComplete</emphasis>
305 y hasDownArrow. El dojoType es utilizado para indicar que
307 ComboBox, y que vamos a vincularlo
308 a un almacén de datos (clave 'store') de
310 -- veremos más de esto más adelante.
312 <emphasis>AutoComplete</emphasis>
314 <constant>FALSE</constant>
315 se le dice a Dojo que
316 no seleccione automáticamente el primer acierto, sino mostrar
317 una lista de aciertos. Por último, 'hasDownArrow' crea una
318 flecha abajo similar a un
319 select box para que podamos
320 mostrar y ocultar los aciertos o concordancias.
324 Vamos a añadir un método para mostrar la forma, así como un
326 procesamiento de AutoCompletion:
329 <programlisting language="php"><![CDATA[
330 class TestController extends Zend_Controller_Action
337 public function indexAction()
339 $this->view->form = $this->getForm();
342 public function autocompleteAction()
344 if ('ajax' != $this->_getParam('format', false)) {
345 return $this->_helper->redirector('index');
347 if ($this->getRequest()->isPost()) {
348 return $this->_helper->redirector('index');
351 $match = trim($this->getRequest()->getQuery('test', ''));
354 foreach ($this->getData() as $datum) {
355 if (0 === strpos($datum, $match)) {
359 $this->_helper->autoCompleteDojo($matches);
366 <methodname>autocompleteAction()</methodname>
368 de cosas. En primer lugar, esperamos a asegurarnos de que
370 una petición post, y que existe un parámetro 'form'
371 establecido al valor 'ajax'; esto
372 es simplemente para ayudar a
373 reducir preguntas espúreas a la acción.
375 vamos a comprobar el parámetro 'test', y
376 compararlo contra nuestros datos. (Yo
377 deliberadamente dejé de
378 lado la implementación de
379 <methodname>getData()</methodname>
381 podría ser cualquier tipo de fuente de datos). Por último,
383 aciertos a nuestro ayudante AutoCompletion.
387 Ahora que tenemos todas las piezas en el backend, veamos lo que
389 entregar en nuestro script de vista para la
391 En primer lugar, necesitamos
392 configurar nuestro data store,
393 luego hacer nuestro formulario, y finalmente
395 las biblotecas Dojo apropiadas -- incluyendo que nuestro data
397 personalizado -- estén cargadas.
398 Veamos el script de vista, el cual comenta los
402 <programlisting language="php"><![CDATA[
403 <?php // establecemos nuestro data store: ?>
404 <div dojoType="custom.TestNameReadStore" jsId="testStore"
405 url="<?php echo $this->baseUrl() ?>/unit-test/autocomplete/format/ajax"
406 requestMethod="get"></div>
408 <?php // mostramos nuestro form: ?>
409 <?php echo $this->form ?>
411 <?php // establecemos CSS relacionado con Dojo a cargar en HTML head: ?>
412 <?php $this->headStyle()->captureStart() ?>
413 @import "<?php echo $this->baseUrl()
414 ?>/javascript/dijit/themes/tundra/tundra.css";
415 @import "<?php echo $this->baseUrl() ?>/javascript/dojo/resources/dojo.css";
416 <?php $this->headStyle()->captureEnd() ?>
418 <?php // setup de javascript para cargar en HTML head, incluyendo todas las
419 // bibliotecas Dojo requeridas: ?>
420 <?php $this->headScript()
421 ->setAllowArbitraryAttributes(true)
422 ->appendFile($this->baseUrl() . '/javascript/dojo/dojo.js',
424 array('djConfig' => 'parseOnLoad: true'))
426 djConfig.usePlainJson=true;
427 dojo.registerModulePath("custom","../custom");
428 dojo.require("dojo.parser");
429 dojo.require("dojox.data.QueryReadStore");
430 dojo.require("dijit.form.ComboBox");
431 dojo.require("custom.TestNameReadStore");
432 <?php $this->headScript()->captureEnd()
436 Note que las llamadas a los ayudantes de vista como headStyle
438 ubicadores, que podemos suministrar a la
440 <acronym>HTML</acronym>
441 de nuestro script de vista.
445 Ahora tenemos todas las piezas para que el AutoCompletion
446 de Dojo pueda trabajar.
451 <sect4 id="zend.controller.actionhelpers.autocomplete.scriptaculous">
452 <title>AutoCompletion con Scriptaculous</title>
454 <ulink url="http://wiki.script.aculo.us/scriptaculous/show/Ajax.Autocompleter">Scriptaculous</ulink>
456 <acronym>HTML</acronym>
457 en un formato específico.
461 El ayudante para utilizar con esta biblioteca es
462 'AutoCompleteScriptaculous'. Simplemente
463 proporcionarle un array de
464 datos, y el ayudante creará una respuesta
465 <acronym>HTML</acronym>