Mostrando entradas con la etiqueta jquery UI. Mostrar todas las entradas
Mostrando entradas con la etiqueta jquery UI. Mostrar todas las entradas

jueves, 8 de noviembre de 2012

Sistema echo en Codeigniter + HMVC + Jquery UI + JqGrid

Sistema echo en Codeigniter + HMVC + Jquery UI + JqGrid

Este sistema es un sistema que desarrolle ya hace algún tiempo, donde hago uso de JqGrid, y últimamente me an solicitado que publique una entrada para conectar JqGrid con el servidor, como no e tenido tiempo no e podido sacar un tutorial dedicado a esto, ademas de que es un poco enredado, así que e decidió subir este código y ponerlo a la orden para que puedan ver como es.

Este no es un sistema para producción es solamente un sistema desarrollado para una tesis, espero que le sirva de utilidad a alguien más.

Este sistema cuenta con los siguientes Modulos:
  • Clientes
  • Productos
  • Pedido
  • Historial Medico, como para oftalmologo, pero es sumamente básico.
La parte de la consulta es enredada porque cuando lo desarrolle lo hice de una forma tal que pudiese funcionar con varias columnas sin necesidad de cambiarlo mucho. 

Instalación

Para instalar el sistema, se debe tener ya un servidor con Apache, Window y Linux.
Lo primero que se debe hacer es crear una base de datos para el sistema, importar el archivo eye2000.sql y luego configurar el archivo database.php.
Con eso es suficiente para que el sistema empiece a funcionar

Screenshots

URL EN GITHUB

martes, 27 de marzo de 2012

jqGrid Búsqueda y Barra de Filtro (FilterToolbar)

Siguiendo en el tema de jqGrid, ahora vamos a hablar de los filtros y la búsqueda. Cuando estamos haciendo una tabla de datos, una de las parte más fastidiosa es programar la parte de los filtros y la búsqueda, porque si el cliente lo quiere por cédula, e que la diseño la hizo por nombre, y así cada quien dio su opinión y esto nos puedo consumir mucho tiempo. Pero este plugin de jqGrid, nos trae dos soluciones fáciles y sencillas con las cuales podamos agregar esto al grid fácilmente. Lo chevere de esto es que a la hora de programarlo también va a ser sencillo agregar nuevos campos y crear filtros de forma fácil y sencilla.

Barra de navegación(Búsqueda)

La barra de navegación es fácil de agregar, y tiene muchas opciones, por ahora solo vamos a usar la opción de búsqueda. Esta opción lo que hace es agregar un icono de lupa en la barra de abajo y al hacer clic, podemos agregar reglas para filtrar la información, no es muy compleja, y es sencilla de agregar, solo tenemos que agregar el código siguiente después del constructor de jqGrid. ".navGrid('#pager', { view: false, del: false, add: false, edit: false });"

Con esto vamos a agregar dos botones, el de buscar y el de recargar grid. el de recargar solamente reinicia el grid a su estado original, en el caso de que hayamos agregado un filtro. Con esto el grid se vería asi.

De las opciones destacables que le podemos agregar a la configuración de la opción search están:
  • multipleSearch: Que permite agregar varias reglas de búsqueda, al mismo tiempo.
  • closeOnEscape: que determina si el dialogbox, se va a cerrar presionando la tecla escape
  • closeAfterSearch: esta opción habilita que se va a cerrar el cuadro de dialogo después de darle a la opción buscar.

Esta es la wiki dedicada al navgrid: http://www.trirand.com/jqgridwiki/doku.php?id=wiki:navigator, si desean leer más del tema, como la configuración y esas cosas.

A la final con todas las opciones anteriores el codigo quedaría así:

$(document).ready(function(){ $("#list").jqGrid({ datatype: "local", data: mydata, height: "auto", colNames:['Inv No','Date', 'Client', 'Amount','Tax','Total','Notes'], colModel:[ {name:'id',index:'id', width:60, search:false}, {name:'invdate',index:'invdate', width:90}, {name:'name',index:'name', width:100}, {name:'amount',index:'amount', width:80, align:"right"}, {name:'tax',index:'tax', width:80, align:"right"}, {name:'total',index:'total', width:80,align:"right"}, {name:'note',index:'note', width:150, sortable:false} ], caption: "http://sosinformatico.blogspot.com", //viewrecords: true, altRows: true, pager:'#pager', rowNum: 10, rowList:[10,15,20] }).navGrid('#pager', { view: false, del: false, add: false, edit: false }, {},//opciones edit {}, //opciones add {}, //opciones del {multipleSearch:true,closeAfterSearch: true, closeOnEscape: true}//opciones search ).jqGrid("filterToolbar"); for(var i=0;i<=mydata.length;i++) jQuery("#list").jqGrid('addRowData',i+1,mydata[i]); jQuery("#list").trigger("reloadGrid") });

Barra de Filtro(Filter Toolbar)

Aparte tambien podemos agregar una barra de filtro, esta es una barra en la parte superior de la tabla, que nos permite agregar filtros específicos para cada una de las columnas. Un poco parecidos a los grids de Joomla, donde en la parte superior hay filtros, como filtros por estado, por autor, etc. Para activarla solo debemos agregar esto ".jqGrid("filterToolbar")" a el objeto donde instanciamos el grid, para que empiece a funcionar. Con esto nos debe salir una barra parecida a esta:


Configurando Las opciones de Búsqueda

Ahora viene la parte más importante y es la de configurar cada una de las columnas con sus diferentes opciones de búsqueda. jqGrid nos permite personalizar las opciones que le vamos a ofrecer a los usuarios para realizar las búsquedas.Dentro del colModel se configuran como van a ser las opciones de búsqueda para cada una de las columnas, las opciones que tienen que ver con configuración son las siguientes:
  • search: Especifica si este campo va a aceptar búsqueda o no. Default: true
  • stype: Determina el tipo de campo de búsqueda, los únicos dos permitidos son text y select. Default: text
  • searchoptions: es un objeto que contiene toda las opciones y configuraciones para las búsquedas.
  • searchrules: es otro objeto que identifica las reglas de búsqueda que le va a aplicar al input del usuario.
Opciones de Búsqueda(searchOptions)

  • dataUrl: especifica una url, para en el caso de que el tipo sea un select, cargue las opciones por via ajax de esa url. El resultado de el ajax puede ser un select html, con las opciones.
  • buildSelect: si usamos la opción anterior, con esta podemos asignar una función que se encargue de crear el select con el resultado de la función ajax.
  • dataInit: con esta especificamos la función que se va a disparar cuando se cree el objeto.
  • dataEvents: Un array con una lista de eventos para añadir al input.
  • searchhidden: por defecto los elementos ocultos no se pueden buscar, pero con esta opción podemos activar que se vean los elementos ocultos.
  • sopt: especifica las opciones que pueden ser usadas solamente en la busqueda avanzada del navgrid.
  • defaultValue: establece un valor por defecto para el filtro.
  • value: esta opción solo se usa si usamos el tipo select. Aquí especificamos los valores que puede contener el select, puede ser o una cadena de texto o un objeto javascript con valores y claves. si es un string debe ser en formato csv, donde las filas esten separadas con ; y la clave del value separado con :.
Opciones Estras

Aparte de las opciones antes descritas, en este ejemplo también agregue estas dos opciones:
  • autowidth: Con esta opción en true, nuestro sistema automáticamente agarrara el ancho máximo disponible, y tratara de que las filas todas mantengas la misma proporción.
  • viewrecords: Muestra en la barra de navegación, el numero de filas que hay y el rango que esta mostrando.

Aparte de estas opciones también estan las opciones de reglas de búsqueda, si quieres revisarlas se encuentran aquí: http://www.trirand.com/jqgridwiki/doku.php?id=wiki:search_config. Cabe destacar que estas reglas solo se usan en el cuadro de dialogo y tampoco son muy efectivas.

Para terminar les dejo un ejemplo aquí de lo que se puede hacer, con el ejemplo que venimos haciendo desde el principio. Saludos...

http://bomba1990.pythonanywhere.com/sosinformatico/js/JqGrid_Basico3

Repositorio GitHub: https://github.com/bomba1990/JqGrid-Ejemplos


martes, 20 de marzo de 2012

Agregando Paginación jQuery Grid.

Como lo prometido es deuda, tarde pero hay voy, llevo tiempo sin tiempo para escribir pero voy a tratar en estos días de publicar los artículos referentes al uso de jQuery Grid. En este manual les voy a mostrar como agregar paginación al Grid que ya habíamos creado en el tutorial anterior.

Agregar la paginación es sumamente sencillo, y no nos va a tomar mucho tiempo. Lo único que necesitamos es el proyecto anterior en nuestra computadora.

Empezamos, lo primero que debemos hacer es agregar un elemento div después de el elemento table con el id=pager.

Después tenemos que agregar al constructor de jqGrid estos dos elementos: pager, rowNum estos dos elementos son lo básico para que jqGrid empiece a paginar las tablas.
  • pager: es la opción de jqGrid, donde especificamos el id del div, que jqGrid va a usar como barra de navegación. Debemos colocar es un selector como el que colocamos entre paréntesis.
  • rowNum: con este parámetro le decimos al plugin cuantas filas va a mostrar por pagina. Ya solamente con especificar esto, el jqGrid pagina nuestro resultado de 10 en 10.

A la final quedaria de esta manera el código de javascript:


$("#list").jqGrid({
 datatype: "local",
 data: mydata,
 height: 250,
 colNames:['Inv No','Date', 'Client', 'Amount','Tax','Total','Notes'],
 colModel:[
  {name:'id',index:'id', width:60},
  {name:'invdate',index:'invdate', width:90},
  {name:'name',index:'name', width:100},
  {name:'amount',index:'amount', width:80, align:"right"},
  {name:'tax',index:'tax', width:80, align:"right"},
  {name:'total',index:'total', width:80,align:"right"},
  {name:'note',index:'note', width:150, sortable:false}
  ],
 caption: "http://sosinformatico.blogspot.com",
 altRows: true,
 pager:'#pager',
 rowNum: 10

});
 for(var i=0;i<=mydata.length;i++)
  jQuery("#list").jqGrid('addRowData',i+1,mydata[i]);
 jQuery("#list").trigger("reloadGrid")
});

Al final del javascript después de cargar las filas debemos agregar un desencadenador del evento "reloadgrid", para que jqGrid re ordene y acomode las filas con la paginación que le agregamos.

Parámetros extras para la paginación.

Aparte hay otros parámetros que podemos configurar que tienen que ver con la paginacion:


  • rowList: con este parámetro le especificamos al jqGrid, que de la opción de poder cambiar el numero de filas que va a mostrar, es decir que la persona pueda establecer el numero de filas que va a mostrar por en el grid.
  • height: con el parámetro height especificamos la altura del grid, pero si lo ponemos en "auto", el grid va a tener automáticamente la altura que tengan las filas que están internas del grid, y si las cambiamso automáticamente cambia la altura del grid.
Repositorio GitHub: https://github.com/bomba1990/JqGrid-Ejemplos

Con esto terminamos por hoy como siempre los enlaces para descargarlo y para verlo en acción:
Descarga
jqGrid Basico2


jueves, 1 de diciembre de 2011

JqGrid Un Grid para Jquery


Hoy les presento un plugin para jQuery muy útil, el cual te permite crear Grid muy completos con algunas  pequeñas lineas de código.

Esta herramienta es muy poderoso y permite hasta cierto punto crear un grid completo con filtros, búsqueda, organización ascendente y descendente, paginación, etc casi sin necesidad que del lado del servidor halla código.  También se puede crear un Crud completo y bastante avanzado, con multigrid, grid dentro de grids, etc, con un poco más de interacción con un lenguaje del lado del servidor.

Otra Característica destacable de este plugin es que se ajusta a el jQuery UI, lo cual permite que se integre con  el diseño de nuestra interfaz con mucha facilidad. y modificarlo como queramos.



En este tutorial vamos a crear un Grid muy básico sin nada de interacción con el servidor, solo usando un array javascript con los datos, para ir viendo las funcionalidades de este poderoso plugin.  Por ahora solo vamos a trabajar con lo básico para que nos podamos ir sintiendo a gusto con este plugin.

Lo primero es descargar los archivos necesarios, de la pagina de jqgrid nos descargamos la ultima actualización del plugin y de la pagina de jquery UI nos descargamos el tema de nuestra preferencia.

Y ahora configuramos el area de trabajo de esta manera:

./css/ui.jqgrid.css
./css/images //adentro van las imagenes del tema.
./css/jquery-ui-1.8.16.custom.css
./js/jquery-1.5.2.min.js
./js/grid.locale-es.js
./js/jquery.jqGrid.min.js
./jqgrid.html

El archivo jqgrid.html sera donde crearemos el grid, lo primero es poner la estructura básica html, cuando pongamos los enlaces de jqgrid, debemos colocar primero el de idioma y después el de jqgrid porque sino nos dara error. Después agregamos una tabla dentro del body y le colocamos el id igual a list. Ya con esto podemos empezar a examinar este plugin.

Este plugin se manejo como todos los plugins de Jquery, primero $ + un selector + la función jqGrid + objeto con las opciones, en este tutorial voy a hacer un listado de las opciones básicas (el listado completo esta aqui!), para hacer el ejemplo básico:

Variables indispensables

  • datatype: especifica el tipo de dato que va a esperar jqgrid para hacer la representación de datos. los valores posibles son: xml, json, jsonp, local, xmlstring, jsonstring, javascript.
  • colNames: aquí se especifica el array javascript con los nombres de las columnas que se verán en el Grid.
  • colModel: esta es la más importante de todas, y debe estar en el mismo orden que colNames, desde aquí se especifican nombres, ancho, opciones de busqueda, filtros, ordenación, etc. es como la columna vertebral del jqGrid.
Variables opcionales basicas para este ejemplo:

  • caption: Especifica un nombre a la tabla.
  • data: especifica cual es el source cuando la variable es local. EL array debe seguir el patrón de colModel.
  • height: especifica la altura de el grid.
  • altRows: le pone la alternancia de colores a la tabla.

Especificaciones del colModel

El colModel como dije antes es la columna vertebral de este plugin y es donde se especifica cual va a ser la estructura y el comportamiento de cada una de las columnas, tenemos que tener claro que deben ser especificados en el mismo orden que especificamos los nombres de cada columna. Cada columna tiene las siguientes opciones básicas:


  • name: esta variable especifica el nombre unico de esa columna, no puede haber otra columna con el mismo nombre ni en subgrids.
  • align (opcional): esta variable especifica como se va a alinear el texto en la celda: left, center, right.
  • width (opcional): define el ancho de la columna, por defecto es 150px.
  • sortable (opcional): especifica si la columna puede ser ordenable
Ejemplo de Grid básico


Ahora si, aquí vamos con el ejemplo sencillo, la información es aleatoria, pero las claves deben ser las mismas el atributo name del colModel, voy a agregar la información a el Grid de dos maneras, una con el atributo data y otra con el metodo addRowData para agregar la fila al Grid, en la pagina recomiendan que para objetos grandes se haga con el atributo, pero es bueno conocer los dos métodos.


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
    <head> 
     <title>prueba</title> 
     <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  <link rel="stylesheet" type="text/css" href="css/jquery-ui-1.8.16.custom.css" /> 
  <link rel="stylesheet" type="text/css" href="css/ui.jqgrid.css" /> 
     <script src="js/jquery-1.5.2.min.js" type="text/javascript"></script> 
     <script src="js/grid.locale-es.js" type="text/javascript"></script> 
     <script src="js/jquery.jqGrid.min.js" type="text/javascript"></script> 
  <script type="text/javascript"> 
  var mydata = [ {id:"1",invdate:"2007-10-01",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"}, {id:"2",invdate:"2007-10-02",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"}, {id:"3",invdate:"2007-09-01",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"}, {id:"4",invdate:"2007-10-04",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"}, {id:"5",invdate:"2007-10-05",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"}, {id:"6",invdate:"2007-09-06",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"}, {id:"7",invdate:"2007-10-04",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"}, {id:"8",invdate:"2007-10-03",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"}, {id:"9",invdate:"2007-09-01",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"} ]; 
  $(document).ready(function(){
  $("#list").jqGrid({ 
   datatype: "local", 
   data: mydata,
   height: 250, 
   colNames:['Inv No','Date', 'Client', 'Amount','Tax','Total','Notes'], 
   colModel:[ 
    {name:'id',index:'id', width:60}, 
    {name:'invdate',index:'invdate', width:90}, 
    {name:'name',index:'name', width:100},
    {name:'amount',index:'amount', width:80, align:"right"}, 
    {name:'tax',index:'tax', width:80, align:"right"}, 
    {name:'total',index:'total', width:80,align:"right"}, 
    {name:'note',index:'note', width:150, sortable:false}
    ], 
   caption: "http://sosinformatico.blogspot.com",
   altRows: true
  });
  
   for(var i=0;i<=mydata.length;i++) 
    jQuery("#list").jqGrid('addRowData',i+1,mydata[i]);
  });
  </script>
    </head> 
    <body> 
     <table id='list'></table>
 </body>
</html>

A la final se debería ver así:


Repositorio GitHub: https://github.com/bomba1990/JqGrid-Ejemplos

Pueden Descargar el ejemplo desde:

http://www.box.com/s/oadoy8jey3idonmx381e

Pueden ver el ejemplo funcionando desde. http://bomba1990.pythonanywhere.com/sosinformatico/js/JqGrid_Basico

Despues pienso sacar 3 tutoriales más un con un grid más avanzado, y dos integrandolo con Codeigniter y Python. Estos ultimos quiero hacerlos como screencast por eso me voy a tardar un poquito más.


martes, 18 de octubre de 2011

Tutorial: Como Usar Jquery UI Dialog


jQuery UI Dialog, es un widget que forma parte de la librería del jQuery UI, que nos permite la creación de ventanas modales, de manera fácil y sencilla. Jquery UI Dialog como los demás widgets de la librería de jQuery UI sigue los estándares de jQuery y por lo tanto es bastante personalizable.



NOTA: Súper importante, estoy trabajando con la versión 1.8 del jQuery UI, y según e leído lo mas probable es que la en la versión 1.9 se modifique su forma de uso.

El widget jQuery UI Dialog, no requiere inicialización previa para empezar a trabajar aunque de todas manera lo podemos iniciar aparte, el widget requiere de un div en nuestra pagina con un id y el contenido que queramos que aparezca en la ventana modal. El contenido se puede parecer a esto:

<div id='dialog' style='display:none;' title='titulo de la ventana'>(contenido que quieres que aparezca en la caja de dialogo)</div>

Dentro de este div, podemos poner lo que necesitemos, ya sean formularios, imagenes, iframe, resultado de una llamada AJAX o todo junto si queremos. Aparte también podemos tranquilamente modificar el contenido del dialog con jQuery.html().

Requisitos para usar jQuery UI Dialog:
  • jquery.ui.core.js
  • jquery.ui.widget.js
  • jquery.ui.position.js
  • jquery.ui.button.js(opcional, solo si se van a usar los botones)
  • jquery.ui.mouse.js (opcional, solo si vamos a usar draggable o resizable)
  • jquery.ui.draggable.js(opcional solo si se va a usar la opcion "dragabble: true")
  • jquery.ui.resizable.js


Parámetros del widget jQuery UI Dialog:

Aqui estan los más importantes(casi todos) para la lista completa: http://jqueryui.com/demos/dialog#options
  • width: Especifica el ancho de la ventana modal, puede ser en numero o auto.
  • heigth: Especifica el alto de la ventana modal, puede ser numero o auto.
  • (min|max)width: especifica el ancho maximo o minimo de la ventana modal
  • (min|max)heigth: especifica la altura maxima o minima de la ventana modal
  • autoOpen: especifica si se abre o no automaticamente la ventana modal.
  • buttons, botones que va a tener nuestra ventana de dialogo, con sus funciones.
  • hide: efecto que sera usado cuando se cierre la ventana
  • show: efecto que se usara cuando se abra la ventana
  • draggable: define si es movible o no la ventana modal
  • resizable: especifica si se puede o no redimenzionar la ventana
  • modal: la ventana puede ser modal o no, si es verdad, pone un fondo en toda la pantalla semitransparente que impide que el usuario haga click en cualquier otro lado.
  • position: ubicacion de la ventana modal en la ventana, opciones:  'center', 'left', 'right', 'top', 'bottom'.  o un array que puede contener dos pocisiones una con las "x" y otras con las "y", estas pocisiones pueden ser con una de las opciones antes puesta o con un numero.
  • title: Especifica un titulo a la ventana
  • zIndex: establece el zIndex para nuestra ventana modal
  • dialogClass: agrega una clase a la ventana modal para poder definir estilos o lo que necesitemos.

 Eventos del widget jQuery UI Dialog:
  • open: permite especificar algunas opciones antes de que abre la ventana de dialogo, util para ventanas con formularios, donde queremos reiniciar lo que tiene el formulario.
  • beforeClose: funcion que se ejecute antes de que se cierre la ventana, lo cual tambien nos permite cancelar el cierre de la ventana si retorna false.
  • close: evento de cuando se cierra la ventana.
  • create: evento de cuando se crea la instancia.
  • focus: evento de cuando la ventana recibe el foco o es activada.
  • eventos de draggable: dragStart, dragStop, drag.
  • eventos de resizable: resizeStart, resizeStop, resize.

Metodos del widget jQuery UI Dialog:

  • close: cierra la ventana de dialogo
  • open: abre la ventana.
  • destroy: destruye la ventana.


Ventajas y Desventajas del jQuery UI DIalog

La única desventaja que presenta Jquery UI Dialog frente a otros plugins con fancybox, es que este no trae ningún tipo de sistema ya pre-echo para galerías o enlaces que se carguen con iframe o ajax, si que es simplemente una ventana modal y las demás funcionalidades se las tenemos que dar nosotros mismos o mezclarlo con otro plugin. Pero por otro lado tiene una gran ventaja frente a fancybox, porque no requiere pre-instalación de la ventana de dialogo sino que lo podemos crear cuando lo necesitemos.

Hasta aquí llega el tutorial por hoy, después pondre ejemplos mas concretos porque con la practica se hace al maestro.

Chao, Hasta una prosxima entrega!!

lunes, 28 de marzo de 2011

Tutorial: Jquery UI autocomplete y Codeigniter

Después de un buen tiempo sin escribir por exceso de trabajo, vuelvo con el tutorial prometido de como usar jquery UI autocomplete con codeigniter, es muy sencillo. Para comenzar vamos a necesitar tener las librerías de jquery ui que se pueden descargar de la pagina oficial: aqui!, podemos descargar un tema si queremos(yo descargue darkhide) , y por supuesto tener codeigniter.

Paso 1: Preparando el terreno.

Primero tenemos que crear un controlador que yo le voy a llamar autocomplete, una vista con el mismo nombre y una base de datos de usuarios que se van a mostrar.

En el código del controlador debemos por ahora agregar la carga de nuestra vista y la carga de el driver para base de datos y el  uri helper que nos ayudara.

Código de controlador inicial:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Autocomplete extends CI_Controller {
    function __construct()
    {
        parent::__construct();
        $this->load->database();
        $this->load->helper('url');
    }
    public function index()
    {
        $this->load->view('autocomplete');
    }
}

/* End of file welcome.php */
/* Location: ./application/controllers/autocomplete.php */

En el código de vista solo debemos poner el enlace a el css y js de jquery ui, para facilitarnos la vida nos ayudaremos con la función base_uri que nos permitirá darle una ruta absoluta.

Código vista:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <title>jQuery UI Autocomplete Ejemplo</title>
        <link type="text/css" href="<?php echo base_url(); ?>css/dark-hive/jquery-ui-1.8.10.custom.css" rel="stylesheet" />    
        <script type="text/javascript" src="<?php echo base_url(); ?>js/jquery-1.4.4.min.js"></script>
        <script type="text/javascript" src="<?php echo base_url(); ?>js/jquery-ui-1.8.10.custom.min.js"></script>
        <script type="text/javascript">
        </script>
    </head>
    <body>
    
    </body>
</html>

Y por ultimo crearemos una pequeña Base de datos de usuarios con solo un id y nombre de usuario, así:

CREATE TABLE `autocomplete`.`usuarios` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`user` VARCHAR( 80 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
);


INSERT INTO `usuarios` (`id`, `user`) VALUES
(1, 'mariano'),
(2, 'jose'),
(3, 'juan eduardo'),
(4, 'juan pedro'),
(5, 'no se uqe'),
(6, 'no se uqe mas'); 


Lo ultimo de este paso es configurar nuestra base de datos y ya debería cargar una pagina en blanco.

Paso 2: Configurando nuestra vista con autocomplete.

Ahora debemos configurar en la vista el autocomplete, solamente debemos agregar en el cuerpo un input text, y dentro de las etiquetas script la configuracion del autocomplete que va a ser referencia a una función que despues crearemos en nuestro controlador que se llamara ajax. Asi nos debería ir quedando la vista:
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <title>jQuery UI Autocomplete Ejemplo</title>
        <link type="text/css" href="<?php echo base_url(); ?>css/dark-hive/jquery-ui-1.8.10.custom.css" rel="stylesheet" />    
        <script type="text/javascript" src="<?php echo base_url(); ?>js/jquery-1.4.4.min.js"></script>
        <script type="text/javascript" src="<?php echo base_url(); ?>js/jquery-ui-1.8.10.custom.min.js"></script>
        <script type="text/javascript">
        $(document).ready(function(){
            $('#autocomplete').autocomplete({source:'<?php echo site_url('autocomplete/ajax'); ?>'});
        });
        </script>
    </head>
    <body>
    <p><label for='autocomplete'>Nombre de Usuario: </label><input type='text' id='autocomplete'></p>
    </body>
</html>
Paso 3: Empezando con el controlador.(Input Class)

En el controlador debemos crear una función llamada ajax que sera la encargada de enviar en formato json los datos para el autocomplete, para esto vamos a usar el Active Record Class de Codeigniter y el input class.

El codeigniter trae una clase ya echa y precargada para lo que son los input, esta libreria incluye funciones muy utiles:
  1. Pre-procesa todas las variables de entrada por seguridad.
  2. Provee algunas funciones para procesar las variables enviadas y pre-procesarlas.
Esta libreria nos provee una función que se llama $this->input->get(), esta función permite dos parametros el primero es para saber que variable de $_GET requerimos y el segundo establecer el filtrado en true(activado) o false(desactivado). La otra ventaja de esta función es que no nos va a dar error si nuestra variable no fue definida, ya que si la variable no fue definida devuelve un false. en nuestro caso agregariamos lo siguiente al código:
if($buscar=$this->input->get('term'))
{ 
} 
Paso 4: Usando Active Record Class para buscar en la base de datos.

Continuamos con el active record class, esta clase trae funciones para seleccionar, insertar, eliminar y modificar ya predefinidas que nos pueden ahorrar muchas lineas de código ademas de que con estas funciones ya todo va pre-filtrado contra posibles ataques.

lo primero es ver la función basica de select, $query=$this->db->get('usuarios') esta función haria simplemente un "select * from usuarios" y devuelve un objeto en $query. Como queremos buscar dentro de user los usuarios que tengan un nombre parecido a el termino de busqueda, debemos usar la función $this->db->like(), que recibe dos parametros, en uno la columna en la que deseamos buscar y el otro lo que deseamos buscar. Y por ultimo usaremos la funcion $this->db->select(), para poder especificar que columnas queremos y como las queremos: a la final nuestra funcion nos quedaria asi:

        $this->db->select('id, user as value');
        $this->db->like('user', $buscar); 
        $query=$this->db->get('usuarios');

Que generaria algo asi "SELECT `id`, `user` as value FROM (`usuarios`) WHERE user` LIKE '%$buscar%'"

Ahora solo debemos verificar que la respuestasea mayor que 0, pero en ves de usar el clasico mysql_num_rows usaremos $query->num_rows() > 0, y  para listar los resultados en ves de while ($row = mysql_fetch_array($result) ) usaremos foreach ($query->result_array() as $row). y por ultimo usamos la funcion json_encode para pasar nuestro array al formato json.

Condigo de la funcion ajax():
function ajax()
    {
        if($buscar = $this->input->get('term'))
        {
            $this->db->select('id, user as value');
            $this->db->like('user', $buscar); 
            $query=$this->db->get('usuarios');
            if($query->num_rows() > 0)
            {
                foreach ($query->result_array() as $row)
                {
                    $result[]= $row;
                }
            }
            echo json_encode($result);
        }
    } 

Con esto ya queda listo nuestro autocomplete solo queda probarlo.

Nota:
  • Si usan php 5 pueden usar el Method Chaining que les permite hacer los select en una sola linea.
  • Es buena idea limitar el numero de filas que vamos a devolver con agregar $this->db->limit(10); es suficiente.
  • Este metodo devulve el id de el usuario a el autocomplete, podemos agregar al autocomplete el siguiente codigo para usar en algo esa info:

    select: function( event, ui ) {
    alert(ui.item ?
    "Selected: " + ui.item.id :
    "Nothing selected, input was " + this.value );
    }


El resultado final esta en esta dirreccion: http://www.box.net/shared/agnursjr8n

martes, 1 de marzo de 2011

Tutorial: Jquery UI autocomplete

Hace poco estaba creando un proyecto y cuando estaba usando codeigniter y jquery tuve unos problemas porque al enviar los parametros por get como lo hace autocomplete por defecto pues el sistema no hacia nada y se hiba a la pagina de inicio, pero para mi frustacion esto solo pasaba en el servidor y no en localhost asi que supuse que eran problemas quizas con el apache o algo asi y como andaba frustado porque no me funcionaba, decidi sentarme a revisar a ver si yo podria mandar la info en ves de por GET por POST, cuando busque por internet no conseguí nada de información, asi que me deje de vainas y me sente a arreglar yo mismo mi problema y lo solucione. Ahora quiero compartir esa info con ustedes y pongo este tutorial de como usar autocomplete.



¿Que es jquery UI Autocomplete?


Es un plugin de la librería jquery UI (USER INTERFACE), que nos permite agregar a un input text funcionalidad de mostrar un menú al usuario con las posibles opciones que puede buscar y eligir. de una lista pre-acomodada. Donde esa lista puede venir de un array, de un  xml en nuestro servidor o de un código en php que se conecte a mysql y le muestre lo que nos interesa.


Opciones o parámetros:


  • disabled: Inhabilita o habilita el autocomplete, la opción por default es false.
  • appendTo: Selección en que elemento se va a abrir nuestro menú. el default es body.
  • delay: Sirve para especificar el tiempo que autocomplete va a esperar para activarse.  default: 300.
  • minLength: El tamaño mínimo que debe tener el texto para empesar a buscar.default 1.
  • source: que puede ser un array o una función.



Eventos:


  • Create:  cuando se crea el autocomplete.
  • Search:  cuando se va a realizar una búsqueda.
  • Open:  cuando se abre el menú.
  • Focus: es cuando el foco se mueve a un item de la lista, en este caso seria solo cuando es con el teclado.
  • Select: Cuando se selección un elemento de la lista
  • Close: Cuando la lista es cerrada.
  • Change: Después de que un item es seleccionado.

¿Como se usa Jquery UI Autocomplete?

Primero la opción sencilla, seleccionamos nuestro input text y le especificamos un array como source:

$('#selectbox').autocomplete({source:["codeigniter", "php", "jquery", "javascript"]});


Podemos también crear un variable de tipo array pasársela como source, ejemplo:

var lenguajes = ["codeigniter", "php", "jquery", "javascript"];

$('#selectbox').autocomplete({
source:lenguajes
});


También podemos usar un source remoto como un script php para ello solo vastaria con poner  la dirección del script en el source, y el script deberia responder con las variable en formulada en json:

$('#selectbox').autocomplete({
source:"search.php"
});

En esta pagina conseguirán los ejemplos para cada cosa, si tienen alguna duda me pueden dejar un comentario y yo los ayudo.

http://jqueryui.com/demos/autocomplete/

Ahora bien, ¿como hago para pasar por post los comandos al php?


Pues no es muy complicado para el que no sabe usar $.ajax, debemos primero saber con en el parámetro source podemos usar funciones las funciones deben tener permitir que les pasen dos parámetros: request, response, la variable request almacena lo que el autocomplete esta buscando y response almacena la respuesta.

Ahora bien dentro de esa función vamos a crear una llamada ajax a nuestro script en php,  debemos especificarle la url y el tipo de dato que va a devolver, también usando request.term pasaremos el termino que se desea buscar y después el resultado en json se lo vamos a pasar a la función autocomplete a través de response para que ella cree su lista.

A la final nuestro script debería quedar así:

    $("#selectbox").autocomplete({
        source: function( request, response ) {
                $.ajax({
                    type: "POST",
                    url: "search.php",
                    dataType: "json",
                    data: {
                        term: request.term
                    },
                    success: function( data ) {
                        response(data);
                    }
                });
            }
    });

Cave destacar que mediante este método, también podemos aprovechar las bondades de $.ajax y pasar varios parámetros al script ya que en el opción data de nuestra llamada ajax, podemos especificar varias variables, que era otra cosa que el autocomplete no nos permitia hacer.

Después haré un tuto para juntar esto con codeigniter y mysql, quizás con un poco de active record para que vean como es.