Mahomedalid
simplemente la vida ... mahomedalid feed
revista urbana y cultural de tepic

miércoles, septiembre 12, 2007

scriptaculous autocompleter with Xajax




Hace tiempo en Innox implementé en alguno de los sistemas un autocomplete, al estilo Google Suggest. Sin embargo, hay más variables a considerar de las que pueden verse a simple vista y realmente terminé con un cagadero de javascript (que ciertamente funcionaba) pero que simplemente se volvió inmantenible.

Bueno, pues decidí utilizar el autocompleter de scriptaculous ya que es una librería que ya teníamos entre nuestros COTS.

Hay dos autocompleters en scriptaculous el Autocompleter.Local que trabaja a través de arreglos fijos y el Ajax.Autocompleter que trabaja con requests ajax del tipo Ajax.Request de la misma librería. Sin embargo nosotros usamos Xajax una librería de PHP que en verdad facilita el trabajo manejando toda la obra negra y dejandonos un set de funciones javascript que corresponden a funciones o métodos de objetos en PHP. ¿Cómo integrarlo?

Bueno, ya que no encontré nada por la red hice mi propio workaround que tal vez a alguien le sirva.

  1. Xajax.Autocompleter = Class.create();
  2. Object.extend(Object.extend(Xajax.Autocompleter.prototype, Autocompleter.Base.prototype), {
  3. initialize: function(element, update, xajax_function, options) {
  4. this.baseInitialize(element, update, options);
  5. this.options.defaultParams = this.options.parameters || null;
  6. this.xajax_function = xajax_function;
  7. },
  8. getUpdatedChoices: function() {
  9. this.startIndicator ();
  10. this.xajax_function (this.getToken ());
  11. }
  12. });


Que en realidad es un "function.autocompleter", ya que el tercer parámetro que hay que mandarle es un callback a la función xajax que hará la magia (xajax_function). Esta función recibe como parametro el tocken escrito en el input.

Las funciones xajax devuelven siempre un xml, pero la función dentro del completer que actualiza las funciones disponibles recibe una cadena con una lista ordenada. Nuestra función xajax debe de alguna manera ejecutar esa función para actualizar la lista. Yo lo que hice fue actualizar un elemento oculto en el html y luego mandar el innerHTML a esa función (updateChoices), todo esto desde el request Xajax a fin de que instantaneamente se actualice la lista de opciones.

De ahí en fuera se puede utilizar tal como el Ajax.autocompleter, con sus parametros como callbacks y toda la onda.

Yo se que todo esto suena muy críptico, nunca he sido bueno explicando cosas, pero espero de una pequeña luz sobre por donde se puede hacer. Si alguien tiene alguna duda puede mandarme un msg, y les envió mi código.

Voila!

4 comentarios:

Sgto Carrujo dijo...

te falto poner...

Facil...

Mahomedalid Ivan Pacheco Morelos dijo...

No, ya aprendí la lección de "El código se explica por si mismo"

Abel Martin dijo...

Que tal man, estuve hechandole un vistazo pero a la larga no me funciono. Me podrias enviar el ejemplo del que hablas a abelmza@gmail.com? Gracias de antemano :)

Mahomedalid Ivan Pacheco Morelos dijo...

Yo: Si claro, solo que como uso código de un framework propietario tengo
que adaptarlo un poco y te lo mando.

Tienes alguna duda en particular que te pueda contestar en lo que
hago? Como lo intentaste?

====
Borix:

agregue el javascript que posteaste en tu sitio a mi archivo y cambie los nombres de xajax_function por mi funcion. El tema es que no encuentro como relacionar el response del xajax con la pagina en si misma... me explico?

===

Si claro,

al final tengo esto:

$r->addAssign ( "ID_ObjetoDOMDondeHagoUpdateDeLista"
, "innerHTML"
, HTMLLista);
...

Donde HTMLLista es una Ul y donde
ID_ObjetoDOMDondeHagoUpdateDeLista es un div que utilizo de apoyo para
la siguiente función...

$r->addScript ("ObjetoDOMDelSuggest.updateChoices
($('ID_ObjetoDOMDondeHagoUpdateDeLista').innerHTML)");

Puedes tratar de actualizar directamente la lista del suggest sin
utilizar un id de apoyo, pero francamente no lo he intentado.

De cualquier forma deja hago un ejemplo y lo subo.