miércoles, 28 de abril de 2010

Una forma rápida de acceder a una galería de Flickr utilizando jQuery




¡Saludos de nuevo blogueros!

Siguiendo con las pruebas de la biblioteca jQuery, ahora me puse a revisar su potencial explotando algún servicio de imágenes de Internet, entre los que encontré los servicios para acceder a las galerías de imágenes de Flickr. Este manejador de imágenes posee varias formas para que nuestras aplicaciones puedan descargarse una lista con la información de las imágenes que tienen sus álbumes, ya sea a consumiendo alguna de sus APIs para la búsqueda de fotografías o utilizando su servicio de suscripción al feed RSS de un usuario.

Si consumimos alguna de las APIs de Flickr, tenemos la posibilidad de buscar sobre toda la base de datos del sistema, cualquier fotografía que coincida con las palabras clave o el identificador del usuario que estemos buscando. Esta forma de utlizar jQuery se explora en este artículo de CocinaMental, donde se utiliza la API flickr.photos.search.

Por otro lado, a través de un feed RSS, podemos acceder a la información de las últimas fotografías que han sido agregadas a la galería de un usuario específico.

El método que exploraremos en este artículo consistirá en consumir el feed RSS de una galería de Flickr desde nuestra aplicación AJAX, dejando a los usuarios que deseen saber como explotar las APIs de Flickr la referencia a al artículo en CocinaMental, donde se expone bastante claro como lograrlo. Como no es mi intención crear una artículo redundante me decante por este método sobre el de las APIs, además de que es sumamente rápido ponerlo a trabajar.

Antes de empezar

Adicionalmente a la biblioteca jQuery, en el programa utilizaremos un plug in llamado cycle, el cual nos permitirá agregar el efecto de cambio automático de imágenes con desvanecimiento a la galería que mostraremos.

Ambas bibliotecas las incluiremos en nuestro código con referencias a sus archivos fuente, pero en esta ocasión no será necesario descargar ningún archivo, ya que referenciaremos directamente al último archivo fuente, que se encuentra en los servidores de cada uno de los proveedores de sus códigos fuente.

Primero elegimos las imágenes


El primer paso consiste en darnos un paseo por Flickr y encontrar alguna galería que nos interese utilizar para la prueba, toda galería posee un autor, es decir el usuario que subió las imágenes, así que la galería que elijamos está directamente vinculada con este usuario. Por ejemplo en una consulta a una imagen de Flickr acabé accediendo a la galería del usuario Plateada, que podemos ver en la imagen siguiente:



Dentro de la información que aparece, lo que nos interesa para nuestra aplicación está al final de la página, en esta parte podemos ver el enlace al feed RSS de la galería, llamado Latest:



Pero no haremos clic sobre el enlace, sino que nos fijaremos en la URL que aparece en éste, ya que dentro de esta URL está la información que utilizaremos para acceder a la galería. Podemos copiar esta dirección URL para verla con calma y obtendremos un texto como el siguiente:

http://api.flickr.com/services/feeds/photos_public.gne?id=59492828@N00&lang=en-us&format=rss_200


El campo id corresponde al identificador del usuario autor de la galería Plateada, y este es precisamente el dato que utilizaremos en nuestra aplicación de ejemplo.

Vamos al código

El código para la aplicación Web que implementará esta galería es el siguiente:

galeriaJQuery.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Galería de imágenes de Flickr con jQuery</title>
    <style type="text/css">
.slideshow { margin: 20px auto; padding: 0; }
.slide { margin: 0; padding: 0}
.slide img { padding: 15px; border: 1px solid #ccc; background-color: #eee; margin: auto; display: block }
    </style>
    <script src="http://code.jquery.com/jquery-latest.js" type="text/javascript"></script>
    <script src="http://cloud.github.com/downloads/malsup/cycle/jquery.cycle.all.latest.min.js" type="text/javascript"></script>
    <script type="text/javascript">
$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?id=59492828@N00&lang=en-us&format=json&jsoncallback=?",
function(data){
   $.each(data.items, function(i,item){
     $("<img/>").attr("src", item.media.m).appendTo("#imagenes").wrap("<div class=\"slide\"><h3>"+ item.title +"</h3><a href='" + item.link + "'></a></div>");
   });
   $('#imagenes').cycle({
     fx:     'fade',     
    timeout:  5000
   });
});
    </script>    
</head>
<body>
<div id="imagenes" class="slideshow"></div>
</body>
</html>


Como vemos, se referencia a los archivos fuente de las blibliotecas jQuery y cycle desde su ubicación dentro de Internet en sus servidores Web.

Además se incluye un pequeño syle CSS para darle una apariencia más agradable a las imágenes, incluyendo en cada una un pequeño marco gris.

En lo que corresponde a la funcionalidad, el acceso a la lista de imágenes se lleva a cabo por mediante la funcionalidad jQuery.getJSON, que lleva a cabo una petición de datos en formato JSON al servidor de Flickr, utilizando una solicitud HTTP-GET (es decir, con los datos incluidos un la dirección URL del recurso al que estamos accediendo).

$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?id=59492828@N00〈=en-us&format=json&jsoncallback=?",


Dentro de la URL que utiliza la función es donde se incluirá el id del usuario que obtuvimos previamente, en este caso 59492828@N00.

Recibir la información de respuesta en formato JSON facilita bastante el trabajo, ya que es interpretada por javascript como una estructura nativa del lenguaje, y gracias a esto podemos utilizarla directamente dentro de la aplicación. Como sucede en la función que se define en seguida:

function(data){
$.each(data.items, function(i,item){
$("<img/>").attr("src", item.media.m).appendTo("#imagenes").wrap("<div class=\"slide\"><h3>"+ item.title +"</h3><a href='" + item.link + "'></a></div>");
});
$('#imagenes').cycle({
fx: 'fade',
timeout: 5000
});
});


En donde, utilizando la funcionalidad de jQuery each, podemos rellenar el elemento div "imagenes" con la información de cada una de las imágenes que recibimos como respuesta a la petición, incluyendo la ruta URL al archivo de la imagen, con lo que utilizando etiquetas HTML podemos visualizar todas las imagenes un nuestra aplicación.

Finalmente, utilizando el plug in cycle, es que podemos agregar la función para cambiar automáticamente una imagen por la siguiente en la lista, incluyendo un atractivo efecto de desvanecimiento entre una imagen y la otra. En este caso el efecto para hacer el cambio es el 'fade' (se desvanecen) que nos proporciona la biblioteca, con un tiempo entre los cambios de 5000 milisegundos.

El resultado final deberá desplegar todas las imágenes de la galería Plateada, incluyendo el título de cada una, haciendo automáticamente el cambio ante nuestros ojos:



Para visualizar cualquier otra galería de Flickr que deseemos, bastará modificar el argumento id dentro de la URL que aparece en el código fuente, con el identficador del autor de la galería que queramos. De esta forma, utilizando recursos 100% libres, podemos agregar un atractivo elemento para nuestras aplicaciones Web.

Hasta la próxima.

martes, 27 de abril de 2010

El cuerpo humano en HTML y PHP

Me encontré esta imagen en Chistes Geek y no puede dejar de traerla, en el cuerpo humano descrito en HTML con código PHP embebido para hacerlo dinámico:


miércoles, 14 de abril de 2010

AJAX utilizando jQuery


Escribir menos suena bien, veamos que sigue...


¡Saludos nuevamente blogueros!

De regreso con un breve artículo sobre como utilizar el framework para trabajar con AJAX llamado jQuery. Esta biblioteca de funciones tiene como objetivo general facilitar nuestro trabajo no solo con AJAX sino con todos nuestros scripts de Javascript, ofreciendo -como podemos ver en su documentación anterior- APIs como selectores para el acceso directo a los elementos de la página, manipulación del contenido CSS, efectos de animación en los elementos HTML, manejo de eventos, entre otras muchas utilidades. Debido a la gran popularidad de que ha gozado en las noticias que han llegado a un servidor, decidí explorar un poco este paquete para ver que cosas se pueden hacer con sus herramientas.

Una de las diferencias principales que aparecen en esta framework comparado con Prototype, es que en jQuery existe un mayor encapsulamiento de las funciones, lo que se aprecia en la cantidad de código que resulta al comparar ambos métodos, y queda todavía más claro cuando revisamos que Prototype nos permite crear nuestras propias clases para utilizarlas en las aplicaciones, cosa que no existe en jQuery, donde la filosofía es reducir el trabajo del programador y alejarlo de los detalles tras el código. En este artículo del blog de anieto2k podemos ver una pequeña comparación entre el rendimiento de ambas soluciones. Por otro lado, la conclusión a la que llegan la web intenta sobre el por qué ha ganado tanto terreno el framework jQuery, es que realmente hace más sencillo el desarrollo, cosa que siempre es bienvenida. :-)

Pero bueno, vayamos a la práctica y veamos cómo trabajar con AJAX utilizando este framework. El archivo de esta biblioteca lo encontraremos en su página oficial, dentro de la sección download. Este archivo lo utilizaremos en el código HTML haciendo referencia a él por medio del ya conocido acceso a archivos javascript:

<script type="text/javascript" src="jquery-1.4.2.min.js"></script>


Antes de empezar

Dentro de la documentación que la página oficial contiene, podemos revisar el apartado sobre la funcionalidad de jQuery para AJAX, gracias al conjunto de métodos que posee es posible llevar a cabo todo el proceso de petición al servidor Web, y procesamiento de la respuesta en unas pocas líneas de código. Concretamente nos centraremos en el método jQuery.ajax(), ya que en un solo llamado a esta función podemos configurar todo el proceso de la petición AJAX.

Esta función recibe un único parámetro que consisten en un objeto, que posee una serie de propiedades que nos permiten definir todo el proceso de la petición AJAX. Para este ejemplo utilizaremos las siguientes:

url
Dirección URL del recurso Web al que accederemos.

type
Define el tipo de envío de información que se hará, ya sea GET o POST.

data
Corresponde a la información que se mandará al servidor, en forma de parejas llave-valor, éste representa los mismos datos que pasamos en la cadena de consulta (query) cuando solicitamos una URL remota en los ejemplos sobre AJAX anteriores. Puede ser una cadena de valores codificada en formato de URL (p.e. '&dato1=valor1&dato2=valor2') o un objeto cuyas propiedades correspondan a los datos (p.e. {dato1:"valor1",dato2:"valor2"}).

dataType
Especifica el tipo de datos que esperamos que nos devuelva el servidor después de nuestra petición, estos pueden ser xml, json, script o html.

error
Guarda la referencia a la función que se ejecutará en caso de que haya algún error durante la petición al servidor Web.

complete
Guarda la referencia a la función que se ejecutará cuando la petición al servidor haya tenido una respuesta de parte de éste. Esta función puede recibir como parámetro la información devuelta por el servidor como respuesta a nuestra petición.

beforeSend
Guarda la referencia a la función que se ejecutará antes de iniciar el proceso de petición a nuestro sevidor Web.


Manos a la obra

Para la implementación de la petición asíncrona al servidor utilizaremos la funcionalidad jQuery.ajax que aparece en la documentación, con el código que aparece a continuación:

ajaxJQuery.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Prueba de AJAX con JQuery</title>
<script type="text/javascript" src="jquery-1.4.2.min.js"></script>
<script type="text/javascript">
function peticionAjax() {  
    var objParametros = creaObjParametros();
    $.ajax({url:  "http://localhost/validaDatos.php",
        type: 'POST',
        data: objParametros,
dataType: "html",
        beforeSend: function() {
                document.getElementById("divRespuesta").innerHTML = "<p>Iniciando nueva petición Ajax...</p>";
                },
        complete: function(respuesta) {
                document.getElementById("divRespuesta").innerHTML += respuesta.responseText;
                },
        error : function(respuesta) {
                alert("Ocurrió un error al acceder al servidor Web");
                }
    });
}

function creaObjParametros() {
    var obj = new Object();
    obj.txtAutor = document.getElementById("txtAutor").value;
    obj.txtAnio = document.getElementById("txtAnio").value;
    obj.txtTitulo = document.getElementById("txtTitulo").value;
    return obj;
}
</script>
</head>
<body>
<form style="background-color:#EFEDF1">
    <label for="txtAutor">Autor:</label>
    <input type="text" id="txtAutor" name="txtAutor" size="40" /><br/>
    <label for="txtAnio">Año:</label>
    <input type="text" id="txtAnio" name="txtAnio" size="10" /><br/>
    <label for="txtTitulo">Títiulo:</label>
    <input type="text" id="txtTitulo" name="txtTitulo" size="50" /><br/>
    <input type="button" value="Validar datos" onclick="peticionAjax()" />
    </form>
<div id="divRespuesta"></div>
</body>
</html>


Dentro del código javascript existen 2 funciones, la primera, peticionAjax() lleva a cabo la petición al servidor Web y procesamiento de la respuesta. La segunda, creaObjParametros() se encarga de recuperar los datos capturados por el usuario en el formulario, y almacenarlos dentro de las propiedades de un objeto que regresa como resultado. En la función para enviar la petición se utiliza la función $.ajax (jQuery.ajax) para realizar todo el proceso, ya que el único parámetro que recibe consiste en un objeto, cuyas propiedades contienen todos los datos para que jQuery, lleve a cabo las acciones de petición al servidor Web y el manejo de la respuesta que éste devuelva.

Cómo ya habíamos señalado la propiedad url contiene la dirección URL del recurso Web al que estamos accediendo, en este caso el archivo validaDatos.php, que consiste en una aplicación Web escrita en PHP para validar datos de entrada. El código de este programa aparece en el tercer ejemplo que vimos en este blog sobre Ajax, que se titula Combinando Ajax con PHP. Pueden consultar este artículo para mayor referencia sobre el comportamiento de este programa.

El código aparece a continuación:

validaDatos.php
<?php
//Expresiones regulares para la validación de los datos
$er_titulo = "/^([a-z]|[A-Z]|[ÁÉÍÓÚáéíóúÑñÜü]|[0-9]|[\s\.\-,:'\"])+$/";
$er_autor = "/^([a-z]|[A-Z]|[ÁÉÍÓÚáéíóúÑñÜü]|[\s,\.'\-])+$/";
$er_anio = "/^([1-2][0-9][0-9][0-9])$/";
//Validamos que se hayan enviado todos los datos por post
if(isset($_POST['txtAutor']) && isset($_POST['txtAnio']) && isset($_POST['txtTitulo'])){
  //Validamos el contenido de los campos
  $autor = stripslashes(trim($_POST['txtAutor']));
  $anio = trim($_POST['txtAnio']);
  $titulo = stripslashes(trim($_POST['txtTitulo']));
  if(!preg_match($er_autor,$autor)){
    $campo = "autor";
  }
  else if(!preg_match($er_anio,$anio)){
    $campo = "año";
  }
  else if(!preg_match($er_titulo,$titulo)){
    $campo = "título";
  }
  else{
    $mensaje = "Todos los campos capturados son correctos :)";
  }
  if(isset($campo))
    $mensaje = "Error: El texto capturado en el campo $campo es incorrecto";
}
else{
  $mensaje = "No se recibieron los valores";
}
?>
<p><?=$mensaje?></p>
<p><u>Valores recibidos</u>:<br />
Autor: <?=$_POST['txtAutor']?><br />
Año: <?=$_POST['txtAnio']?><br />
Título: <?=$_POST['txtTitulo']?><br />
</p>


Básicamente es un programa que recibe una serie de datos enviados por POST desde nuestro navegador, los valida utilizando expresiones regulares, y dependiendo de si cumplieron o no con estás, imprime un mensaje correspondiente al resultado del proceso.

El resultado final de la implementación se puede probar localmente, almacenado en nuestro servidor Web estos dos archivos, y accediendo con nuestro navegador ajaxJQuery.html:



Y así, con unas pocas líneas podemos adaptar nuestros programas anteriores al framework jQuery, y comprobar como es bastante sencillo de utilizar permite además tener un código mucho más limpio.

Al momento de decidir entre cual framework para Ajax utilizar, deberiamos revisar cada una de las funcionalidades que aparecen en sus respectivas documentaciones, y en base a nuestras necesidades y conocimientos previos elegir el que mejor se nos adapte. Al final, la decisión recaerá unicamente en el desarrollador.

Saludos y hasta la próxima.