Portada | Monotemáticos | Secciones | Desarrolladores | Comunidad | Servicios | Servicios profesionales | RSS
Desde 0 | HTML | CSS | ASP | PHP | AJAX | Javascript | Promoción de webs | Rentabilidad de webs
Directorio | Manuales | Scripts | FAQs | Programas | Artículos Copyleft | Actualidad | La Cosecha | Colabora
Registrarse | Vuestras páginas | Foros del web | Lista de correo | Boletín de novedades
Generador METAs | Compras | Busca cursos
Alojamiento | Dominios.es | Micropagos SMS | Buscadores | Patentes, marcas | Creación web | Multimedia | Videos
Desarrollo Freelance | Buscar proyectos | Buscar profesionales | Solicitar desarrollo

Validación previa de un campo de texto con Ajax y PHP


Hacemos un nuevo ejercicio con Ajax y PHP usando la librería Xajax, en el que validamos el nombre de un país antes de enviar el formulario.


25/12/07 - A veces las páginas utilizan interfaces complejas para validar campos de un formulario antes de enviarlo. Posiblemente ya hemos visto alguno de estos controles personalizados en alguna página web. No obstante, para explicar lo que vamos a hacer, es una buena idea ver el ejemplo en marcha.

Este componente de formulario, que incorpora Javascript + Ajax + PHP + Base de datos MySQL, sirve para que un visitante que escribe un nombre de país, lo valide apretando un botón para ver si existe o se ha escrito correctamente. En caso que el usuario escriba sólo unas letras del nombre del país, por ejemplo "es", cuando aprieta el enlace de validar, el componente busca todos los países que tienen ese texto y los muestra para que el usuario elija el que desea.

Antes de continuar conviene decir que este taller está creado como continuación de una serie de artículos sobre la librería Xajax para el trabajo con Ajax y PHP. Hay temas importantes que no vamos a explicar porque ya se vieron en capítulos anteriores.

El formulario HTML

Comenzamos mostrando el formulario que hemos utilizado para construir el ejemplo:

<div id="todo_formulario">
   <form action="#" method="post" name="f1" id="f1">
   <div id="input_pais">
      Nombre país: <input type="text" name="nombre_pais"> <a style='cursor:pointer;text-decoration:underline; color:#0000ff;' onclick="xajax_validar_pais(document.f1.nombre_pais.value);">Validar pais</a>
   </div>
   <div id="validador_pais"></div>
   <p>
   Año de visita: <input type="text" name="ano" size="8">
   <p>
   <input type="button" onclick="xajax_procesar_formulario(xajax.getFormValues('f1'))" value="Enviar">
   </form>
</div>

Tenemos un campo de texto donde el usuario escribe el país, un enlace al lado para validarlo y unas capas o etiquetas <div> que delimitan ciertas áreas donde vamos a mostrar datos desde Ajax. Luego hay un botón para enviar el formulario, que también se procesa con una llamada a una función Javascript que hace uso de Ajax.

La llamada Ajax para validar el país

Tenemos una función creada con PHP, que hace uso de XajaX para poder procesarla con Ajax, que es la que se encarga de validar lo que haya escrito el usuario en el campo país.

xajax_validar_pais(document.f1.nombre_pais.value);

La función recibe el value del campo input nombre_pais, es decir, lo que haya escrito en el momento de pulsar el enlace.

function validar_pais($nombre_pais){
   if (strlen($nombre_pais)<2) {
      $campo_validacion = "Debes escribir al menos dos letras del campo país.";
   }else{
      $ssql = "select * from pais where nombre_pais like '%$nombre_pais%'";
      $rs = mysql_query($ssql);
      if (mysql_num_rows($rs)==0){
         $campo_validacion = "No he encontrado países con ese nombre";
      }else{
         $campo_validacion = "<i>Se encontraron " . mysql_num_rows($rs) . " posibles países.</i>";
         $campo_validacion .= '<div style="margin:3px;">';
         while ($fila = mysql_fetch_object($rs)){
            $campo_validacion .= "<a style='cursor:pointer;text-decoration:underline; color:#0000ff;' onclick='selecciona_pais(\"" . $fila->nombre_pais . "\");'>";
            $campo_validacion .= $fila->nombre_pais . '</a><br>';
         }
         $campo_validacion .= '</div>';
      }
   }
   $campo_validacion = '<div style="border: 2px solid #0000cc; font-size: 8pt; padding:5px; margin-top:10px; width: 300px;">' . $campo_validacion . '</div>';
   
   $respuesta = new xajaxResponse('ISO-8859-1');
   $respuesta->addAssign("validador_pais","innerHTML",$campo_validacion);
   return $respuesta;
}

Lo primero que se comprueba es que el usuario haya escrito al menos dos caracteres en el campo país.

Luego se hace una consulta en la base de datos para seleccionar todos los países que tienen el texto escrito en el campo. Si no encuentra ninguno se muestra un mensaje de error. Si encuentra uno o más países se muestra el listado de naciones encontradas para que el usuario seleccione cuál es la que le interesa. Se utilizan las funciones proporcionadas por un objeto del framework xajax (de la clase xajaxResponse) para mostrar los resultados en la página si refrescar el documento.

Función para procesar el formulario con Ajax y PHP

Para procesar el formulario utilizamos también Ajax y PHP. Para ello hemos realizado la siguiente función PHP que se ejecuta por medio de Ajax:

function procesar_formulario($formulario){
   $respuesta = new xajaxResponse('ISO-8859-1');
   if (!isset($formulario["nombre_validado"])){
      $respuesta->addAssign("validador_pais","innerHTML",'<div style="border: 2px solid #cc0000; font-size: 8pt; padding:5px; margin-top:10px; width: 300px;">Tienes que validar el país.</div>');
   }else{
      $respuesta->addAssign("todo_formulario","innerHTML",'Todo correcto!');
   }
   return $respuesta;
}

El formulario comprueba que se haya validado anteriormente el país, para que permita procesarlo.

Javascript para escoger el país deseado

Luego hay una función que también se debe comentar, que es una función Javascript pura, que se procesa totalmente en el cliente, cuando el usuario selecciona el país que desea de los países encontrados al validar el país.

<script>
function selecciona_pais(nombre){
   document.f1.nombre_pais.value=nombre
   document.getElementById("validador_pais").innerHTML='<div style="border: 2px solid #00cc00; font-size: 8pt; padding:5px; margin-top:10px; width: 300px;">Validado correctamente</div>';
   document.getElementById("input_pais").innerHTML='<input type="hidden" name="nombre_validado" value="' + nombre + '">' + nombre
}
</script>

Esta función se ejecuta al pulsar cualquier país de la lista de países encontrados y actualiza el contenido HTML de un par de capas, para mostrar el resultado en la interfaz de usuario y generar un campo hidden con el nombre del país ya validado.

El ejercicio puede resultar complejo, pero no lo es tanto si conocemos de antemano el funcionamiento de las librerías Xajax.

El código completo lo mostramos a continuación:

<?
//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();

//conecto con la base de datos
$connectid = mysql_connect("localhost", "root", "");
mysql_select_db("xajax",$connectid);

function validar_pais($nombre_pais){
   if (strlen($nombre_pais)<2) {
      $campo_validacion = "Debes escribir al menos dos letras del campo país.";
   }else{
      $ssql = "select * from pais where nombre_pais like '%$nombre_pais%'";
      $rs = mysql_query($ssql);
      if (mysql_num_rows($rs)==0){
         $campo_validacion = "No he encontrado países con ese nombre";
      }else{
         $campo_validacion = "<i>Se encontraron " . mysql_num_rows($rs) . " posibles países.</i>";
         $campo_validacion .= '<div style="margin:3px;">';
         while ($fila = mysql_fetch_object($rs)){
            $campo_validacion .= "<a style='cursor:pointer;text-decoration:underline; color:#0000ff;' onclick='selecciona_pais(\"" . $fila->nombre_pais . "\");'>";
            $campo_validacion .= $fila->nombre_pais . '</a><br>';
         }
         $campo_validacion .= '</div>';
      }
   }
   $campo_validacion = '<div style="border: 2px solid #0000cc; font-size: 8pt; padding:5px; margin-top:10px; width: 300px;">' . $campo_validacion . '</div>';
   
   $respuesta = new xajaxResponse('ISO-8859-1');
   $respuesta->addAssign("validador_pais","innerHTML",$campo_validacion);
   return $respuesta;
}

function procesar_formulario($formulario){
   $respuesta = new xajaxResponse('ISO-8859-1');
   if (!isset($formulario["nombre_validado"])){
      $respuesta->addAssign("validador_pais","innerHTML",'<div style="border: 2px solid #cc0000; font-size: 8pt; padding:5px; margin-top:10px; width: 300px;">Tienes que validar el país.</div>');
   }else{
      $respuesta->addAssign("todo_formulario","innerHTML",'Todo correcto!');
   }
   return $respuesta;
}

//registramos funciones
$xajax->registerFunction("validar_pais");
$xajax->registerFunction("procesar_formulario");

//El objeto xajax tiene que procesar cualquier petición
$xajax->processRequests();
?>
<html>
<head>
   <title>Validador campo formulario online</title>
   <?
   //En el <head> indicamos al objeto xajax se encargue de generar el javascript necesario
   $xajax->printJavascript("xajax/");
   ?>
   <script>
   function selecciona_pais(nombre){
      document.f1.nombre_pais.value=nombre
      document.getElementById("validador_pais").innerHTML='<div style="border: 2px solid #00cc00; font-size: 8pt; padding:5px; margin-top:10px; width: 300px;">Validado correctamente</div>';
      document.getElementById("input_pais").innerHTML='<input type="hidden" name="nombre_validado" value="' + nombre + '">' + nombre
   }
   </script>
</head>

<body style="font-family: arial, verdana;">
<div id="todo_formulario">
   <form action="#" method="post" name="f1" id="f1">
   <div id="input_pais">
      Nombre país: <input type="text" name="nombre_pais"> <a style='cursor:pointer;text-decoration:underline; color:#0000ff;' onclick="xajax_validar_pais(document.f1.nombre_pais.value);">Validar pais</a>
   </div>
   <div id="validador_pais"></div>
   <p>
   Año de visita: <input type="text" name="ano" size="8">
   <p>
   <input type="button" onclick="xajax_procesar_formulario(xajax.getFormValues('f1'))" value="Enviar">
   </form>
</div>

<?
mysql_close($conn);
?>
</body>
</html>

Para acabar, podemos ver el ejemplo en marcha.

 Seguir navegando a partir aquí:
+ 1 manual relacionado
+ 1 categoria relacionada

 Autoría, licencia y acciones sobre este artículo

Informe de Miguel Angel Alvarez*
Director de DesarrolloWeb.com

Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

* Para consultas técnicas utilizar la lista de correo.

Versión imprimible Versión imprimible del artículo
Enviar artículo por e-mail Enviar artículo por e-mail
Añadir un comentario al artículo Publicar un comentario del artículo

Manuales relacionados con este artículo
Dentro de Manual Xajax: trabajo con Ajax en PHP

Categorias relacionadas
A través de las categorías de nuestro directorio se pueden encontrar otro tipo de recursos relacionados con este artículo:
+ Entrar en Ajax


 Comentarios de los visitantes
Aun no hemos recibido comentarios de este artículo.
Puedes ser el primero en enviar tu comentario.



Enlaces:
Maestrosdelweb
  Ir arriba

Manuales relacionados
+Manual Xajax: trabajo con Ajax en PHP
Categorías
+Ajax

Tienda DesarrolloWeb

DesarrolloWeb.com | Copyright | Anunciese | Acerca de | Datos legales | Contacta | Por GuiarteMultimedia