viernes, 16 de noviembre de 2012

Tutorial JqGrid + PHP + MYSQL

Siguiendo los cursos de JqGrid, ahora voy a mostrarles como hacer para montar el lado del servidor con PHP y MYSQL.

JqGrid es un sistema muy poderoso pero tiene la limitante que en modo data local máximo puede contener mil registros por las limitantes de Javascript, pero conectado directamente con un servidor que se encargue de todos los procesos, puede contener el numero de registros que necesitemos. Lo cual nos permite almacenar tranquilamente 20.000 filas de elementos sin ningún problema.

En este tutorial explicamos como conectar JqGrid con mysql, para cargar los datos JqGrid requiere para poder realizar la consulta ajax, que el archivo este en formato json o xml, en este tutorial vamos a explicar como se usa JqGrid en formato json, para cargar la data desde un servidor en php.



Formato de la solicitud AJAX
La solicitud ajax echa por JqGrid al servidor tiene estos parámetros:

  • nd: es simplemente la hora en la que se hizo la solicitud.
  • rows: el numero de lineas que se va a mostrar al usuario.
  • page: la pagina que se va a consultar en el momento.
  • sidx: el elemento por el cual se va a ordenar la consulta.
  • sord: el tipo de orden de la tabla asc o desc.
  • _search: esto es un bolleano que contiene false o true en el caso de que se se use la barra de filtros y se este buscando algo en especifico.
  • Listas de elementos: cada uno de los index de los elementos que usemos en la búsqueda van a salir de la filter toolbar también serán enviados como parámetros.


Formato del archivo JSON
El archivo json por el servidor debe contener los siguientes atributos:

  • page: La pagina actual que esta mostrando.
  • records: el numero de registros que hay en total en la tabla.
  • rows: las filas que vamos a devolver actualmente al sistema
  • total: el numero de paginas en total que hay en el sistema.
Conectando JqGrid con PHP y Mysql.
El proceso para hacer el puente de la información es:
  1. Primero hacemos lo normal y nos conectamos a la base de datos. 
  2. Después guardamos en un array todos los elementos de la solicitud que hace JqGrid.
  3. Construimos la consulta de filtrado para la barra de búsqueda. para construir la consulte lo dividi en dos partes el area de los like y el área de los equal, porque hay campos como los nombres que la búsqueda se puede parecer y hay campos como un total que tienen que ser exactos, pero ya cada uno podrá elegir como prefiera.
  4. Hacemos una consulta a la base de datos para saber el numero de filas que hay en total. 
  5. Calculamos el numero de paginas que hay, y averiguamos si la pagina es la correcta.
  6. Construimos la consulta añadiéndole los filter, los search y el orden.
  7. Hacemos la consulta para traernos los resultados que necesitamos en especifico.
  8. Por ultimo le devolvemos los datos al JqGrid.
Aquí esta el código explicado:
(isset($_REQUEST['rows']))?$_REQUEST['rows']:'',
  'page'=>(isset($_REQUEST['page']))?$_REQUEST['page']:'',
  'orderby'=>(isset($_REQUEST['sidx']))?$_REQUEST['sidx']:'',
  'orden'=>(isset($_REQUEST['sord']))?$_REQUEST['sord']:'',
  'search'=>(isset($_REQUEST['_search']))?$_REQUEST['_search']:'',
 );
 $se ="";
 //creamos la consulta de busqueda. 
 if($post['search'] == 'true'){
  $b = array();
  //Usamos la funci{on elements para crear un arreglo con los datos que van a ser para buscar por like
  $search['like']=elements(array('total','nota'),$_REQUEST);
  //haciendo un recorrido sobre ellos vamos creando al consulta.
  foreach($search['like'] as $key => $value){
   if($value != false) $b[]="$key like '%$value%'";
  }
  //Usamos la funci{on elements para crear un arreglo con los datos que van a ser para buscar por like
  $search['where']=elements(array('fecha','cantidad','taza','cliente'),$_REQUEST);
  //haciendo un recorrido sobre ellos vamos creando al consulta.
  foreach($search['where'] as $key => $value){
   if($value != false) $b[]="$key = '$value'";
  }
  //Creamos la consulta where
  $se=" where ".implode(' and ',$b );  
 }
 //Realizamos la consulta para saber el numero de filas que hay en la tabla con los filtros
 $query = mysql_query("select count(*) as t from inventario".$se);
 if(!$query)
  echo mysql_error();
 $count = mysql_result($query,0);

 if( $count > 0 && $post['limit'] > 0) {
  //Calculamos el numero de paginas que tiene el sistema
  $total_pages = ceil($count/$post['limit']);
  if ($post['page'] > $total_pages) $post['page']=$total_pages;
  //calculamos el offset para la consulta mysql.
  $post['offset']=$post['limit']*$post['page'] - $post['limit'];
 } else {
  $total_pages = 0;
  $post['page']=0;
  $post['offset']=0;
 }
 //Creamos la consulta que va a ser enviada de una ves con la parte de filtrado
 $sql = "select id, fecha, cliente, cantidad, taza, total, nota from inventario  ".$se;
 if( !empty($post['orden']) && !empty($post['orderby']))
  //Añadimos de una ves la parte de la consulta para ordenar el resultado
  $sql .= " ORDER BY $post[orderby] $post[orden] ";
 if($post['limit'] && $post['offset']) $sql.=" limit $post[offset], $post[limit]";
  //añadimos el limite para solamente sacar las filas de la apgina actual que el sistema esta consultando
  elseif($post['limit']) $sql .=" limit 0,$post[limit]";
 
  
 $query = mysql_query($sql);
 if(!$query)
  echo mysql_error();
 $result = array();
 $i = 0;
 while($row = mysql_fetch_object($query)){
   $result[$i]['id']=$row->id;
  $result[$i]['cell']=array($row->id,$row->fecha,$row->cliente,$row->cantidad,$row->taza,$row->total,$row->nota);
  $i++;
  
 }
 //Asignamos todo esto en variables de json, para enviarlo al navegador.
 
 $json = new stdClass();
 $json->rows=$result;
 $json->total=$total_pages;
 $json->page=$post['page'];

 $json->records=$count;
 echo json_encode($json);
 
 mysql_close($link);
 
 function elements($items, $array, $default = FALSE)
 {
  $return = array();
  if ( ! is_array($items)){
   $items = array($items);
  }
  foreach ($items as $item){
   if (isset($array[$item])){
    $return[$item] = $array[$item];
   }else{
    $return[$item] = $default;
   }
  }
  return $return;
 }
?>
Este es el resultado final: http://bomba1990.pythonanywhere.com/sosinformatico/js/JqGrid_Basico4
Codigo Github: https://github.com/bomba1990/JqGrid-Ejemplos/blob/master/JqGrid-Basico-4-DB.html
https://github.com/bomba1990/JqGrid-Ejemplos/blob/master/ajax.php

Suerte y espero que les sea de utilidad a todos los que lo solicitaron.

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

domingo, 28 de octubre de 2012

CSS3 Transformando elementos.


Una de las nuevas funcionalidades de css3 es que podemos transformar elementos directamente desde el css, las transformaciones que podemos hacer son: escalar, rotar, mover y deformar.

  • rotate(grados): nos permite hacer rotar elementos, en grados.
  • translate(X,Y): nos permite mover un elemento a partir de su posición original, debemos especificar cuanto se debe mover en el eje de las x y en el eje de las y. 
  • scale(x,y): nos permite modificar el tamaño de un elemento, con los argumentos que le pasemos, multiplicara el numero por el tamaño original. 
  • skew(grados-x,grados-y): el elemento se gira en un angulo dado, en función a los parámetros dados.

Soporte en los Navegadores:
Esta característica es soportada por Chrome, firefox, ie 9+, opera, pero todos con sus respectivos prefijos.

Ejemplo: http://bomba1990.pythonanywhere.com/sosinformatico/js/css3transform
GITHUB: https://github.com/bomba1990/HTML5-Ejemplos/blob/master/css3/transform.html

martes, 23 de octubre de 2012

Formularios en HTML5

En HTML5 uno de los más grandes avances que se an incluido son las nuevas características de los formularios para hacerlos más potentes y útiles para nuestras aplicaciones.



Nuevos inputs de HTML5:

El estándar html4 solo contaba con inputs de tipo text, radio, checkbox, Password, submit, reset y button, aparte de textarea, select, que son también dos tipos de elemento de formulario.

Con la llegada de HTML5, hay soporte para todos los formularios de html4, y ahora tenemos a disposición estos otros formularios:
  • Color: el input de color es usado para campos que tienen un color, lo que hace es generar el numero hexadecimal de un color que le seleccionemos de la paleta de colores. 
  • Date: permite al usuario agregar una fecha. 
  • Datetime: permite al usuario agregar fecha y hora. 
  • Email: este tipo de campo almacena lo que sería una dirección de correo. 
  • Month: es para que el usuario pueda seleccionar mes y año. 
  • Number: con este input el usuario va a colocar números pueden ser enteros o decimales 
  • Range: este tipo de formulario muestra un pequeño campo donde el usuario selección un numero de un rango. 
  • Search: es para campos de búsqueda. 
  • Tel: es para colocar números de teléfonos 
  • Time: para colocar horas y minutos. 
  • url: Para colocar direcciones web. 
  • Week: Para seleccionar semanas del año.
  •  x-webkit-speech: que es un formulario para reconocimiento de vos que solo funciona con chrome.

Los nuevos formularios por supuesto no son soportado por todos los navegadores, solo lo más modernos navegadores empiezan a añadir soporte, aquí si cabe destacar que los navegadores de los teléfonos inteligentes, están sumamente avanzado en este sentido y soportan la mayoría de los campos, inclusive mejor que los navegadores de escritorio. Y muestran un teclado de acuerdo al tipo de input, por ejemplo en tel muestra puros números.

Para los navegadores que no soportan alguno de los formularios no hay problema porque se mostraran simplemente como un tipo text, y después con librerías javascript podemos hacer que funcionen en esos navegadores donde no hay soporte nativo.

Ejemplo de todos los formularios Formularios HTML5
GIT: https://github.com/bomba1990/HTML5-Ejemplos/blob/master/form/form.html

lunes, 22 de octubre de 2012

DATALIST: HTML5 Autocomplete.


En HTML5 hay nuevas etiquetas que se an añadido para trabajar con formularios la etiqueta datalist, es una lista predefinida de opciones para un input, este elemento es usado para proveer una función de auto completado nativa para elementos de tipo input. 

<input list="navegadores">

<datalist id="navegadores ">
<option value="Internet Explorer">
<option value="Firefox">
<option value="Chrome">
<option value="Opera">
<option value="Safari">
</datalist>


Este elemento solo funciona en chrome, firefox y opera, para una lista detallada:  http://caniuse.com/datalist


OJO: esto no es como e leído en algunos libros o artículos que es para reemplazar el tipo de campo select, esto es solamente para ofrecer un autocomplete
Ejemplo: http://bomba1990.pythonanywhere.com/sosinformatico/js/datalist
GIT: https://github.com/bomba1990/HTML5-Ejemplos/blob/master/form/DATALIST.html

lunes, 15 de octubre de 2012

Joomla 3.0 Responsive Web Design

A salido la nueva versión de Joomla, la cual trae consigo muchos cambios mas que todo en el diseño. Ahora Joomla por completo a pasado a tener diseño web responsable, en este nuevo formato de Joomla ademas de tratar de ser mas amigable para el usuario también Joomla va a poder ser visualizado efectivamente desde cualquier tipo de teléfono celular inteligente o Tablet.

Entre los cambios que le hicieron están los siguientes:

  • La incorporación de Twitter Bootstrap en un paquete jui para multimedia. 
  • Una nueva plantilla para dispositivos móviles para la administración (backend) - Isis - y su interfaz. 
  • Una nueva plantilla para el sitio (frontend) - Protostar - construida usando Bootstrap de Twitter. 
  • Plantilla actualizada accesible llamada Beez3. 
  • Simplificación en 3 pasos de la instalación. 
  • Controlador PostgreSQL que permitirá ejecutar Joomla 3.0 utilizando la base de datos PostgreSQL. 
  • Controlador PHP Memcached. 
  • Uso de JFeed para la gestión de Feeds en lugar de SimplePie. 
  • La instalación de paquetes de idiomas directamente desde el gestor de extensiones. 
  • Grupo de usuarios "Invitados" está presente por defecto. 
  • Almacenamiento de artículos en blanco permitido. 
  • Nuevo módulo de estadísticas en el backend. 
  • Actualización de TinyMCE a la versión 3.5.6. 
  • Continúa la limpieza de código antiguo no utilizado, archivos y campos de la base de datos y tablas y la estandarización de tablas. 
  • Mejoras en las Búsquedas Inteligentes. 
  • Un amplio trabajo sobre la normalización de código de estilo y coherencia de este. 
  • Unidad de Pruebas en el CMS. 
  • Actualización del sistema de pruebas en el CMS. 
  • Elemento del menú activo personalizable para el módulo de menús. 
  • Permitir que el plugin SEF añada la url canónica en el encabezado. 
  • Versión 12.2 de Joomla! Platform. 
En teoría no hay ningún cambio a profundidad en el sistema como tal por lo cual deberían funcionar todos los componentes y extensiones que tuviésemos antes, pero como siempre es recomendable probar en una versión local para después subir a un servidor.

Cambios buenos para los Desarrolladores (desde mi punto de vista):

Uno de las cuestiones mas importantes para cualquier dessarrollador que trabaje con joomla, es que en esta nueva versión se incluyen los siguientes frameworks: Bootstrap y Jquery.

A Jquery no le hace falta presentación, pero Bootstrap es un framework css/javascript para el diseño o desarrollo de paginas Web responsables, lo cual quiere decir que se vean correctamente en cualquier tipo de dispositivo sin mayores cambios ni necesidad de crear una aplicación aparte.

Bootstrap framework aporta a Joomla la ventaja de tener ya una cantidad de herrameintas pre echas a nuestra mano, como css y javascripts para menus, carrusel de fotosthumbnail, etc...  sin necesidad de incluir nada externo. por ejemplo los botones e inputs ya tienen el estilo que trae bootstrap asi que ya no es necesario crear un css para el estilo de los formularios sino que el framework se encarga de ello. Esto nos puede ahorrar muchas lineas de código y ademas si seguimos los lineamientos del framework nuestro plugin, extensión o template se va a ver como es debido en cualquier tipo de dispositivo.

Ahora para incluir el framework de Bootstrap y jquery dentro de nuestro codigo debemos usar:


JHtml::_('bootstrap.framework');


Pantallas del Proceso de Instalación, en tres pasos:









Pantallas Del Front End, Movil 




 Pantallas del Backend, Login y panel de control, móvil también








jueves, 20 de septiembre de 2012

HTML5 Fullscreen (Pantalla Completa)

La nueva API de HTML5 es toda una novedad y de gran ayuda para todos aquellos que creamos aplicaciones para la web.

En este post les voy a hablar de la api HTML5 fullscreen. durante años solamente las aplicaciones creadas en flash o en java eran las únicas que tenían el poder de poder entrar en modo pantalla completa. A partir de ahora nuestras aplicaciones echas en HTML5  y javascript podrán tener esta habilidad también.

Métodos de HTML5 Fullscreen 


element.requestFullScreen: Con este método se hace que un elemento independiente entre en modo pantalla completa.
document.cancelFullScreen(): Cancela cualquier elemento que se encuentre en pantalla completa.
document.fullScreen: Retorna verdadero si hay algun elemento en pantalla completa.
:full-screen: Le da un estilo al elemento cuando esta en modo de pantalla completa.


Soporte de HTML5 Fullscreen


Actualmente hay ciertas resistencias de los creadores de los navegadores en darle completo soporte a esta api, por una cuestión de seguridad, ya que como la aplicación va a tener la posibilidad de usar la pantalla completa, se podría emular completamente el sistema operativo y de esta manera sacarle la contraseña a la persona o algo por el estilo. Hasta ahora los navegadores que soportan esta api son: Chrome 16+, Firefox 10+ y Safari.

Para poder usarlo en los diferentes navegadores hay que ponerle el prefijo de cada navegador.

Poniendo en practica el modo pantalla completa.

Para usar o activar el modo de pantalla completa les dejo aquí una función muy útil que trabaja con todos los  tipos de prefijos, no fue creada por mi sino por el autor de este articulo: html5 full screen. Pero de todas maneras aquí les dejo un ejemplo HTML5 fullscreen.
GIT: https://github.com/bomba1990/HTML5-Ejemplos/blob/master/fullscreen/fullscreen.html