Mi primera aplicación con AJAX ... usando Prototype!

En este blog hemos venido hablando y desarrollando con AJAX un gran número de ejemplos prácticos, especialmente relacionandolo con PHP y MySQL. Y realmente que hemos aprendido bastante, pues sea ha desarrollado desde la misma raíz de AJAX: el objeto XMLHttpRequest (aka. XHR), pese a que hay muchas librerías JavaScript que la implementan de forma más resumida. Justamente ahora nuestro objetivo es centrarnos en los frameworks y como con estos podemos implementar AJAX en nuestras aplicaciones, y empezaremos por uno de los más conocidos: Prototype. Veamos un ejemplo sencillo (descarga Prototype).

Mostraremos el contenido de un archivo de texto llamado datos.txt, podemos copiar y pegar cualquier texto en este archivo. En un archivo HTML aparte, pongámosle index.html, llamaremos a la librería Prototype, y creamos una función JavaScript en cual usará el objeto AJAX con el método Request para realizar la petición del contenido de datos.txt. El contenido de datos.txt se mostrará en un contenedor-div que nosotros especifiquemos según el atributo id.

<!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>Primer ejemplo AJAX Prototype</title>
</head>
<script type="text/javascript" src="js/prototype.js"></script>
<script type="text/javascript">

function cargarContenido(fuente_datos, contenedor_id) {
var url = encodeURIComponent(fuente_datos);
var params = '';

new Ajax.Request(url, {
method: 'get', parameters: params,
onSuccess: function(transport) {

if(transport.responseText.length > 0){
document.getElementById(contenedor_id).innerHTML=transport.responseText;
}}});
}

</script>
</head>
<body>
<a href="#" onclick="cargarContenido('datos.txt', 'contenedor')">Cargar contenido</a>
<div id="contenedor">
{aqui aparecera el contenido}
</div>
</body>

Si tienes conocimientos de HTML y algo de JavaScript será suficiente para entender el código. (sino date un paseo por la sección AJAX de este blog). En el método Request podemos especificar la forma de obtener datos (GET ó POST) y algunos parametros, entre otros.  

Lo que hicimos con el objeto XMLHttpRequest, PHP y MySQL anteriormente, trataremos de hacerlo con Prototype.

Enlaces | AJAX, Colección de tutoriales con AJAX + PHP y MySQL

Cómo integrar slideshow en tu tema de WordPress

Si tienes WordPress como CMS entonces este tutorial será de tu interés. Smooth Gallery es un slideshow (en nuestro idioma, una especie de presentación ó diapositivas de imágenes junto con texto de forma interactiva) hecho con JavaScript y que podemos usarlo en nuestras aplicaciones web con tan solo unas cuantas líneas de código y configuraciones. En CatsWhoCode le han dado una aplicación interesante, pues en su página inicial se muestra un slideshow de las imágenes de los artículos recientes del blog, con el titulo y un extracto de este (si le echamos un vistazo tendremos una idea de lo que se quiere lograr).

Ahora CatsWhoCode explica como aplicar este slideshow en WordPress paso a paso. 

Slideshow en WordPress fácilmente

Tutorial | How to : Integrate a slideshow in your wordpress theme

Barras de progreso con jQuery, JavaScript, CSS y Photoshop

Barras de progreso con jQuery

jQuery.UI ProgressBar Widget

Progress Bar 1

Barra de progreso con jQuery y PHP

Progress Bar 2

Plugin jqUploader para jQuery

Progress Bar 3

Plugin para jQuery

Progress Bar 4

Ver Artículo Completo ››

Bucles en Javascript, la manera correcta de implementarla

En la actualidad el lenguaje JavaScript ha tomando su lugar como un requisito importante en el desarrollo-programación de aplicaciones web. Por eso vemos tantos frameworks, librerías y otras formas similar para hacer uso de este lenguaje sin morir en el intento, lo cual es realmente de mucha ayuda. Pero hay desarrolladores que desea hechar mano del JavaScript (digamos tradicional, es decir sin frameworks) y para ello es importante que escriba su código de tal manera que no perjudique la performance de su aplicación.

Justamente media Ajaxian veo algo relacionado a esto que comentamos (en Gregory Reimer's Weblog para ser más exactos) y allí se explica, mediante ejemplos, la forma correcta y más rápida (nos referimos a la ejecución) de escribir bucles en JavaScript. Para muestra veamos, como pasamos de esto:

// looping a dom html collection
for (var i=0, node; node = hColl[i++];) {
// do something with node
}

a este otra forma cuyo tiempo de ejecución es considerablemente menor.

var i = arr.length; while (i--) {}

El desempeño del código dependerá del navegador y las características de nuestra PC. Puedes ver una prueba completa aquí.

 

Barra de calificación con estrellas (rating star) con JavaScript-YUI

Richard Healy de Gamma Tan ha creado un widget de calificación que utiliza YUI como soporte.  La versión 0.1.1 esta disponible para descargar. Es un widget estándar que puedes incorporar en tus formularios sin ningún problema. Puedes ver una demostración de su funcionamiento.

 Rating Widget JavaScript

Flexigrid, datagrid hecho con jQuery

Flexigrid, es un control datagrid que podemos usar en nuestras aplicaciones web para mostrar listas de datos de manera organizada. Está hecho con jQuery.

Flexigrid

Características

  • Redimensiona columnas.
  • Redimensiona ancho y alto del grid.
  • Ordena por la cabecera de la columna.
  • Apariencia amigable.
  • Puede convertir una tabla ordinaria.
  • Se conecta con datos a través de AJAX (XML y JSON).
  • Paginado.
  • Permite ocultar columnas.
  • Barra de herramientas (toolbar).
  • Permite búsqueda.
  • Y muchas otras ...

El desarrollador sigue en mejoras para esta utilidad agregando la función para editar y reordenar las filas, así como otras características.

Vía Ajaxian

10 formas de implementar Mootools en nuestras aplicaciones web

1. Calendario

Los lenguajes de servidor como PHP nos permite desarrollar interesantes cositas en nuestra web: hacer un calendario es una forma. Pero agregar interactividad mediante AJAX le da un peso adicional, y si a ello le sumamos efectos extras que podemos lograr con JavaScript ... sensacional!!


Artículo: http://www.electricprism.com/aeron/calendar/

2. Formulario Web 2.0

Atrás quedaron esos formularios web donde una vez pulsado el botón Enviar rogabas que todo este bien, sino se cargaría nuevamente toda la página. Y ese proceso si que llevaba su tiempito. Pero ahora mediante AJAX, las peticiones ó verificaciones son instántaneas lo que hace el proceso más rápido.


Descargar: http://www.stoutlabs.com/site/post/jazz_up_your_forms_with_mootools_pt_1/
Demo: http://www.stoutlabs.com/demos/formMagic_1.htm

3. Redimensionar Textarea

Es algo a tener en cuenta en nuestras aplicaciones web. Muchos usuarios quieren tener un visión amplia de como va quedando lo que escribe. Claro solo limitado por el tamaño de nuestro monitor ;) .


Artículo: http://ejectmedia.net/examples/moo_textareas/

4. Formulario Login AJAX

Incluir un logueo con AJAX en tus aplicaciones hace que el usuario sienta que todo proceso en tu aplicación web es rápido y directo.


Descargar: http://joeabiraad.com/ajax/ajax-login-form-php-javascript/89
Demo: http://joeabiraad.com/demos/ajax2/

Ver Artículo Completo ››

Cómo implementar COMET con PHP y Prototype (2)

Creando un pequeño sistema de chat

Para esto necesitamos:
  • PHP >= 5.2.0 (incluye función json_encode por defecto)
  • Un archivo para el intercambio de datos - simple archivo de texto (datos.txt).
  • Un script PHP que se encargará de la petición HTTP persistente (peticion.php).
  • Un archivo HTML que cargue el código JavaScript y que muestre los mensajes/datos del servidor (index.html).
  • La biblioteca Prototype.

El script peticion.php

Este script hará dos cosas:
  • Escribir en el archivo datos.txt los nuevos mensajes que envie el cliente.
  • Hacer un bucle infinito siempre y cuando datos.txt no haya sido modificado.
<?php
// dirname -> parte del path correspondiente al directorio
$filename = dirname(__FILE__).'/datos.txt';

// almacenamos un nuevo mensajes en el archivo
$msg = isset($_GET['msg']) ? $_GET['msg'] : '';
if ($msg != ''){
//file_put_contents -> escribir una cadena sobre un archivo
file_put_contents($filename,$msg);
die();
}

// bucle infinito mientras los datos del archivo no son modificados
$lastmodif = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0;

//filemtime -> obtiene la hora de modificación del archivo
$currentmodif = filemtime($filename);
while($currentmodif <= $lastmodif){ // verificar si el archivo de datos ha sido modificado
usleep(10000); // hacemos descansar al CPU por 10ms

//clearstatcache -> limpia la cache de estado de un archivo
clearstatcache();
$currentmodif = filemtime($filename);
}

// devolvemos array en formato json
$response = array();

//file_get_contents -> lee un archivo entero en una cadena
$response['msg'] = file_get_contents($filename);
$response['timestamp'] = $currentmodif;
echo json_encode($response);

//flush -> vaciar el búfer de salida
flush();
?>

El archivo index.html

Este documento HTML cargará la librería Prototype dentro de las etiquetas <head>, luego en el cuerpo del documento (<body>) creamos un contenedor: <div id="content"></div>, donde se mostrarán los mensajes procedentes de datos.txt. Finalmente, se creará mediante JavaScript un objeto Comet que llamará al script peticion.php para ver los nuevos mensajes del chat.

El objeto comet enviará respuesta AJAX cada vez que un nuevo mensaje se ha recibido y cada vez que un nuevo mensaje se ha enviado. La conexión persistente es usado solo para ver los nuevos mensajes. Usamos un parámetro url (timestamp) para identificar el último mensaje, así el servidor devolverá el contenido de datos.txt solo cuando la fecha/hora de modificación sea mas reciente que la fecha/hora del cliente.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Comet demo</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="prototype.js"></script>
</head>
<body>

<div id="content">
</div>
<p>
<form action="" method="get" onsubmit="comet.doRequest($('word').value);$('word').value='';return false;">
<input type="text" name="word" id="word" value="" />
<input type="submit" name="submit" value="Enviar" />
</form>
</p>
<script type="text/javascript">
var Comet = Class.create();
Comet.prototype = {
timestamp: 0,
url: './peticion.php',
noerror: true,
initialize: function(){ },
connect: function(){
this.ajax = new Ajax.Request(this.url, {
method: 'get',
parameters: { 'timestamp' : this.timestamp },
onSuccess: function(transport) {
// manejamos la respuesta del servidor
var response = transport.responseText.evalJSON();
this.comet.timestamp = response['timestamp'];
this.comet.handleResponse(response);
this.comet.noerror = true;
},
onComplete: function(transport) {
// enviamos nueva petición ajax cuando esta haya finalizado
if (!this.comet.noerror)
// si conexión tuvo problemas, intentar reconectar cada 5 segundos
setTimeout(function(){
comet.connect()
}, 5000);
else
this.comet.connect();
this.comet.noerror = false;
}});
this.ajax.comet = this;
},
disconnect: function(){ },
handleResponse: function(response){
$('content').innerHTML += '<div>' + response['msg'] + '</div>';
},
doRequest: function(request){
new Ajax.Request(this.url, {
method: 'get',
parameters: { 'msg' : request }
});
}
}
var comet = new Comet();
comet.connect();
</script>
</body>
</html>

Anteriormente hicimos un ejemplo de Chat con AJAX + PHP. Donde cada cierto tiempo el cliente pide al servidor información de nuevos mensajes. En esta oportunidad no es así, por que se mantiene una conexión persistente con el servidor de acuerdo a una condición. Eso si cuando se trata de conexiones persistente hay que darle descanso al servidor. Ahora si nosotros cambiamos el archivo datos.txt por una tabla en MySQL(... ó cualquier otro manejador de BD). Entonces debemos avergiuar sobre como mantener conexiones persistentes en base de datos. Que en realidad se puede, pero no es una configuración por defecto en los Hostings. Quizás de manera local podamos hacer pruebas y así tener una idea de como estás técnicas - que comunmente vemos implementadas en servicios como Meebo, Google Talk (web) y más - funcionan. 

Estos dos ejemplos mostrados fueron tomados de Zeitoun.net, los cuales modificamos y testeamos para poder darlo a conocer en nuestra querida lengua.

Fuente original: How to implement COMET with PHP

 

Barra de calificación con estrellas (rating stars) usando Prototype

Starbox te permite crear facilmente todo tipo de barras de clasificación ó valoración utilizando solo una imágen PNG. Esta librería usa Prototype para su funcionamiento. Para algunos efectos extra puedes incluir script.aculo.us también.

Rating Stars

Instalación

Descargas las ultimas versiones estables de Prototype y script.aculo.us, y por supuesto de Starbox. En la página HTML haces referencia a los archivos JavaScript necesarios:

<script type='text/javascript' src='js/prototype.js'></script>
<script type='text/javascript' src='js/scriptaculous.js?load=effects'></script>
<script type='text/javascript' src='js/starbox.js'></script>

También referencia la hoja de estilos:

<link rel="stylesheet" type="text/css" href="css/starbox.css" />

Sube las imágenes al directorio images. Si deseas colocar las imágenes en otro sitio modifica el archivo starbox.js en esta línea:

overlayImages: '../images/starbox/',

Para ver su uso completo y algunos tutoriales accede a la página del autor donde encontrarás mucha documentación al respecto.

Vía DHTMLSite

 

Cómo implementar COMET con PHP y Prototype

Comet es una técnica de programación que permite a los servidores web enviar datos al cliente sin ninguna necesidad de que éste lo solicite. En aplicaciones AJAX ocurre lo contrario, el cliente (el navegador web) no puede ser notificado en tiempo real por el servidor si se han producido cambios en éste. Es el usuario quien deberá realizar la petición, quizás haciendo clic en un vinculo, botón ó mediante una solicitud periódica a fin de obtener datos del servidor.

En está oportunidad vamos aplicar Comet con PHP y Prototype. Nos basaremos en un iframe oculto. El objetivo es que el cliente no pida al servidor, sino que el servidor envie datos al cliente.

El servidor nos retornará la hora UNIX

  • Necesitaremos un script en PHP que se encargará de la petición HTTP persistente (backend.php).
  • Un archivo HTML, donde irá el código JavaScript necesario y donde mostraremos los datos procedementes del servidor (index.html).
  • La librería Prototype (y un poquito de conocimiento de está librería).

El archivo backend.php

El script backend.php, hará un bucle infinito y devolverá la hora UNIX siempre y cuando el cliente esté conectado.

<?php
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
flush();
//flush -> vacia el búfer de salida de PHP y ademas envia todo lo escrito (echo, print, ect) al navegador del cliente

?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Comet php backend</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>

<script type="text/javascript">
//Navegadores KHTML no compartes javascripts entre iframes
var is_khtml = navigator.appName.match("Konqueror") || navigator.appVersion.match("KHTML");
if (is_khtml)
{
var prototypejs = document.createElement('script');
prototypejs.setAttribute('type','text/javascript');
prototypejs.setAttribute('src','prototype.js');
var head = document.getElementsByTagName('head');
head[0].appendChild(prototypejs);
}
// cargamos objeto comet (esto en realidad es el nombre del iframe)
var comet = window.parent.comet;
</script>

<?php
while(1) { // while (1) permite un bucle infinito
echo '<script type="text/javascript">';
echo 'comet.printServerTime('.time().');';
echo '</script>';
flush();
sleep(1); // un descanso para aliviar el CPU del servidor
}
?>
</body>
</html>

El archivo index.html

Este documento HTML cargará la librería Prototype dentro de las etiquetas <head>, también creamos dentro de <body> un contenedor donde se mostrará el resultado de la petición al servidor, ó sea la hora UNIX: <div id="content"> </div>, y finalmente se creará el objeto Comet que se conectará a nuestro archivo PHP.

El objeto Coment crea etiquetas <iframe> invisibles (esto quizás varie en algunos navegadores). Estos iframes se encargarán de crear el "terreno" (por así decirlo) para la conexión HTTP persistente al archivo/script PHP.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Comet demo</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="prototype.js"></script>
</head>
<body>
<div id="content">La hora del servidor se mostrará aqui</div>

<script type="text/javascript">
var comet = {
connection : false,
iframediv : false,

initialize: function() {
if (navigator.appVersion.indexOf("MSIE") != -1) {

// Para navegadores IE
comet.connection = new ActiveXObject("htmlfile");
comet.connection.open();
comet.connection.write("<html>");
comet.connection.write("<script>document.domain = '"+document.domain+"'");
comet.connection.write("</html>");
comet.connection.close();
comet.iframediv = comet.connection.createElement("div");
comet.connection.appendChild(comet.iframediv);
comet.connection.parentWindow.comet = comet;
comet.iframediv.innerHTML = "<iframe id='comet_iframe' src='./backend.php'></iframe>";

} else if (navigator.appVersion.indexOf("KHTML") != -1) {

// Para navegadores KHTML
comet.connection = document.createElement('iframe');
comet.connection.setAttribute('id', 'comet_iframe');
comet.connection.setAttribute('src', './backend.php');
with (comet.connection.style) {
position = "absolute";
left = top = "-100px";
height = width = "1px";
visibility = "hidden";
}
document.body.appendChild(comet.connection);

} else {

// Para otros navegadores (Firefox...)
comet.connection = document.createElement('iframe');
comet.connection.setAttribute('id', 'comet_iframe');
with (comet.connection.style) {
left = top = "-100px";
height = width = "1px";
visibility = "hidden";
display = 'none';
}
comet.iframediv = document.createElement('iframe');
comet.iframediv.setAttribute('src', './backend.php');
comet.connection.appendChild(comet.iframediv);
document.body.appendChild(comet.connection);

}
},
// esta función será llamada desde backend.php
printServerTime: function (time) {
$('content').innerHTML = time;
},
onUnload: function() {
if (comet.connection) {
comet.connection = false; // se eliminará el iframe para prevenir problemas con IE cuando se recargue la pagina.
}
}
}
Event.observe(window, "load", comet.initialize);
Event.observe(window, "unload", comet.onUnload);
</script>

</body>
</html>

En resumen, mediante JavaScript/Protype creamos en iframe donde aparecerá el contenido generado por backend.php, es este archivo el que mantendrá la conexión abierta con el servidor creando así un canal donde el servidor sea quien envie datos al cliente, en este caso la hora UNIX. Veremos luego un segundo ejemplo y seguiremos explicando al respecto.

Navegación

Categorias

Archivos