Xajax: Ajax para PHP

Valoración del artículo:
Una librería PHP que contiene la clase xajax, que permite ejecutar Ajax de una manera sencilla.
Publicado: 17/4/07
Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.
Ajax es una tecnología que utiliza a su vez otra combinación de tecnologías, como XML y Javascript, para realizar peticiones de contenido o computación de servidor sin tener que recargar la página en la que está el usuario. Es una tecnología que permite una nueva gama de aplicaciones interactivas en la web, mucho más ricas y rápidas, dado que no precisamos recargar todo el contenido de una página para realizar peticiones al servidor.

Referencia: Puedes ver qué es ajax en este artículo: Qué es AJAX
Tenemos otros artículos que explican Ajax, puedes buscarlos con nuestro directorio, en la categoría Ajax.

Si hemos intentado alguna vez trabajar con Ajax para programar una página web, habremos comprobado que la tarea se complica bastante, teniendo que realizar diferentes trozos de código en distintos lenguajes de programación y en distintos archivos. Todo esto puede provocar dolores de cabeza o páginas con códigos difíciles de entender y de mantener. Esta cuestión sin dudas es uno de los problemas que trae Ajax a los programadores, sobretodo a los que intentan dar sus primeros pasos. Pero herramientas como xajax pueden ayudarnos bastante.

En este artículo vamos a conocer xajax, una clase realizada con PHP que nos permite utilizar Ajax, combinado con PHP, para la creación de aplicaciones interactivas, de una manera muy simplificada. Con xajax podemos fácilmente ejecutar funciones PHP, que se ejecutan en el servidor, cuando el usuario realiza acciones en la página. Luego, los resultados de esas funciones PHP se producen en la misma página, sin que se tenga que recargarse.

Xajax es un producto Open Source gratuito y compatible con los navegadores más comunes, como Firefox, u otros navegadores basados en Mozilla, Internet Explorer, Opera, etc.

Podemos encontrarlo en http://xajaxproject.org

Hacer unas primeras pruebas para comenzar a conocer la herramienta nos llevará pocos minutos. Lo veremos a continuación.

Descargar e instalar xajax

Para probar xajax debemos descargar la última versión de la clase, que podemos descargar directamente desde su página web: http://xajaxproject.org

Obtendremos un archivo comprimido que debemos descomprimir en cualquier lugar de nuestro espacio de publicación. Por ejemplo, podemos crear un directorio llamado xajax donde podemos colocar todos los archivos del .zip descargado.

No hay que hacer especiales acciones para instalar xajax, simplemente descomprimirlo en cualquier servidor Apache o IIS que tenga compatibilidad con PHP 4.3.x o PHP 5.x, o superiores.

Una vez descargado podemos probar los ejemplos que vienen en el directorio examples, siempre a través de nuestro servidor web compatible con PHP, ya sea en local o en un servidor web remoto.

Atención al directorio donde finalmente metemos los archivos de xajax, pues luego tendremos que incluir archivos que hay en dicho directorio, para lo cual deberemos recordar la ruta relativa desde la página donde estemos al directorio donde está xajax.

Página simple con xajax y PHP

Veamos ahora como realizar una página que utilice xajax, para ejecutar una sencilla función PHP como respuesta a una acción del usuario. El ejemplo es relativamente sencillo, incluso lo podemos hacer en pocos pasos, como una receta. Luego se podrá complicar todo lo necesario para realizar acciones más complejas.

1) Incluir con PHP el archivo donde está la clase xajax

//incluímos la clase ajax
require ('xajax/xajax.inc.php');


2) Creamos una instancia de un objeto de la clase xajax

//instanciamos el objeto de la clase xajax
$xajax = new xajax();


3) Escribimos una función en PHP, que luego llamaremos con por medio de ajax

Esta función es todo lo complicado que se requiera. Realizará acciones del lado del servidor y por tanto puede acceder a bases de datos, abrir ficheros o cualquier cosa que se nos ocurra. Luego en la propia función realizaremos una instancia de un objeto AjaxResponse, que utilizaremos para mostrar resultados en la página.

function si_no($entrada){
   if ($entrada=="true"){
       $salida = "Marcado";
   }else{
       $salida = "No marcado";
   }

   //instanciamos el objeto para generar la respuesta con ajax
   $respuesta = new xajaxResponse();
   //escribimos en la capa con id="respuesta" el texto que aparece en $salida
   $respuesta->addAssign("respuesta","innerHTML",$salida);

    //tenemos que devolver la instanciación del objeto xajaxResponse
   return $respuesta;
}


El objeto xajaxResponse() sirve para realizar acciones en la página sin tener que recargar el documento. Dispone de varios métodos o funciones, como por ejemplo addAssign() que sirve para asignar un valor a una propiedad de un elemento de la página. En este caso se asigna el valor contenido en la variable $salida al innerHTML de la capa "respuesta", con lo que se altera el texto contenido en esa capa.

4) Asociamos la función PHP al objeto xajax

//asociamos la función creada anteriormente al objeto xajax
$xajax->registerFunction("si_no");


Esta asociación permitirá ejecutar la función PHP desde una llamada a una función Javascript.

5) Antes de enviar cualquier contenido a la página, tenemos que ejecutar un método del objeto xajax para procesar las peticiones del que puedan llegar a la página.

//El objeto xajax tiene que procesar cualquier petición
$xajax->processRequests();


Insistimos, esta llamada al método se tiene que hacer antes de escribir ningún contenido dentro del código de la página, es decir, antes que llegue al cliente ningún carácter de código HTML.

6) Escribir el código javascript necesario para procesar las llamadas a ajax.

//En el <head> indicamos al objeto xajax se encargue de generar el javascript necesario
$xajax->printJavascript("xajax/");


Lo ideal es hacer esta llamada al método printJavascript() dentro del <head> de la página.

Si nos fijamos, el método recibe un parámetro, que es la ruta relativa para acceder al directorio donde están los archivos xajax descomprimidos.

7) Podemos hacer llamadas a las funciones PHP en cualquier lugar del código, como respuesta a las acciones del usuario con javascript.

<input type="checkbox" name="si" value="1" onclick="xajax_si_no(document.formulario.si.checked)">
Como podemos ver, desde un elemento de la página, como en este caso una casilla de verificación, al cambiar su estado, se llama a una función javascript para ejecutar la función PHP escrita anteriormente. Es decir, al pulsar el chechbox se desencadena el evento onchange y con él se llama a la función xajax_si_no() enviándo como parámetro el estado (chequeado o no) de la casilla de verificación.

Con esto es todo tenemos todo lo necesario para entender el ejemplo. Podemos verlo en ejecución en una página aparte.

Podemos ver el código del ejemplo completo a continuación, pero tener en cuenta que para que funcione tiene que disponer del código de la clase xajax, que en este caso debe estar en un subdirectorio que cuelgue del directorio donde está el archivo del ejemplo.

<?
//incluímos la clase ajax
require ('xajax/xajax.inc.php');

//instanciamos el objeto de la clase xajax
$xajax = new xajax();

function si_no($entrada){
   if ($entrada=="true"){
       $salida = "Marcado";
   }else{
       $salida = "No marcado";
   }

   //instanciamos el objeto para generar la respuesta con ajax
   $respuesta = new xajaxResponse();
   //escribimos en la capa con id="respuesta" el texto que aparece en $salida
   $respuesta->addAssign("respuesta","innerHTML",$salida);

   //tenemos que devolver la instanciación del objeto xajaxResponse
   return $respuesta;
}

//asociamos la función creada anteriormente al objeto xajax
$xajax->registerFunction("si_no");

//El objeto xajax tiene que procesar cualquier petición
$xajax->processRequests();
?>

<html>
<head>
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   <META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=ISO-8859-1">
   <title>Si / No en Ajax</title>
   <?
   //En el <head> indicamos al objeto xajax se encargue de generar el javascript necesario
   $xajax->printJavascript("xajax/");
   ?>
</head>

<body>
<div id="respuesta"></div>
<form name="formulario">
<input type="checkbox" name="si" value="1" onclick="xajax_si_no(document.formulario.si.checked)">
</form>

<script type="text/javascript">
   xajax_si_no(document.formulario.si.checked); //Llamando inicialmente a la función xajax_si_no inicializamos el valor de la capa con la respuesta
   </script>
</body>
</html>


Nota: Para ampliar la información de Xajax explorar el manual de Ajax para PHP.

Nota: En estos ejemplos hemos utilizado la versión 0.2.5 de Xajax. Por favor, leer la introducción al manual de Xajax, porque tiene algunos detalles sobre la versión y el trabajo con Xajax que conviene saber, así como el enlace para la descarga de la librería Xajax 0.2.5 para que podáis poner en marcha vosotros mismos estos ejemplos en vuestros servidores.

Referencia: Hemos publicado un artículo sobre cómo actualizar este y otros scripts de este manual a la versión 0.5 de xajax: Actualizar a Xajax 0.5.

Comentarios
Fueron enviados 36 comentarios al artículo
8 comentarios no revisados
28 comentarios revisados:
Por: Osvado
28/4/07

Estimado ..

Excelente, lo unico que puse en el codigo fue esto

<?php

$xajax->printJavascript("xajax/");
?>

Ya que en el ejemplo viene con sin "php"

De todo lo demas esta muy bien.

Realice las pruebas con el cliente firefox e internet explorer 6 y com servidor wamp5 para windows sobre xp

Saludos y mil gracias.
Osvaldo Ramirez
Por: Carmelo Carrillo
02/5/07
Más claro imposible. Es fabulosa la manera que tenéis de plasmar las cosas.

Enhorabuena chicos/as.
Por: robman
09/5/07
ya prove los ejemplos en FF2.0, IE 7 y Opera 9, y funcionan a la perfeccion
Por: Daniel
03/7/07
Tiene un solo problema, la gracia seria que cambie de estado instantaneamente sin necesidad de hacer click luego en otro lado. No se usa ajax para eso, para cambiar un simple estado con un JS es mas que suficiente.
Por: Mario
11/7/07
Probé el ejemplo http://www.desarrolloweb.com/articulos/ejemplos/ajax/xajax/checkbox_si_no.php y en Firefox 2 sí funciona pero no así con IE 6, ¿que puede estar pasando?.

Saludos
Por: Carlos alberto
18/7/07
utilice el codigo para desplegar registros de una base de datos y todo va bien, al dar clic se genera un textbox para editarlo pero se crear arriba y no dentro del div que le pongo, Que puede ser?
Por: Fresa
28/7/07
La function que llama en esta parte es "$xajax->processRequest(); " y no la aparece en la linea 28 "$xajax->processRequests(); "

Pero el resto excelente.
Gracias
Por: Rulz
01/8/07
Estoy usando el firefox 2.0.0.6 y no me jala. No me marca ningún mensaje de error y sale el checkbox, pero no despliega texto alguno, mi versión de php es 5.2.1. Espero que alguien me pueda ayudar.
Por: Oscar Beas Enriquez
14/8/07
A ver señores el script tiene dos que tres detalles que corregir de acuerdo a la libreria

Primero:

Para declarar el incio de código php hay que poner <?php y no <? como lo muestra el ejemplo, corrigiendo esto se interpretará correctamente.

Segundo:

/escribimos en la capa con id="respuesta" el texto que aparece en $salida
$respuesta->addAssign("respuesta","innerHTML",$salida);

en la clase xajaxResponse la funcion no es addAssing sino assing de manera que hay que coregirlo en el ejemplo.

Corrigiendo esos detalles me ha funcionado en IE7 a la perfección.
Por: Sergio
21/8/07
Ojo que en el código completo aparece la llamada a la función processRequest() como $xajax->processRequests(); con una "s" al final y es erróneo. Si podeis corregirlo mejor. Gracias.
Por: Cynthia
21/8/07
Muchas Gracias por el tutorial, queria añadir que donde dice $xajax->processRequests(); Tuve que remplazarlo por $xajax->processRequest(); para que funcione (sin s al final). Saludos
Por: pepe
28/8/07
Hola, voy a agrupar los cambios que habeis dixo todos para que funcione.

- Primero cambiar <? por <?php, por si no tienes activado las sentencias cortas.
-Luego fijarse en la ruta del xajax.inc.php ya que pone require ('xajax/xajax.inc.php'); y yo me he descargado la ultima version y la ruta es require ('xajax/xajax_core/xajax.inc.php');
-En $respuesta->addAssign dejarlo en $respuesta->assign ya que el metodo es assign.

Y bueno, creo que ya no me dejo nada, con estos cambios me ha funcionado en IE 6 y en Firefox 1.5.
Salu2
Por: cesar gonzalez
12/9/07
Yo de nuevo, ja ja. Con el evento "onchange" el internet explorer 7 mostraba el cambio en la leyenda cuando hacia click en cualquier parte del formulario, menos en la casilla. Probé con "onclick" y funcionó, acá les pego el codigo con el que finalmente el ejemplo funciona en internet explorer 7... Tambien funciona en Mozilla (la ultima version). Usé la version xajax_0.5_beta_4b_Full

<?php
//incluímos la clase ajax
require ('xajax/xajax_core/xajax.inc.php');

//instanciamos el objeto de la clase xajax
$xajax = new xajax();

function si_no($entrada){
if ($entrada=="true"){
$salida = "Marcado";
}else{
$salida = "No marcado po";
}

//instanciamos el objeto para generar la respuesta con ajax
$respuesta = new xajaxResponse();
//escribimos en la capa con id="respuesta" el texto que aparece en $salida
$respuesta->assign("respuesta","innerHTML",$salida);

//tenemos que devolver la instanciación del objeto xajaxResponse
return $respuesta;
}

//asociamos la función creada anteriormente al objeto xajax
$xajax->registerFunction("si_no");

//El objeto xajax tiene que procesar cualquier petición
$xajax->processRequest();
?>

<html>
<head>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=ISO-8859-1">
<title>Si / No en Ajax</title>
<?
//En el <head> indicamos al objeto xajax se encargue de generar el javascript necesario
$xajax->printJavascript("xajax/");
?>
</head>

<body>
<div id="respuesta"></div>
<form name="formulario">
<input type="checkbox" name="si" value="1" onclick="xajax_si_no(document.formulario.si.checked)">
</form>

<script type="text/javascript">
xajax_si_no(document.formulario.si.checked); //Llamando inicialmente a la función xajax_si_no inicializamos el valor de la capa con la respuesta
</script>
</body>
</html>
Por: rey
19/9/07
hola hasta ahora todo bien he bajado la ultima version del modulo xajax, he copiado el codigo tal como esta y arregle la direccion de:

//incluímos la clase ajax
require ('xajax/xajax.inc.php');

por:

//incluímos la clase ajax
require ('xajax_core/xajax.inc.php');

ya que en el modulo cuando se descompacta queda el xajax.inc.php dentro de un folder xajax_core, bueno eso no es tam importante, el caso es qu cuando ejecuto el codigo en el server me da este error:

Fatal error: Call to undefined method xajax::processRequests() in D: eysitioxajaxindex.php on line 28

que creen ustedes ?? Help!!!!

gracias de antemano
Por: jorge vadillo
27/9/07
Es muy util mezclar el ajax con php, pero este codigo no me funciona descargue el archivo xajax_0.5_beta_4b_Full.zip, y creo ke el nombre de las carpetas ya cambio ya no solo es ajax sino ajax_core en
require ('xajax/xajax.inc.php'); ahora seria
require ('xajax_core/xajax.inc.php');

tambien en esta parte
//El objeto xajax tiene que procesar cualquier petición
$xajax->processRequests();

no lleva s al final es
//El objeto xajax tiene que procesar cualquier petición
$xajax->processRequest();

ya con todo eso ya no marca error pero aun asi no me muestra nada en la capa respuesta solo se ve el checkbox.

podrian decirme porke??

gracias

Por: Begoña
15/10/07
He cambiado al evento onclick y me funciona perfectamente.

Gracias Cesar por tu constancia.
Nunca tiremos la toalla!!.
Por: Juinz
17/10/07
Hola,
Trate de ocuparlo pero no me dejo, incluso copiando el ejemplo completo al index.php. Tengo en una carpeta el index, y una carpeta xajax con todo dentro. El error que me tira dice "Fatal error: Call to undefined method xajax::processRequests()". He tratado dirigiendolo a todas las carpetas que he encontrado. Los ejemplos funcionan eso si... los que vienen con xajax. Es la ultima version beta por si acaso...
Por: jose rosales
23/10/07
Ya tambien lo probe con Opera 9.23, excelente ejemplo funciona correctamente, aunque un poco lenta la respuesta como 2 a 3 segundos, tengo procesador Pentium 4, 3gz, 512 Ram y siento que podria ir mas rapido.
Como siempre IE 7, del nabo no supo que hacer y se congelo literalmente, Firefox 2.0 excelente
Por: Jorge Aparicio
13/11/07
Tengo una implementacion de este ejemplo para votar comentarios en una web. Y el caso es que en firefox no sale el mensaje de voto registrado mientras que en explorer si. A que se puede deber esta incompatibilidad??
Por: Cristian
28/11/07
Yo probé el ejemplo en fedora 7 y no me funciona, al compilarlo por la consola me sale lo siguiente:

xajax Error: xajax failed to automatically identify your Request URI.Please set the Request URI explicitly when you instantiate the xajax object

alguien me puede decir que es eso??? necesito ayuda porfavor..
Gracias
Por: Adriana Cárdenas
10/12/07
Hola, después de realizar todos los cambios, éste es el código que me corre en IE7, hay que tener mucho cuidado con las rutas, yo puse el archivo php en la raíz del www del servidor y dentro del www un subdirectorio xajax que contiene todos los subdirectorios y archivos que se descomprimen del .zip que se baja de http://sourceforge.net
Me parace un buen ejercicio para empezar. Muchas gracias a todos por los comentarios

<?php
//incluímos la clase ajax
require ('xajax/xajax_core/xajax.inc.php');

//instanciamos el objeto de la clase xajax
$xajax = new xajax();

function si_no($entrada){
if ($entrada=="true"){
$salida = "Marcado";
}else{
$salida = "No marcado";
}

//instanciamos el objeto para generar la respuesta con ajax
$respuesta = new xajaxResponse();
//escribimos en la capa con id="respuesta" el texto que aparece en $salida
$respuesta->assign("respuesta","innerHTML",$salida);

//tenemos que devolver la instanciación del objeto xajaxResponse
return $respuesta;
}

//asociamos la función creada anteriormente al objeto xajax
$xajax->registerFunction("si_no");

//El objeto xajax tiene que procesar cualquier petición
$xajax->processRequest();
?>

<html>
<head>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=ISO-8859-1">
<title>Si / No en Ajax</title>
<?php
//En el <head> indicamos al objeto xajax se encargue de generar el javascript necesario
$xajax->printJavascript("xajax/");
?>
</head>

<body>
<div id="respuesta"></div>
<form name="formulario">
<input type="checkbox" name="si" value="1" onclick="xajax_si_no(document.formulario.si.checked)">
</form>

<script type="text/javascript">
xajax_si_no(document.formulario.si.checked); //Llamando inicialmente a la función xajax_si_no inicializamos el valor de la capa con la respuesta
</script>
</body>
</html>
Por: Rodrigo Solorzano Pardo
17/12/07
Probado en FIREFOX 2.0.0.7 y IE 7.0
Mi carpeta XAJAX la tengo en el ROOT de WWW

Ojo el evento onchange hay que cambiarlo por onclick!

$xajax->processRequests(); hay que cambiarlo por $xajax->processRequest(); quitando la ultima s


$respuesta->addAssign("respuesta","innerHTML",$salida); hay que cambiarlo por
$respuesta->assign("respuesta","innerHTML",$salida);

Finalmente
$xajax->printJavascript("../xajax/");

se debe tener en cuenta la localizacion del directorio principal de XAJAX



<?php


require_once("../xajax/xajax_core/xajax.inc.php");
-
//instanciamos el objeto de la clase xajax
$xajax = new xajax();

function si_no($entrada){
if ($entrada=="true"){
$salida = "Marcado";
}else{
$salida = "No marcado";
}

//instanciamos el objeto para generar la respuesta con ajax
$respuesta = new xajaxResponse();
//escribimos en la capa con id="respuesta" el texto que aparece en $salida
//$respuesta->addAssign(\"respuesta\",\"innerHTML\",$salida);
$respuesta->assign("respuesta","innerHTML",$salida);

//tenemos que devolver la instanciación del objeto xajaxResponse
return $respuesta;
}


//asociamos la función creada anteriormente al objeto xajax
$xajax->registerFunction("si_no");

//El objeto xajax tiene que procesar cualquier petición
$xajax->processRequest();


//$sLocalFolder = dirname(__FILE__);
//echo $sLocalFolder;


?>


<html>
<head>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=ISO-8859-1">
<title>Si / No en Ajax</title>
<?php
//En el <head> indicamos al objeto xajax se encargue de generar el javascript necesario
$xajax->printJavascript("../xajax/");
?>
</head>

<body>
<div id="respuesta"></div>
<form name="formulario">
<input type="checkbox" name="si" value="1" onchange="xajax_si_no(document.formulario.si.checked)">
</form>

<script type="text/javascript">
xajax_si_no(document.formulario.si.checked); //Llamando inicialmente a la función xajax_si_no inicializamos el valor de la capa con la respuesta
</script>
</body>
</html>

Por: Carlos
20/12/07
Hola,
Implemento tal cual el código pero no funciona (tengo que incluir alguna archivo .php o .js más), me da el siguiente error:

<br />

<b>Fatal error</b>: Call to undefined method xajaxResponse::addAssign() in <b>C:ServidorWEBappwebroot

probaXajax.php</b> on line <b>19</b><br />

Que estoy haciendo mal???
Gracias.
Por: wilson
30/12/07
Son muy buenos sus ejemplos de xajax, solo que no funcionan con la ultima version, por favor corrijanlos, muchas gracias.
Por: Felipe
21/1/08
El llamado $xajax->processRequests(); no me sirve, creo que es $xajax->processRequest();

Lo probé pero con otro servidor "Abbys" en vez de Apache y no funcionó aunque no me generó error.

No entiendo bien si en realidad el servidor puede afectar el resultado final.
Por: Miguel Angel
23/1/08
Efectivamente, el evento onchange habría que cambiarlo por onclick para que funcione en Iexplorer. Luego el problema del ejemplo no es del framework xajax, sino de mi programación en Javascript, y que no lo había probado en Iexplorer. Perdonar las molestias.

Lo he actualizado en el artículo y el ejemplo.

Gracias
Por: Miguel Angel
23/1/08
Sobre el tema del $xajax->processRequests();

Será la versión del xajax o cualquier otra cosa, porque en mis ejemplos si le quito la "s" final, me da un error de función no definida.

Eso os lo aseguro, aunque simplemente probar vosotros con lo que os funcione.
Por: Rudy Lopez Echeverria
28/1/09
Hola. gracias por sus comentarios.
Alqguien podria ayudarme o darme una pauta.

Yo uso la herramienta "adodb" para conectarme a la base de datos y cuando quiero unirlos me sale el siguiente error.

" Output has already been sent to the browser at C:AppServwwwajaxase.php:7. Please make sure the command $xajax->processRequest() is placed before this."

quiere decir que la informacion ya se envio al explorador, como podria solucionar esto. POR FAVOR UNA AYUDA

Manuales relacionados
Categorias relacionadas
El autor
Últimas noticias
Alojados en el grupo