Chat con Ajax - Parte 1

Deseaba desarrollar un pequeño sistema chat con el objeto XMLHttpRequest. El incoveniente, como lo comente en un articulo anterior, es que el cliente pide información al servidor y esto se debe realizar cada cierto tiempo (n segundos) y eso no es bueno, pues en un sistema de chat el servidor es el que debe enviar información al cliente (nuevos mensajes, quienes están conectados, etc). Así que empece a averiguar sobre Comet (alternativa a Ajax) pero no encontre algo digno de usarse, además de tener algunos pequeños incovenientes. Así que ¿que hacer?. Yo quería mi chat de todas maneras. Así que opte por trabajarlo con Ajax de todas maneras. Trabaje con el objeto XMLHttpRequest de forma distinta a como lo hemos venido haciendo en los ejemplos.

Ver Artículo Completo ››

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

Drag Drop con script.aculo.us

Bien ahora veremos la forma de mover elementos de un lugar a otro con script.aculo.us. Esto será una explicación rápida y al grano. Mas adelante veremos como combinar esta característica con PHP y MySQL.

Primero descargamos el paquete de script.aculo.us y luego incluimos los archivos necesarios para este proceso. Dentro de las etiquetas <head></head> escribimos:

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

Para nuestro ejemplo creamos una serie de bloques div con elementos dentro que tendrán la característica de ser 'arrastrados y soltados' de un bloque a otro:

<div id="pagina">
<div id="grupo1" class="seccion" style="float:left;width:150px;">
<h3 class="arrastrar">Animales</h3>
<div>Gato</div>
<div>Perro</div>
<div>Pato</div>
<div>Gallina</div>
</div>
<div id="grupo2" class="seccion" style="float:left;width:150px;">
<h3 class="arrastrar">Cosas</h3>
<div>Mesa</div>
<div>Escritorio</div>
<div>Estante</div>
<div>Silla</div>
</div>
</div>

Como apreciamos, la estructura que hemos creado tienen diversas etiquetas div con su atributo id definido. Podemos apreciar un bloque cuyo id es pagina que contiene a dos bloques: grupo1 y grupo2, cada una de ellas con su atributo class seccion. Además apreciamos que las etiquetas de encebezado h3 tiene el atributo class arrastrar .

Ver Artículo Completo ››

Juegos con Ajax, desarrollados con YUI

YUI (Yahoo! User Interface) es una librería Javascript-Ajax desarrollado por Yahoo! que nos permite crear aplicaciones web atractivas e interesantes, y prueba de ello son estos jueguitos desarrollados con esta librería.

Solitario Juego

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 ››

Ajax im: Mensajería Online con Ajax

Ajax im: Mensajería con AjaxAjaxim es un sistema de mensajería instantanea online (ya hay muchos de estos!), la cual está implementada con Ajax. Una vez registrados y conectados, podemos apreciar una apariencia similar a la de Meebo en sus inicios. Salvo la ventana flotante que aparece en la parte derecha de la pantalla, no hay mas! Este servicio está en fase de desarrollo y seguramente irán agregandole mejoras para que entre a la competencias con los tantos servicios de mensajería online que existen.

Comet ó Ajax

Hace casi un año (aproximadamente) se hablaba de una nueva técnica de programción Web que utiliza el objeto XMLHttpRequest, muy similar a Ajax, llamada Comet. Está técnica también es conocida como Server Push o HTTP Push.

¿En que consiste? Con Comet podemos mantener una conexión abierta entre el cliente y el servidor web. Para que esto se produzca el cliente envia información al servidor, pero no solicita datos. El servidor es el que se encargará de enviar información al cliente cuando haya algun cambio en este. [Diagrama Ajax vs. Comet]

Ejemplo. Supongamos que queremos desarrollar una aplicacion de mensajería web y queremos saber que usuarios estan conectados, entonces mediante Ajax podemos pedir esa información, pero eso implicaría que el cliente pedirá constantemente al servidor información. Eso podria funcionar en una intranet sin problemas, pero si deseamos llevar ese esquema a la red de redes, nos consumiría ancho de banda. En esto entra Comet, pues como ya comentamos es el servidor el que envia información al cliente. En el caso de la mensajería aplicando Comet, es el servidor quien nos informa cuantos usuarios están conectados.

Y quizas se pregunten: ¿a que viene todo esto, si ya es una nota que se comento casi un año? Me pareció interesante comentarla pues, he estado desarrollando, justamente eso, un pequeño chat con Ajax, pero justamente había ese incoveniente que de esa forma se satura al servidor pidiendole constantemente información. Así que averiguando un poco me tope con Comet (en un artículo anterior comentamos un poquito de esto) y por ahora estoy viendo la forma de aplicarlo a mi chat, cuando lo termine lo compartiré, quizás a alguien le pueda ser de utilidad.

Referencia | Comet en Wilipedia

Plotr: Librería para gráficos con Prototype

PlotrBas Wenneker ha desarrollado una librería llamada Plotr gracías a Prototype y al elemento canvas, este es un elemento que pese a no ser un estándar nos permite dibujar gráficos sobre HTML (basicamente Canvas consiste en una serie de regiones definidas en HTML con atributos y a las que el código Javascript puede acceder a traves de unas funciones similares a una API).

Esta librería es muy útil para crear gráficos estadísticos. Por su puesto para su funcionamiento requiere de Prototype (1.5.0 ó superior). Funciona perfectamente sobre Firefox 1.5 +, Safari 2.0 +, Opera 9.0 +, IE 6.0 +.

Aunque no cuenta con documentación (de momento) la manera de usarlo es realmente fácil. Incluso podemos generar los datos que se mostrarán en el gráfico dinamicamente con un lenguaje de servidor como PHP, ASP u otro (Quizás esto lo veamos en un ejemplo mas adelante a nuestro estilo) .

Ejemplos

Vía | Ajaxian

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]

¡Y el ganador es ... Ajax!

ajax winnerDevelopers.com anunció los productos ganadores del año 2007 de acuerdo a categoría. Entre las que están: Tecnología, FrameWork, Herramientas de Desarrollo, Utilidades de Desarrollo y más. Lo interesante de esta competencia es que, bajo la categoría Tecnología, se ubica en primer lugar Ajax (Asynchronous JavaScript and XML), seguido de JSON, Ruby on Rails, Ubuntu y Virtualization. Es el segundo año que está tecnología se ubica en este puesto.

Esto se traduce en un interés de parte de los desarrolladores por ésta, especificamente "tecnica de programación" que combina lenguajes ya existen. Y no hay duda que Ajax se ubique en primer lugar pues ya muchas webs como Google, Yahoo y Live le han sacado provecho desarrollando servicios y aplicaciones interesante y atractivas. Además, la cantidad de framework para trabajar con JavaScript además de pequeños script (en peso) pero poderesos por su utilidad, como Script.aculo.us, Prototype, Mootools o Jquery, han hecho que la web se ha diferente y se traduzca en un rapida propagación de Ajax y un fácil uso de los servicios web.

El hecho que Ajax se pueda combinar con lenguajes como Java, PHP, ASP y el framework Ruby on Rails ha hecho que muchos estudiantes y profesionales busquen información al respecto para aplicarlos en sus estudios o centro de trabajo como alternativa a las técnicas actuales de programación.

Sin embargo, aunque Ajax tiene sus ventajas, también durante el año pasado se han hecho resaltar sus desventajas, especialmente en lo relacionado a la accesibilidad. Estos últimos años la web a cambiado bastante y seguirá cambiando, seguramente aparecerán nuevas técnicas, lenguajes o framework que nos facilite no solo programar, sino hacer mas interesantes nuestras aplicaciones, especialmente aplicaciones webs.

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]

Navegación

Categorias

Archivos