> Manuales > Trabajo con Ajax en PHP utilizando Xajax

Complicamos un poco el envío y procesamiento de un formulario con Ajax y PHP, para realizar validaciones en el servidor y mostrar mensajes de error si la validación falló.

Estuvimos haciendo en un artículo anterior una página que envía un formulario con PHP y Ajax y lo procesa, devolviendo los resultados sin que se tenga que recargar la página. Ahora vamos a complicar ese ejemplo, creando un formulario que tiene distintas validaciones en el servidor. El formulario no se procesa hasta que no se valide correctamente la información y se muestran los posibles errores dentro de la propia página.

Hay un artículo publicado anteriormente que habría que leer para poder entender este nuevo ejemplo: Recibir y procesar formulario con Ajax y PHP.

Veamos antes, si se desea, el resultado buscado en este ejemplo.

El formulario y la zona de mensajes

El formulario que hemos utilizado es muy parecido al anterior. Sólo le hemos añadido un campo más, de tipo checkbox, para realizar una validación un poco más compleja. Además, hemos incorporado una capa más para mostrar mensajes.

<div id="mensaje">
Rellena los datos de este formulario y pulsa "Enviar"
</div>
<br />
<div id="capaformulario">
<form id="formulario">
Nombre: <input type="text" name="nombre" />
<br />
Apellidos: <input type="text" name="apellidos" />
<br />
<input type="checkbox" name="acepto" value="1" /> Acepto los términos y condiciones ;)
<br />
<input type="button" value="Enviar" onclick="xajax_procesar_formulario(xajax.getFormValues('formulario'))" />
</form>
</div>


La capa de mensajes nos servirá para mostrar textos, como errores de validación, cuando se produzcan. El formulario está en una capa independiente, que sólo actualizaremos si finalmente se realiza el procesamiento de sus datos.

Ahora veamos la función PHP que realizará la validación. Si se produjeron errores en la validación actualizará la capa "mensaje" para mostrar el error. Si todo es correcto, procesará el formulario, mostrará un mensaje de confirmación en la capa "mensaje" y el resultado de procesar el formulario en la capa "capaformulario". Es una función un poco larga:

function procesar_formulario($form_entrada){
   //creo el xajaxResponse para generar una salida
   $respuesta = new xajaxResponse('ISO-8859-1');

   //validación
   $error_form = "";
   if ($form_entrada["nombre"] == "")
      $error_form = "Debes escribir tu nombre";
   elseif ($form_entrada["apellidos"] == "")
      $error_form = "Debes escribir tus apellidos";
   elseif (!isset($form_entrada["acepto"]))
      $error_form = "Debes aceptar los términos y condiciones";
      
   //compruebo resultado de la validación
   if ($error_form != ""){
      //Hubo un error en el formulario
      //en la capa donde se muestran mensajes, muestro el error
      $respuesta->addAssign("mensaje","innerHTML","<span style='color:red;'>$error_form</span>");
   }else{
      //es que no hubo error en el formulario
      $salida = "Hemos procesado esto:<p>";
      $salida .= "Nombre: " . $form_entrada["nombre"];
      $salida .= "<br>Apellidos: " . $form_entrada["apellidos"];
      
      //mostramos en capa mensaje el texto que está todo correcto
      $respuesta->addAssign("mensaje","innerHTML","<span style='color:blue;'>Todo correcto... Muchas gracias!</span>");
      //escribimos en la capa con id="capaformulario" el texto que aparece en $salida
      $respuesta->addAssign("capaformulario","innerHTML",$salida);
      
      //tenemos que devolver la instanciación del objeto xajaxResponse
   }
   return $respuesta;
}

La función está comentada, por lo que se podrá entender. Lo importante es fijarse en cómo se instancia el objeto de la clase xajaxResponse y cómo se invocan los distintos métodos para actualizar el contenido de las capas "mensaje" y "capaformulario".

Luego está el tema de las validaciones y la comprobación para saber si hubo un error o no en los datos. Este podría servir de esquema general, pero tema de las validaciones cada persona lo tendrá que implementar según sus necesidades.

Solución para los acentos en xajax

También vamos a ver un par de detalles acerca de los acentos en Ajax, que nos resolverán más de un dolor de cabeza. Posiblemente hayamos podido comprobar en este ejemplo, o en otros anteriores de Ajax, que los acentos muchas veces se ven mal, convertidos en algún carácter raro. Esto lo podemos solucionar de varias maneras con xajax, y nosotros hemos implementado una de ellas en este ejemplo.

Primero, cuando se crea la instancia del objeto xajax, podemos decirle con qué juego de caracteres queremos trabajar. Y además, podemos decirle que cualquier cadena que nos envíen por POST o GET se convierta automáticamente al juego de caracteres que estamos usando.

//instanciamos el objeto de la clase xajax
$xajax = new xajax();
$xajax->setCharEncoding('ISO-8859-1');
$xajax->decodeUTF8InputOn()

Luego, cuando hacemos las instancias del objeto de la clase xajaxResponse para generar la salida, también tenemos que indicar en qué juego de caracteres estamos trabajando, si no podría dar problemas.

$respuesta = new xajaxResponse('ISO-8859-1');

Esto se hace en la función PHP que procesa los datos y genera la salida. Ya habíamos visto anteriormente el código de esta función.

Así quedaría el código completo de este ejemplo:

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

//instanciamos el objeto de la clase xajax
$xajax = new xajax();
$xajax->setCharEncoding('ISO-8859-1');
$xajax->decodeUTF8InputOn();

function procesar_formulario($form_entrada){
   //creo el xajaxResponse para generar una salida
   $respuesta = new xajaxResponse('ISO-8859-1');

   //validación
   $error_form = "";
   if ($form_entrada["nombre"] == "")
      $error_form = "Debes escribir tu nombre";
   elseif ($form_entrada["apellidos"] == "")
      $error_form = "Debes escribir tus apellidos";
   elseif (!isset($form_entrada["acepto"]))
      $error_form = "Debes aceptar los términos y condiciones";
      
   //compruebo resultado de la validación
   if ($error_form != ""){
      //Hubo un error en el formulario
      //en la capa donde se muestran mensajes, muestro el error
      $respuesta->addAssign("mensaje","innerHTML","<span style='color:red;'>$error_form</span>");
   }else{
      //es que no hubo error en el formulario
      $salida = "Hemos procesado esto:<p>";
      $salida .= "Nombre: " . $form_entrada["nombre"];
      $salida .= "<br>Apellidos: " . $form_entrada["apellidos"];
      
      //mostramos en capa mensaje el texto que está todo correcto
      $respuesta->addAssign("mensaje","innerHTML","<span style='color:blue;'>Todo correcto... Muchas gracias!</span>");
      //escribimos en la capa con id="capaformulario" el texto que aparece en $salida
      $respuesta->addAssign("capaformulario","innerHTML",$salida);
      
      //tenemos que devolver la instanciación del objeto xajaxResponse
   }
   return $respuesta;
}
//registramos la función creada anteriormente al objeto xajax
$xajax->registerFunction("procesar_formulario");

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

   <title>Enviar y procesar un formulario con Ajax y PHP</title>
   <?
   //En el <head> indicamos al objeto xajax se encargue de generar el javascript necesario
   $xajax->printJavascript("xajax/");
   ?>
</head>

<body>
<h1>Recibir y procesar formulario con Ajax y PHP</h1>
<div id="mensaje">
Rellena los datos de este formulario y pulsa "Enviar"
</div>
<br />
<div id="capaformulario">
<form id="formulario">
Nombre: <input type="text" name="nombre" />
<br />
Apellidos: <input type="text" name="apellidos" />
<br />
<input type="checkbox" name="acepto" value="1" /> Acepto los términos y condiciones ;)
<br />
<input type="button" value="Enviar" onclick="xajax_procesar_formulario(xajax.getFormValues('formulario'))" />
</form>
</div>

</body>
</html>


Podemos ver el resultado final de este ejercicio.

Miguel Angel Alvarez

Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...

Manual