Ordenar registros de una tabla con PHP y Ajax

Ordenar por columnaEn esta oportunidad realizaremos una pequeña aplicación que consistirá en ordenar los valores de una consulta de datos (MySQL) mediante hacer clic en el encabezado de la columna. Lo que vamos hacer es relativamente sencillo. Veamos.

Una idea general

Tenemos una tabla con n registros, realizamos la consulta y mediante un script en PHP nos muestra los datos en una página web. Ahora queremos agregarle funcionalidad mediante Ajax. Queremos ordenar los datos obtenidos mediante hacer clic en encabezado de cada columna. Nota: Hay que tener en cuenta que si haces clic en el encabezado de la columna, y ésta ya está ordenada descendentemente, entonces lo lógico es que sea ordenada ascendetemente, y viceversa.

[Ver Ejemplo]

Empezemos

Trabajaremos con una tabla que contiene datos de empleados como su nombre, area donde trabaja y sueldo. [Ver tabla]

Realizaremos un script que tenga los datos de la conexión a nuestra base de datos MySQL. (Estos valores deberás cambiarlos si deseas probar el ejemplo en tu servidor local)

Ver Artículo Completo ››

script.aculo.us guía rápida - Parte 2

En un artículo anterior comentamos el uso de script.aculo.us para efectos. Esta vez abordaremos el uso de los controles. Especificamente el In Place Editor Control, un control que permite la edición de su contenido y guardarse instantáneamente si lo deseamos. Para tener una idea de esto, seguramente tenemos cuenta en flickr y quizás nos hayamos dado cuenta de que podemos editar los títulos de las fotografías haciendo click sobre estos y dándonos la opción de Guardar o Cancelar la edición.

In Place Editor Control In Place Editor Control

Vamos a trabajar el guardado del texto con PHP y MySQL (aunque la idea también es útil para otros lenguajes de servidor como ASP).

[Ver Ejemplo] [Descargar]

Antes que nada descargar los archivos de script.aculo.us y vamos a necesitar 4 archivos de este paquete: prototype.js, scriptaculous.js, effects.js y controls.js.

Empezemos creando nuestra tabla, tendrá está estructura:

tabla texto

CREATE TABLE texto (
	mensaje text
)TYPE=MyISAM;
INSERT INTO texto VALUES ('Click para editar');

Ahora creamos un archivo que contendrá los datos de conexión a la Base de Datos.

conexion.php

<?php
   //Configuracion de la conexion a base de datos
   $bd_host = "localhost"; 
   $bd_usuario = "root"; 
   $bd_password = ""; 
   $bd_base = "ribosomatic"; 
   $con = mysql_connect($bd_host, $bd_usuario, $bd_password); 
   mysql_select_db($bd_base, $con); 
?>

Este archivo muestra el contenido actual de la tabla texto.

texto_actual.php

<?php
   require('conexion.php');
   $Resultado=mysql_query("SELECT * FROM texto",$con);
   $MostrarFila=mysql_fetch_array($Resultado);
   $mensaje_actual=$MostrarFila['mensaje'];
   echo $mensaje_actual;
?>

Ahora el archivo que guardará los cambios en la tabla texto. Este archivo recibe un valor a través del método POST y ese valor se almacena en la variable $mensaje. Luego hace un UPDATE a la tabla y llama al archivo texto_actual.php que mostrará el texto actualizado.

actualizar_texto.php

<?php
   require('conexion.php');
   $mensaje=$_POST['mensaje'];
   $query = "UPDATE texto SET mensaje='$mensaje'";
   $result = mysql_query($query,$con);
   include('texto_actual.php');
?>

Finalmente en un archivo al cual llamaremos edicion.php haremos lo siguiente:

  • Llamaremos a los 4 archivos de script.aculo.us
  • Colocaremos una etiqueta <strong> cuya atributo id tendrá el valor de 'editame' (puede ser cualquier etiqueta siempre y cuando tenga el atributo 'id')
  • Dentro de la etiqueta <strong></strong> incluiremos el archivo texto_actual.php, el cual mostrará el contenido de la tabla texto
  • Colocamos etiquetas <script> para llamar al control InPlaceEditor, y especificamos 3 parámetros. El primero indica el 'id' de la etiqueta HTML, en nuestro caso el id de <strong> es 'editame'; el segundo es el archivo que realiza el proceso de actualizar el contenido, en este caso actualizar_texto.php; y el tercero especificamos el nombre de la variable que será enviada para ser guardada en la tabla texto, en este caso mensaje.

Dentro de <script></script> quedaría así:

<script>
   new Ajax.InPlaceEditor($('editame'), 'actualizar_texto.php',{ callback: function(form, value) { return 'mensaje=' + escape(value) }});
</script> 

Entonces, el archivo edicion.php completo quedaría de la siguiente manera.

edicion.php

<html>
<head>
<title>Ejemplo del uso de Controles de  script.aculo.us</title><script src="js/prototype.js" type="text/javascript"></script>
<script src="js/scriptaculous.js" type="text/javascript"></script>
<script src="js/effects.js" type="text/javascript"></script>
<script src="js/controls.js" type="text/javascript"></script>

</head>
<body>

<strong id="editame">
<?php include('texto_actual.php') ?>
</strong>

<script>
 new Ajax.InPlaceEditor($('editame'), 'actualizar_texto.php',{ callback: function(form, value) { return 'mensaje=' + escape(value) }});
</script>

</body>
</html>
 

Existen otros controles que podemos usar con script.aculo.us que seguramente veremos mas adelante.

[Ver Ejemplo] [Descargar]

Paginar consultas con MySQL, PHP y Ajax

Si desemos paginar los resultados de una consulta, podemos hacerlo con PHP y quedaría excelente, por ejemplo en la Portada de este Blog, en la parte final, se puede apreciar un ejemplo en acción. Sin embargo, si queremos que al momento de pasar de una página a otra no recarge toda la página sino solo el contenido que nos interesa. Para ello podemos hacer uso de Ajax.

Por ejemplo, nuestra tabla Empleados tiene como 150 registros, pero cargar esos 150 en una página web tomaría su tiempo. Así que es mejor si los mostramos por páginas o bloques de 10 registros (por ejemplo) , y colocamos el número de páginas en forma de enlaces para navegar por los todas las páginas. En el caso del ejemplo, sería algo de 15 páginas (150/10). Vamos a materializar nuestro aplicación, haciendo uso del lenguaje PHP, MySQL como gestor de Base de Datos y Ajax. Explicaré el objetivo que tiene cada archivo, aunque también incluyo comentarios en los script como para que se entienda mejor. Cualquier duda o pregunta, pueden hacerla con toda confianza.

[Ver el resultado final]

Vamos a trabajar con la tabla Empleados, la cual hemos venido usando en anteriores ejemplos. [Ver Tabla]. Los datos de la conexión a la Base de Datos se guardarán en el archivo conexion.php.

<?php
//Configuracion de la conexion a base de datos
$bd_host = "miservidor"; 
$bd_usuario = "miusuario"; 
$bd_password = "micontraseña"; 
$bd_base = "mibasededatos"; 
$con = mysql_connect($bd_host, $bd_usuario, $bd_password); 
mysql_select_db($bd_base, $con); 
?>

Ahora en un archivo JavaScript, el cual llamaremos ajax.js hacemos uso del objeto XMLHttpRequest para hacer peticiones al servidor sin necesidad de recargar toda una página web (está función hemos venido usandola en anteriores tutoriales). También, crearemos la función llamada Pagina(nroPagina), esta recibirá un valor correspondiente a un número de página y se enlazará con el archivo paginador.php para procesar ese número de página. Y el resultado se mostrará en la capa (<div>) "contenido".

function objetoAjax(){
 var xmlhttp=false;
  try{
   xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  }catch(e){
   try {
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
   }catch(E){
    xmlhttp = false;
   }
  }
  if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
   xmlhttp = new XMLHttpRequest();
  }
  return xmlhttp;
}

function Pagina(nropagina){
 //donde se mostrará los registros
 divContenido = document.getElementById('contenido');
 
 ajax=objetoAjax();
 //uso del medoto GET
 //indicamos el archivo que realizará el proceso de paginar
 //junto con un valor que representa el nro de pagina
 ajax.open("GET", "paginador.php?pag="+nropagina);
 divContenido.innerHTML= '<img src="anim.gif">';
 ajax.onreadystatechange=function() {
  if (ajax.readyState==4) {
   //mostrar resultados en esta capa
   divContenido.innerHTML = ajax.responseText
  }
 }
 //como hacemos uso del metodo GET
 //colocamos null ya que enviamos 
 //el valor por la url ?pag=nropagina
 ajax.send(null)
}

El archivo principal de este proceso es paginador.php, este archivo es el encargado de mostrar los registros dependiendo de la página elegida. Describiré los procesos de manera que sea entendible, de todas maneras pueden preguntar por medio del formulario de comentarios:

  • Antes que nada, hacer un require del archivo de conexión a la Base de Datos (conexion.php).
  • Específicamos qué cantidad de registros se mostrarán por página ($RegistrosAMostrar). Pueden cambiar este valor por el que deseen, y el número de páginas se adecuará a ello. Pero para nuestro ejemplo mostraremos 4 registros por página.
  • En el if verificamos la variable $_GET['pag'], si está definida hacemos uso de dos variables: $RegistroAEmpezar que será la variable $_GET['pag'] menos 1 multiplicado por la cantidad de registros a mostrar (Ejm. Elegimos Pagina 5, 5 menos 1 igual 4, 4 multiplicado por 3 igual 12, a partir del registro 12 se empezaría a mostrar la consulta en la página 5), y $PagAct tendrá el valor de la variable $_GET['pag']. En el caso de que las variables no estén definidas las variables $RegistroAEmpezar y $PagAct tendrán el valor de 0 y 1 respectivamente.
  • Luego realizamos una consulta SELECT y usamos LIMIT con valores de las variables $RegistroAEmpezar y $RegistrosAMostrar y en una tabla HTML mostramos los resultados.
  • Realizamos un proceso para determinar el número de páginas dependiendo de la cantidad registros de la tabla ($NroRegistros) y de los registros a mostrar ($RegistrosAMostrar). El proceso lo he comentado en el script para que se entienda mejor.
  • Finalmente especificamos enlaces de navegación (Primero, Anterior, Siguiente, Último), cada uno de estos enlaces hará una llamada a la función JavaScript Pagina(nropagina).
<?php
 require('conexion.php');
 $RegistrosAMostrar=4;

 //estos valores los recibo por GET
 if(isset($_GET['pag'])){
  $RegistrosAEmpezar=($_GET['pag']-1)*$RegistrosAMostrar;
  $PagAct=$_GET['pag'];
  //caso contrario los iniciamos
 }else{
  $RegistrosAEmpezar=0;
  $PagAct=1;
 }

 $Resultado=mysql_query("SELECT * FROM empleado ORDER BY nombres LIMIT $RegistrosAEmpezar, $RegistrosAMostrar",$con);
 echo "<table border='1px'>";
 while($MostrarFila=mysql_fetch_array($Resultado)){
  echo "<tr>";
  echo "<td>".$MostrarFila['nombres']."</td>";
  echo "<td>".$MostrarFila['departamento']."</td>";
  echo "<td>".$MostrarFila['sueldo']."</td>";
  echo "</tr>";
 }
 echo "</table>";

 //******--------determinar las páginas---------******//
 $NroRegistros=mysql_num_rows(mysql_query("SELECT * FROM empleado",$con));
 $PagAnt=$PagAct-1;
 $PagSig=$PagAct+1;
 $PagUlt=$NroRegistros/$RegistrosAMostrar;

 //verificamos residuo para ver si llevará decimales
 $Res=$NroRegistros%$RegistrosAMostrar;
 // si hay residuo usamos funcion floor para que me
 // devuelva la parte entera, SIN REDONDEAR, y le sumamos
 // una unidad para obtener la ultima pagina
 if($Res>0) $PagUlt=floor($PagUlt)+1;
 
 //desplazamiento
 echo "<a onclick="Pagina('1')">Primero</a> ";
 if($PagAct>1) echo "<a onclick="Pagina('$PagAnt')">Anterior</a> ";
 echo "<strong>Pagina ".$PagAct."/".$PagUlt."</strong>";
 if($PagAct<$PagUlt)  echo " <a onclick="Pagina('$PagSig')">Siguiente</a> ";
 echo "<a onclick="Pagina('$PagUlt')">Ultimo</a>";
?>

El archivo index.php tendrá un tabla HTML con tres columnas (Nombres, Departamento, Sueldo) y un capa (<div>) llamado "contenido" dentro de la cual haremos un include del archivo paginador.php.

<html>
<head>
<title>Paginar Resultados</title>
<script type="text/javascript" src="ajax.js"></script>
<style>
td{
 width:200px;
}
a{
 text-decoration:underline;
 cursor:pointer;
}
</style>
</head>
<body>
<div style="margin:auto;width:500px;text-align:center;">
 <table border="1px">
  <tr>
   <td>Nombres</td>
   <td>Departamento</td>
   <td>Sueldo</td>
  </tr>
 </table>
 <div id="contenido">
  <?php include('paginador.php')?>
 </div>
</div>
</body>
</html>

Esta es una manera organizada de mostrar nuestras consultas de una Base de Datos. Cualquier duda, consulta, crítica constructiva abajo en sus comentarios. [Ver el resultado final]

Enlaces a Tutoriales y Manuales Prácticos

En esta oportunidad compartire algunos enlaces que me han sido muy útiles al momento de desarrollar aplicaciones web o simplemente para aprender sobre algunos lenguajes (tutoriales, manuales) que no conocía, espero que también les puedan resultar útil:

JavaScript

Aunque está en inglés, los ejemplos lo dicen todo.

http://home.cogeco.ca/~ve3ll/jstutor0.htm

Esto si está en español, explicación de los objetos y métodos y muchos ejemplos:

http://gollum.inforg.uniovi.es/aii/ejemplos.php?id_codigo=3&codigo=JavaScript

Diseño Gráfico

Manual que explica como usar esta herramienta libre: GIMP.

http://mosaic.uoc.edu/pdf/manual_introduccion_gimp.pdf

AJAX

Para dar nuestros primeros pasos en AJAX.

http://developer.mozilla.org/es/docs/AJAX:Primeros_Pasos

Explicación detalla del objeto XMLHttpRequest.

http://www.programacionweb.net/cursos/curso.php?num=2

PHP y MySQL

Un manual muy interesante

http://es.tldp.org/Manuales-LuCAS/manual_PHP/manual_PHP/index.htm

Lenguajes de Programación Orientado a Objetos

Aprendiendo C++ en 21 días (en inglés)

http://newdata.box.sk/bx/c/

Aprende a Programar en Python

http://pyspanishdoc.sourceforge.net/

Este lenguaje si que está bueno: Ruby.

http://es.tldp.org/Manuales-LuCAS/doc-guia-usuario-ruby/doc-guia-usuario-ruby-html/

Y tu ¿qué enlaces prácticos compartirías?

Eliminar Datos con AJAX y POO en PHP

Veremos el artículo final de esta serie de artículos relacionados con AJAX y Clases con PHP: Eliminar datos de la tabla Empleados, empezemos entonces:

Agregando un nuevo método

Trabajaremos con la misma Clase cEmpleado que se encuentra en el archivo cEmpleado.php, pero agregaremos un método más: eliminar(), que acepta como parámetro el Codigo del Empleado. Esto con el objetivo de eliminar un solo dato, el que nosotros especificaremos. No mostraremos todo el código del archivo cEmpleado.php, solo el método que vamos a agregar:

//elimina un empleado en la base de datos
function eliminar($cod){
 $con = new DBManager;
 if($con->conectar()==true){
  $query = "DELETE FROM empleados WHERE idempleado=$cod";
  $result = @mysql_query($query);
  if (!$result)
   return false;
  else
   return true;
  }
}

Consultando datos

Ahora realizaremos una consulta de todos los empleados y los listaremos haciendo uso de una tabla HTML. Los elementos de la columna Dato tienen dentro de la etiqueta <a></a> el evento onclick especificamos la función eliminarDato(parametro), donde parametro es el código del empleado. Esta función JavaScript se encargará en enviar el código al archivo que realizará el proceso de eliminación. Está función la describeremos mas adelante. A este archivo de consulta lo llamamos consulta.php.

<?php
 include_once("cEmpleado.php");
 
 //consulta todos los empleados
 $objempleado = new cEmpleado;
 $consulta=$objempleado->consultar();

 //muestra los datos consultados
 //haremos uso de tabla para tabular los resultados
?>
<table style="border:1px solid #FF0000; color:#000099;width:400px;">
<tr style="background:#99CCCC;">
<td>Codigo</td>
<td>Nombres</td>
<td>Departamento</td>
<td>Sueldo</td>
</tr>
<?php
 while($row=mysql_fetch_array($consulta)){
  echo "<tr>";
 
  //mediante el evento onclick llamaremos a la funcion PedirDatos(), la cual tiene como parametro
  //de entrada el ID del empleado
  echo "<td><a style="text-decoration:underline;cursor:pointer;" onclick="eliminarDato('".$row['idempleado']."')">".$row['idempleado']."</a></td>";
  echo "<td>".$row['nombres']."</td>";
  echo "<td>".$row['departamento']."</td>";
  echo "<td>".$row['sueldo']."</td>";
  echo "</tr>";
 }
?>
</table>

Proceso Principal

Este es el archivo que realizará el proceso de eliminación. Creamos el objeto a partir de la Clase y hacemos uso del método eliminar() donde, como parametro, especificamos el código del empleado. Este valor lo recibimos mediante el método GET el cual la función JavaScript eliminarDato() nos enviará. Este archivo, eliminacion.php, queda así:

<?php
 include_once("cEmpleado.php");

 //variable GET
 $idemp=$_GET['idempleado'];
 sleep(2);

 //creamos el objeto $objempleados
 //y usamos su método eliminar
 $objempleados=new cEmpleado;
 if ($objempleados->eliminar($idemp)==true){
  echo "Registro eliminado correctamente";
 }else{
  echo "Ocurrio un error";
 }
 include('consulta.php');
?>

Funciones en JavaScript

En este archivo, ajax.js, irán dos funciones: 1) la que siempre hemos usado en estos tutoriales, que sirve para usar el objeto XMLHttpRequest y 2) la función de la que hemos venido hablando antes eliminarDato(), que se encargará de enviar el código del empleado para que el archivo eliminacion.php se encarge de eliminarlo.

function objetoAjax(){
 var xmlhttp=false;
 try{
  xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
 } catch(e){
  try{
   xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  } catch(E){
   xmlhttp = false;
  }
 }
 if(!xmlhttp && typeof XMLHttpRequest!='undefined') {
  xmlhttp = new XMLHttpRequest();
 }
 return xmlhttp;
}

function eliminarDato(idempleado){
 //donde se mostrará el resultado de la eliminacion
 divResultado = document.getElementById('resultado');
 
 //usaremos un cuadro de confirmacion 
 var eliminar = confirm("De verdad desea eliminar este dato?")
 if ( eliminar ) {

  //instanciamos el objetoAjax
  ajax=objetoAjax();

  //uso del medoto GET
  //indicamos el archivo que realizará el proceso de eliminación
  //junto con un valor que representa el id del empleado
  ajax.open("GET", "eliminacion.php?idempleado="+idempleado);
  divResultado.innerHTML= '<img src="anim.gif">';
  ajax.onreadystatechange=function() {
   if (ajax.readyState==4) {
    //mostrar resultados en esta capa
    divResultado.innerHTML = ajax.responseText
   }
  }
  //como hacemos uso del metodo GET
  //colocamos null
  ajax.send(null)
 }
}

Finalmente...

En el archivo index.php incluimos el archivo JavaScript que usaremos y colocaremos dentro de las etiquetas <div id="resultado"></div> un include al archivo consulta.php. Esto con el fin de cuando empezemos a ejecutar nuestra aplicación se muestren todos los empleados.

<html>
<head>
<title>Eliminacion de registros con AJAX</title>
<script type="text/javascript" src="ajax.js"></script>
</head>
<body>
<h2>Eliminar registros de la tabla empleado</h2>
<p>Clic en el c&oacute;digo del empleado para eliminar el registro. </p>
<div id="resultado">
<?php
 include('consulta.php');
?>
</div>
</body>
</html>

Así terminamos 4 artículos relacionados con los procesos principales a una Tabla en una Base de Datos: Consultar, Insertar, Actualizar y Eliminar registros. Y todos estos trabajado con Clases, una buena práctica que todo programador debe tener en cuenta al desarrollar sus aplicaciones. Pueden ver el ejemplo final o descargar los archivos para que los prueben en su servidor local.

Un agradecimiento de parte de Jesús Liñán (jesusvld) a Javier Luna por la ayuda en la publicación de estos prácticos Artículos y Ejemplos.

Actualización de Datos con AJAX y POO con PHP

Siguiendo con el tema de Programación Orientada a Objetos en PHP y AJAX, nos toca ahora abordar el tema de Actualización de Datos (UPDATE SET ...) . Hemos venido recalcando y enfatizando que programar así nos ahorra tiempo y mucho código, y permite que nuestro código esté disponible para otros desarrollos.

Empezemos

Hacemos uso de la tabla Empleado, cuya estructura está en el primer artículo de esta serie de artículos, y también usamos la clase DBManager que se encuentra en el archivo DBManager.php.

Nuevamente vamos a agregar algunas funcionalidades a la Clase cEmpleado que se encuentra en el archivo cEmpleado.php. Primero, agregamos el método actualizar() que aceptará parámetros de entrada relacionados con los datos del Empleado, como son: CodEmpleado, Nombre, Departamento, Sueldo. Esta vez si incluimos en los parámetros el CodEmpleado pues cuando hagamos un UPDATE a la tabla Empleado debemos especificar el ID del registro. Luego agregamos el método consultarid() que aceptará como parámetro de entrada el Codigo del Empleado. Veamos como queda el archivo:

<?php 
 //referenciamos la clase DBManager
 include_once("DBManager.php");

 //implementamos la clase empleado
 class cEmpleado{
  //constructor 
  function cEmpleado(){
  } 
 
  // consulta los empledos de la BD
  function consultar(){
   //creamos el objeto $con a partir de la clase DBManager
   $con = new DBManager;
   //usamos el metodo conectar para realizar la conexion
   if($con->conectar()==true){
    $query = "select * from empleados order by nombres";
    $result = @mysql_query($query);
    if (!$result)
     return false;
    else
     return $result;
   }
  }

  //inserta un nuevo empleado en la base de datos
  function crear($nom,$dep,$suel){
   $con = new DBManager;
   if($con->conectar()==true){
    $query = "INSERT INTO empleados (nombres, departamento, sueldo) 
    VALUES ('$nom','$dep',$suel)";
    $result = @mysql_query($query);
    if (!$result)
     return false;
    else
     return true;
   }
  }

  // actualizar un nuevo empleado en la base de datos
  function actualizar($cod,$nom,$dep,$suel){
   $con = new DBManager;
   if($con->conectar()==true) {
    $query = "UPDATE empleados SET nombres='$nom', departamento='$dep', sueldo='$suel' 
    WHERE idempleado=$cod";
    $result = mysql_query($query);
    if (!$result)
     return false;
    else
     return true;
   }
  }

  // consulta empleado por su codigo
  function consultarid($cod){
   $con = new DBManager;
   if($con->conectar()==true){
    $query = "SELECT * FROM empleados WHERE idempleado=$cod";
    $result = @mysql_query($query);
    if (!$result)
     return false;
    else
     return $result;
   }
  }
 }
?>

Un par de consultas

Vamos a crear dos archivos: 1) para la consulta de todos los empleados y 2) para la consulta de un empleado en particular. Empezemos con el primero, al cual llamaremos consulta.php. Notemos que en cada celda de la primera columna, donde va el Codigo del empleado, los elementos hacen referencia a la función JavaScript PedirDatos() que recibe como parámetro el ID del empleado, los detalles de esta función aparecen mas abajo.

<?php
include_once("cEmpleado.php");

//creamos objeto
$objempleado = new cEmpleado;
$consulta=$objempleado->consultar();

//muestra los datos consultados
//haremos uso de tabla para tabular los resultados
?>
<table style="border:1px solid #FF0000; color:#000099;width:400px;">
<tr style="background:#99CCCC;">
<td>Codigo</td>
<td>Nombres</td>
<td>Departamento</td>
<td>Sueldo</td>
</tr>
<?php
while($row=mysql_fetch_array($consulta)){
   echo "<tr>";
   //mediante el evento onclick llamaremos a la funcion PedirDatos(), la cual tiene como parametro
   //de entrada el ID del empleado
   echo "<td><a style="text-decoration:underline;cursor:pointer;" onclick="pedirDatos('".$row['idempleado']."')">".$row['idempleado']."</a></td>";
   echo "<td>".$row['nombres']."</td>";
   echo "<td>".$row['departamento']."</td>";
   echo "<td>".$row['sueldo']."</td>";
   echo "</tr>";
}
?>
</table>

Ahora el segundo archivo, que realiza un consulta de un empleado en particular según su código o ID y lo muestra en un formulario, a este archivo le llamaremos consulta_por_id.php:

<?php
 include_once("cEmpleado.php");

 //capturamos el valor del id del empleado
 $idemp=$_POST['idemp'];

 //creamos el objeto
 $objempleado = new cEmpleado;
 $consulta=$objempleado->consultarid($idemp);
 $row = mysql_fetch_array($consulta);

 //valores de las consultas
 $nom=$row['nombres'];
 $dep=$row['departamento'];
 $suel=$row['sueldo'];

 //muestra los datos consultados en los campos del formulario
?>
 <form name="frmempleado" action="" 
 onsubmit="enviarDatosEmpleado(); return false">
 <input name="idempleado" type="hidden" value="<?php echo $idemp; ?>" />
 <p>Nombres 
  <input name="nombres" type="text" value="<?php echo $nom; ?>" />
 </p>
 <p>Departamento 
  <select name="departamento">
<?php
 echo "<option value="".$dep."">".$dep."</option>"
?>
   <option value="Informatica">Informatica</option>
   <option value="Contabilidad">Contabilidad</option>
   <option value="Administracion">Administracion</option>
   <option value="Logistica">Logistica</option>
  </select>
 </p>
 <p>Sueldo <strong>S/.</strong>
  <input name="sueldo" type="text" value="<?php echo $suel; ?>" />
 </p>
 <p>
  <input type="submit" name="Submit" value="Actualizar" />
 </p>
</form>

Proceso principal

El archivo que realizará el proceso de recibir los datos y realizar la actualización será: actualizacion.php.

<?php
 include_once("cEmpleado.php");
 
 //variables POST
 $idemp=$_POST['idempleado'];
 $nom=$_POST['nombres'];
 $dep=$_POST['departamento'];
 $suel=$_POST['sueldo'];
 sleep(2);

 //actualiza los datos del empleados
 $objempleado = new cEmpleado;
 if ($objempleado->actualizar($idemp,$nom,$dep,$suel)==true){
  echo "Datos Actualizados";
 }else{
  echo "No se pudo actualizar";
 }
 include('consulta.php');
?>

Funciones en JavaScript

Especificaremos 3 funciones: 1) una que se encargue del objeto XMLHttpRequest, 2) otra que envie los datos que serán actualizados y 3) otra que consulte los datos de un empleado en particular y los muestre en un formulario. Este archivo se llama ajax.js.

function objetoAjax(){
 var xmlhttp=false;
 try{
  xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
 }catch(e){
  try{
   xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  }catch(E){
   xmlhttp = false;
  }
 }
 if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
  xmlhttp = new XMLHttpRequest();
 }
 return xmlhttp;
}

function enviarDatosEmpleado(){
 //donde se mostrará lo resultados
 divResultado = document.getElementById('resultado');
 divFormulario = document.getElementById('formulario');
 divResultado.innerHTML= '<img src="anim.gif">';
 
 //valores de los cajas de texto
 id=document.frmempleado.idempleado.value;
 nom=document.frmempleado.nombres.value;
 dep=document.frmempleado.departamento.value;
 suel=document.frmempleado.sueldo.value;
 
 //instanciamos el objetoAjax
 ajax=objetoAjax();
 //usando del medoto POST
 //archivo que realizará la operacion ->actualizacion.php
 ajax.open("POST", "actualizacion.php",true);
 ajax.onreadystatechange=function() {
  if (ajax.readyState==4) {
   //mostrar los nuevos registros en esta capa
   divResultado.innerHTML = ajax.responseText
   //una vez actualizacion ocultamos formulario
   divFormulario.style.display="none";
  }
 }
 //muy importante este encabezado ya que hacemos uso de un formulario
 ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
 //enviando los valores
 ajax.send("idempleado="+id+"&nombres="+nom+"&departamento="+dep+"&sueldo="+suel)
}

function pedirDatos(idempleado){
 //donde se mostrará el formulario con los datos
 divFormulario = document.getElementById('formulario');
 
 //instanciamos el objetoAjax
 ajax=objetoAjax();
 //uso del medotod POST
 ajax.open("POST", "consulta_por_id.php");
 ajax.onreadystatechange=function() {
  if (ajax.readyState==4) {
   //mostrar resultados en esta capa
   divFormulario.innerHTML = ajax.responseText
   divFormulario.style.display="block";
  }
 }
 //como hacemos uso del metodo POST
 ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
 //enviando el codigo del empleado
 ajax.send("idemp="+idempleado)
}

Finalmente ....

El archivo index.php hace referencia al archivo JavaScript que vamos a usar: ajax.js. Dentro de las etiquetas <div id="formulario"></div> aparecerá un formulario con los datos del empleado. Mas abajo dentro de las etiquetas <div id="resultado"></div> hace un include a consulta.php el cual nos listará todos empleados.

<html>
<head>
<title>Actualizacion con AJAX</title>
<script type="text/javascript" src="ajax.js"></script>
</head>
<body>
<h2>Modificar datos del empleado</h2>
<p>Clic en el c&oacute;digo del empleado para modificar sus datos. </p>
<div id="formulario">
</div>
<div id="resultado"><?php include('consulta.php');?></div>
</body>
</html>

Queremos resaltar que nuestra Clase cEmpleado tiene 2 métodos más y hemos agregado estos sin alterar nada de los otros 2 métodos que ya estaban allí, realmente estamos reutilizando nuestro código. Puede ver el ejemplo en ejecución y/o descargar los archivos que usamos para el proceso de Actualización. Próximo artículo Eliminar datos.

Inserción de Datos con AJAX y POO con PHP

Siguiendo con el tema de Programación Orientada a Objetos en PHP y AJAX, nos toca ahora abordar el tema de Registro de Datos (INSERT INTO ...) . Como ya hemos mencionado son ejemplos prácticos que ya tocamos anteriormente pero en esta oportunidad los trabajaremos con Clases en PHP. El objetivo es demostrar que trabajar de esa forma ahorra tiempo y hace nuestro código reutilizable, y si queremos agregar algunos procesos a nuestras clases no se altera (casi nada) el resto de procesos.

Empezemos entonces

Tenemos la tabla Empleado, cuya estructura se mostró en el artículo anterior. También disponemos de la Clase DBManager que se encuentra en el archivo DBManager.php, esta Clase la vamos a usar nuevamente para verificar y realizar la conexión a la Base de Datos.

La Clase cEmpleado se encuentra en el archivo cEmpleado.php, a esta Clase vamos agregarle un método para que guarde un nuevo registro en la tabla Empleado. A este método lo llamaremos crear() el cual tendrá como parámetros de entrada los datos que se requiere del empleado: Nombre, Departamento, Sueldo. Hay que tener en cuenta que el campo idempleado incrementa automáticamente, por ello no lo incluimos dentro de los parámetros.

Veamos como quedaría este método en el archivo cEmpleado.php:

<?php 
 include_once("DBManager.php");

 //implementamos la clase empleado
 class cEmpleado{

  //constructor 
  function cEmpleado(){
  }
 
  // consulta los empledos de la BD
  function consultar(){
   //creamos el objeto $con a partir de la clase DBManager
   $con = new DBManager;
   //usamos el metodo conectar para realizar la conexion
   if($con->conectar()==true){
    $query = "select * from empleados order by nombres";
    $result = @mysql_query($query);
    if (!$result)
     return false;
    else
     return $result;
   }
  }

  //* inserta un nuevo empleado en la base de datos *//
  function crear($nom,$dep,$suel){
   $con = new DBManager;
   if($con->conectar()==true){
    $query = "INSERT INTO empleados (nombres, departamento, sueldo) 
    VALUES ('$nom','$dep',$suel)";
    $result = mysql_query($query);
    if (!$result)
     return false;
    else
     return true;
   }
  }

 }
?>

Ya tenemos la Clase cEmpleado con su nuevo método listo para ser usado en cualquier momento. Ahora continuando con el desarrollo vamos a listar todos los empleados de la tabla Empleados. A este archivo lo llamamos consulta.php y va usar las clase cEmpleado. Esta vez vamos a listar los resultados en una tabla HTML. Veamos:

<?php
 include_once("cEmpleado.php");

 //creamos el objeto $objempleados de la clase cEmpleado
 $objempleados=new cEmpleado;

 //la variable $lista consulta todos los empleados
 $lista= $objempleados->consultar();
?>
<table style="border:1px solid #FF0000; color:#000099;width:400px;">
<tr style="background:#99CCCC;">
<td>Nombres</td>
<td>Departamento</td>
<td>Sueldo</td>
</tr>
<?php
 while($row = mysql_fetch_array($lista)){
  echo "<tr>";
  echo "<td>".$row['nombres']."</td>";
  echo "<td>".$row['departamento']."</td>";
  echo "<td>".$row['sueldo']."</td>";
  echo "</tr>";
 }
?>
</table>

Veamos ahora, el proceso de guardado o inserción de los datos en la tabla Empleado, vamos a llamar a este archivo registro.php y notemos que se crea un objeto de la clase cEmpleado y usamos el método crear() donde especificamos los parámetros requeridos. Al final hace un include al archivo consulta.php para listar los nuevos datos.

<?php
 include_once("cEmpleado.php");
 
 //variables POST
 $nom=$_POST['nombres'];
 $dep=$_POST['departamento'];
 $suel=$_POST['sueldo'];
 sleep(2);

 //creamos el objeto $objempleados
 //y usamos su método crear
 $objempleados=new cEmpleado;
 if ($objempleados->crear($nom,$dep,$suel)==true){
  echo "Registro grabado correctamente";
 }else{
  echo "Error de grabacion";
 }
 include('consulta.php');
?>

Ahora las funciones en JavaScript, creamos 3 funciones: 1) para crear el objeto XMLHttpRequest, 2) para enviar y recibir los datos del empleado para que sean guardados en la tabla Empleado y 3) para limpiar las cajas de texto del formulario. El archivo ajax.js va así:

function objetoAjax(){
 var xmlhttp=false;
 try {
  xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
 } catch (e) {
  try {
   xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  } catch (E) {
   xmlhttp = false;
  }
 }
 if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
  xmlhttp = new XMLHttpRequest();
 }
 return xmlhttp;
}

function enviarDatosEmpleado(){
 //donde se mostrará lo resultados
 divResultado = document.getElementById('resultado');
 divResultado.innerHTML= '<img src="anim.gif">';
 
 //valores de las cajas de texto 
 nom=document.nuevo_empleado.nombres.value;
 dep=document.nuevo_empleado.departamento.value;
 suel=document.nuevo_empleado.sueldo.value;
 
 //instanciamos el objetoAjax
 ajax=objetoAjax();

 //uso del medoto POST 
 //archivo que realizará la operacion
 //registro.php
 ajax.open("POST", "registro.php",true);
 ajax.onreadystatechange=function() {
  if (ajax.readyState==4) {
   //mostrar resultados en esta capa
   divResultado.innerHTML = ajax.responseText

   //llamar a funcion para limpiar los inputs
   LimpiarCampos();
  }
 }
 ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

 //enviando los valores
 ajax.send("nombres="+nom+"&departamento="+dep+"&sueldo="+suel)
}

//limpiando las cajas de texto
function LimpiarCampos(){
 document.nuevo_empleado.nombres.value="";
 document.nuevo_empleado.departamento.value="";
 document.nuevo_empleado.sueldo.value="";
 document.nuevo_empleado.nombres.focus();
}

Finalmente, el archivo index.php que contendrá un formulario con caja de texto para escribir los datos del empleado y una lista de los empleados registrado. Una vez que pulsamos el botón Grabar, los datos se guardarán en la tabla Empleado y la lista se actualizará automaticamente. Dentro de las etiquetas <head></head> hacemos referencia al archivo ajax.js, en el atributo onsubmit de la etiqueta <form> especificamos la función enviarDatosEmpleado() y en la dentro de las etiquetas <div id="resultado"></div> en la parte final hacemos un include al archivo consulta.php. El archivo quedaría así:

<html>
<head>
<title>Registro con AJAX</title>
<script language="JavaScript" type="text/javascript" src="ajax.js"></script>
</head>
<body>
<form name="nuevo_empleado" action="" onSubmit="enviarDatosEmpleado(); return false">
<h2>Nuevo empleado</h2>
<p>Nombres 
<label>
<input name="nombres" type="text" />
</label>
</p>
<p>Departamento 
<label>
<select name="departamento">
<option value="Informatica">Informatica</option>
<option value="Contabilidad">Contabilidad</option>
<option value="Administracion">Administracion</option>
<option value="Logistica">Logistica</option>
</select>
</label>
</p>
<p>Sueldo <strong>S/.</strong>
<label>
<input name="sueldo" type="text" />
</label>
</p>
<p>
<label>
<input type="submit" name="Submit" value="Grabar" />
</label>
</p>
</form>
<div id="resultado"><?php include('consulta.php');?></div>
</body>
</html>

Se habrá dado cuenta que hemos incluido un método a la clase cEmpleado y ello sin alterar el método anterior. Incluso hemos usado el método consultar() que ya estaba allí. Esta Clase irá ampliandose en los próximos artículos. Esto nos hace ver que si programamos Orientando a Objetos, nuestro código se hace flexible y reutilizable. El próximo artículo tratará la Actualizacion de datos. El ejemplo final y los archivos para descarga están disponibles.

Consulta de Datos con AJAX + Clases en PHP

Hablar de Programación Orientada a Objetos (POO) es hablar de clases (y otras funcionalidades) que nos permite escribir código flexible y sobre todo reutilizable. Para muchos resulta dificultoso y tedioso, pero una vez construida nuestra clase podemos hacer uso de ella para cualquier otro desarrollo. Los lenguajes actuales implementan el desarrollo con POO y PHP no se podia quedar atrás (aunque en lo personal no sé si implementa todas las caracteristicas de la POO).

En esta oportunidad, vamos a ver como usar POO en los ejemplos anteriores de AJAX+PHP, en este caso Consulta de datos. Empezemos:

Tabla Empleado en MySQL

CREATE TABLE empleados ( 
 idempleado int NOT NULL auto_increment,
 nombres varchar(32) NOT NULL,
 departamento varchar(40)NOT NULL,
 sueldo double,
 KEY id(idempleado)
)TYPE=MyISAM;


INSERT INTO empleados VALUES (1, 'Juan Perez', 'Informatica',500.00);
INSERT INTO empleados VALUES (2, 'Laura Morales', 'Contabilidad',550.00);
INSERT INTO empleados VALUES (3, 'Luis Gutierrez', 'Administracion',850.00);
INSERT INTO empleados VALUES (4, 'Pedro Solar', 'Informatica',500.00);
INSERT INTO empleados VALUES (5, 'David Vilchez', 'Contabilidad',550.00); 

Creando Clases y Métodos

Creamos una Clase para la conexión con la Base de Datos, el método conectar() se encargará de verificar y realizar la conexión con la base de datos. A este archivo lo llamamos DBManager.php .

<?php 
 //esta clase nos permitira conectarnos a la base de datos
 class DBManager{
  var $conect;
  //Método constructor
  function DBManager(){
  }
  //Método que se encargará de la verificar y realizar
  //la conexión
  function conectar() {
   if(!($con=@mysql_connect("localhost","root",""))){
    echo"Error al conectar a la base de datos"; 
    exit();
   }
   if (!@mysql_select_db("ribosomatic",$con)) {
    echo "Error al seleccionar la base de datos"; 
    exit();
   }
   $this->conect=$con;
   return true; 
  }
 }
?>

Creamos una Clase para los procesos relacionados con el Empleado, como por ejemplo: Consultar sus datos. Para ello el método consultar()realizará este proceso . Previamente, hacemos referencia al archivo BDManager.php para realizar la conexión. A este archivo de la Clase Empleado lo llamaremos cEmpleado.php .

<?php 
 include_once("DBManager.php");
 //implementamos la clase empleado
 class cEmpleado{

  //constructor 
  function cEmpleado(){
  }

  // consulta los empledos de la BD
  function consultar(){
   //creamos el objeto $con a partir de la clase DBManager
   $con = new DBManager;
   //usamos el metodo conectar para realizar la conexion
   if($con->conectar()==true){
    $query = "select * from empleados order by nombres";
    $result = @mysql_query($query);
    if (!$result)
     return false;
    else
     return $result;
   }
  }

 }
?>

El resto es lo mismo, pero....

Ahora realizamos una consulta a los datos, referenciamos al archivo cEmpleado.php que contiene la Clase cEmpleado. Creamos el objeto $objempleados y usamos el método consultar() para que la consulta de los datos, y luego mediante un bucle listamos los datos. Este archivo lo llamamos consulta.php.

<?php
 include_once("cEmpleado.php");
 //Sleep deja inactivo el script por n segundos
 //n es un parametro, en el ejemplo 1 segundo
 //esto para poder apreciar el gif animado
 sleep(1);
 //creamos el objeto $objempleados de la clase cEmpleado
 $objempleados=new cEmpleado;
 //la variable $lista consulta todos los empleados
 $consulta= $objempleados->consultar();
 //muestra los datos consultados
 echo "</p>Nombres - Departamento - Sueldo</p> n";
 while($row = mysql_fetch_array($consulta)){
  echo "<p>".$row['nombres']." - ".$row['departamento']." - ".$row['sueldo']."</p> n";
 }
?>

Ahora las funciones JavaScript, entre ellas la que crea el objeto XMLHttpRequest para trabajar con AJAX. Este archivo se llama ajax.js .

function objetoAjax(){
 var xmlhttp=false;
 try {
  xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
 } catch (e) {
  try {
   xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  } catch (E) {
   xmlhttp = false;
  }
 }
 if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
  xmlhttp = new XMLHttpRequest();
 }
 return xmlhttp;
}

function MostrarConsulta(datos){
 divResultado = document.getElementById('resultado');
 divResultado.innerHTML= '<img src="anim.gif">';
 ajax=objetoAjax();
 ajax.open("GET", datos);
 ajax.onreadystatechange=function() {
  if (ajax.readyState==4) {
   divResultado.innerHTML = ajax.responseText
  }
 }
 ajax.send(null)
} 

Finalmente, el archivo index.html que contendrá un formulario y un botón que al ser pulsado, llamara a la función Javascript MostrarConsulta() que se enlaza al archivo consulta.php y el resultado es mostrado dentro de la etiqueta <div id="resultado"></div>.

<html>
<head>
<title>Consulta Registro con AJAX</title>
<!-- referenciamos al archivo ajax.js donde se encuentra nuestra funcion objetoAjax-->
<script language="JavaScript" type="text/javascript" src="ajax.js"></script>
</head>
<body>
<!-- En "onsubmit" escribimos la función 'MostrarConsulta' que creamos en javascript, con su parametro que es el archivo que vamos a mostrar, en este caso 'consulta.php'-->
<form name="consulta" action="" onSubmit="MostrarConsulta('consulta.php'); return false">
<label>
<input type="submit" value="Consultar" />
</label>
</form>
<div id="resultado"></div>
</body>
</html> 

Como se podrá apreciar, el uso de Clases en PHP hace que nuestro código se reutilizable, en próximos ejemplos veremos como seguir implementando otros métodos a la Clase Empleado, como por ejemplo Insertar, Actualizar y Eliminar registros. Puedes ver el ejemplo en acción o descargar los archivos.

script.aculo.us guía rápida - Parte 1

De ello hemos comentando en algunos artículos anteriores, sin embargo vamos a enfrascarnos un poquito mas. script.aculo.us es una colección de librerías en javascript que ayuda al desarrollar web agregar funcionalidades AJAX a sus proyectos, muchos sitios en internet hacen uso de está excelente herramienta, como por ejemplo: Gucci, Digg, Apple, fluxiom, Basecamp, Shopify, Blinksale, Backpack, Feedburner, Mailroom, Ruby on Rails y muchas mas.

Este artículo es una referencia o guía rapida para iniciarnos en script.aculo.us: mostraremos su instalación y los efectos que podemos usar.

Instalacion

Descargamos script.aculo.us (usamos aqui la versión 1.6.4) y lo descomprimimos. Ahora ubicaquemos los archivos prototype.js, scriptaculous.js y effects.js para referenciarlos en nuestra página HTML (en este caso lo ubicamos en una carpeta "js").

<script src="js/prototype.js" type="text/javascript"></script>
<script src="js/scriptaculous.js" type="text/javascript"></script>
<script src="js/effects.js" type="text/javascript"></script>

Efectos

La librería script.aculo.us proporciona muchos efectos dinámicos. Todos estos efectos toman un conjunto de opciones o parámetros como su duración o FPS, pero en esta ocasión no especificaremos ningún parámetro, veremos solo su uso básico.

Enlace: Ejemplos de Efectos haciendo uso de script.aculo.us

Uso de efectos para nuestras aplicaciones web

Seguramente nos hemos dado cuenta de los efectos visuales que se usan para mostrar mensajes o advertencias en algunas aplicaciones web o sitios webs. Por ejemplo WordPress hace uso de un Fade ("descoloración") para mostrar mensajes de advertencia u otros. Lo mismo ocurre con Ribosomatic, por ejemplo si no inicias sesión correctamente o no escribes tus datos completos para registrar un comentario entonces aparecerá un mensaje en la parte inferior que hara un cambio de color, con el objetivo de resaltar la advertencia.

Lo bueno de esto, es que no tenemos que saber mucho de JavaScript pues existe un script listo para su uso, muy practico y sencillo. Así es, se trata de un script llamado fat.js realizado por Adam Michela. En esta oportunidad explicaremos brevemente, siguiendo las instrucciones del autor, la manera de usarlo.

Empezemos descargando el archivo, luego para referenciarlo escribimos lo siguiente:

<script type="text/javascript" src="/mi_carpeta/fat.js"></script>

Haremos un fade a un parrafo:

<p id="p1" class="fade">Este primer parrafo realizara un fade: pasara de color amarillo al color de fondo de la pagina.</p>

Es importante colocar un id a la etiqueta, seguida de la clase fade. Este primer ejemplo realiza un fade por defecto de amarillo al color de fondo del parrafo.

Ahora haremos un fade de otro color:

<p id="p2" style="background:#FFFF00" class="fade-0066FF" >Este segundo parrafo cambiara de color azul a color amarillo (color de fondo del parrafo).Haremos uso de fade + el codigo de color.</p>

Este ejemplo hace un fade de azul al color de fondo del parrafo, en este caso amarillo.

Los dos ejemplos anterior hacen un fade al iniciar o refrescar la página, sin embargo podemos realizar un fade que responda a un evento. Como por ejemplo al hacer clic en un boton. Veamos como:

<p>
 <input type="button" value="Hacer Fade" onclick="Fat.fade_element('p3', 60, 10000, '#FF0000', '#00CC00')" />
</p>
<p id="p3">Este tercer parrafo cambiara de color rojo a verde en un lapso de 10 segundos y por cada segundo hara 60 variaciones para que el efecto sea algo mas agradable a la vista. </p>

En este ejemplo hemos puesto un boton y en el evento onclick hemos especificado la función Fat.fade_element(), que maneja 5 parametros para dar formato al efecto fade: id, frames por segundo, duracion del fade, color fade y color final.

Hemos visto la manera de manejar este práctico script, puedes descargar los tres ejemplos desarrollados. Si desarrollamos aplicaciones web (ajax) esta es una excelente herramienta para mostrar mensajes a ciertas acciones o eventos dentro de un página web.

Navegación

Categorias

Archivos