Mostrando entradas con la etiqueta AJAX. Mostrar todas las entradas
Mostrando entradas con la etiqueta AJAX. Mostrar todas las entradas

domingo, 2 de febrero de 2014

Mensaje de espera al enviar formularios con PHP


Supongamos que tenemos un formulario en PHP y que el procesamiento de los datos del mismo puede ser lento, en este caso es importe que los usuarios sepan que se está realizando el proceso y que deben esperar por esto. Para ello vamos a ver como mostrar un cuadro de espera.
Lo que vamos a hacer es crear dos archivos PHP que en este caso voy a llamar formulario.php, donde se encontrará el formulario, y procesar_formulario.php que será el archivo que será llamado a través de AJAX, mientras este se procese aparecerá un cudro de en espera.
El primero de ellos tendrá el formulario y su contenido es el siguiente:


  <html>
    <head>

     
      <!-- Estilo para el cuadro de espera -->
      <style>           
        .waiting {
          width:210px;
          height:35px;
          position:absolute;
          left:50%;
          top:50%;
          margin:-100px 0 0 -150px;
          border-radius: 10px;
          border: 1px solid #cccccc;
          background-color: white;
          padding: 5px;   
          display:none;
        }
      </style>       


      
     
       <!-- Librerías de jquery -->
       <script type="text/javascript" language="javascript" 
                                     src="jquery-1.11.0.min.js"></script>

      <script>
       // Función para recolocar el cuadro de espera en función del
       // tamaño del navegador
        $(window).resize(function() {
          $('.waiting').css({
            position: 'absolute',
            left: ($(window).width() - $('.waiting').outerWidth()) / 2,
            top: ($(window).height() - $('.waiting').outerHeight()) / 2
            });
        });


       
// Ejecutar el resize una primera vez
        $(window).resize();

       
// Función que va a enviar el formulario
        function enviarFormulario() {
          try
          {

            // Parámetros que se van a pasar
            var datos = {
              "nombre": document.getElementById("nombre").value,
              "apellidos": document.getElementById("apellidos").value
            };

           
            // Función de jquery que ejecuta la petición ajax
            $.ajax({
              data: datos,
              url: 'procesar_formulario.php',
              type: 'post',
              beforeSend: function() {                
                // Mostrar la pantalla de procesando antes de realizar la llamada
                document.getElementById("waiting").style = "display:block";
              },
              success: function(respuesta) {
                // Si se realiza con éxito la llamada entonces

                // se muestra el resultado de la misma y 
                // se oculta el cuadro de espera
                $("#respuesta_ajax").html(respuesta);
                document.getElementById("waiting").style = "display:none";
              }
            });
          }
          catch (err)
          {
            alert(err);
          }
        }
      </script>

    </head>

    <body>




     
<!-- Cuadro de espera -->
      <div id="waiting" class="waiting" >
        <div style="float:left">

          <!-- Imagen animada. Podeis generar las vuestras en 
               http://www.ajaxload.info/-->
          <img src="ajax-loader.gif" align="middle"/>
        </div>
        <div style="float:left; padding-top:5px;padding-left: 15px;

          font-weight: bold;">Procesando  petici&oacute;n ....</div>
      </div>    



     
<!-- Div para mostrar el resultado de la petición ajax -->
      <div id="respuesta_ajax"></div>

     
<!-- Formulario --> 
      <form>
        <div style="display:table-row">
          <div style="display: table-cell">Nombre:</div>
          <div style="display: table-cell"><input type="text" id="nombre"/></div>
        </div>

        <div style="display:table-row">
          <div style="display: table-cell">Apellidos:</div>
          <div style="display: table-cell"><input type="text" id="apellidos"/>

          </div>
        </div>       

        <div>
          <input type="button" value="Enviar Datos" onclick="enviarFormulario();">
        </div>

      </form>
    </body>
  </html>




El segundo es el que procesará los datos del formulario:



<?php

  // Esperar 20 segundos (para que se muestre bien el cuadro de en espera)
  sleep(20);

  // Leer los datos del formulario y mostrarlos
  echo htmlspecialchars($_POST['nombre']).' '

        .htmlspecialchars($_POST['apellidos']);
?> 


Con esto ya tenemos un formulario con un mensaje de espera en su procesamiento.

viernes, 27 de julio de 2012

Primeros pasos con Ajax

AJAX ( Asynchronous JavaScript And XML). Se trata de una tecnología orientada a la creación de aplicaciones Web interactivas. La idea es que la aplicación se comunique con el servidor sin necesidad de recargar la página entera.

Vamos a ver un ejemplo sencillo que consiste en cargar el contenido de un archivo de texto que se encuentra en el servidor y lo muestra en pantalla.

Lo primero que debemos hacer es crear un archivo html en el cual incluiremos el siguiente código


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Mi primer AJAX</title>

<script type="text/javascript">
var peticion;
// Función que carga el archivo
function loadText()
{   
  try
  {
    if (peticion.readyState == 4)
    {       
      if (peticion.status == 200)
      {       
        // Mostrar el contenido       
        document.getElementById('contenido').innerHTML = document.getElementById('contenido').innerHTML + '<br/>' + peticion.responseText;       
      }
    }
  }
  catch (err)
  {
    alert(err);
  }
}

function cargar()
{
  try
  {
    // Obtener la instancia del objeto XMLHttpRequest
    peticion = new XMLHttpRequest();
    // Preparar la funcion de respuesta. Con indicamos que funcción ejecutar
    // cuando el servidor retorne la respuesta
    peticion.onreadystatechange = loadText;

    // Preparar la petición
    peticion.open('GET', 'http://localhost/ajax/ajax.txt', true);
    // Enviar la petición al servidor
    peticion.send(null);
  }
  catch (err)
  {
    alert(err);
  }
}

</script>

</head>
<body>
    <input type="button" value="Cargar Archivo" onclick="javascript:cargar();"/>
    <div id="contenido" style="cursor:pointer" onclick=""></div>
</body>
</html>



Vamos a analizar un poco el código. En nuestra página web tendremos un botón y un contenedor div. Cuando se pulsa sobre el botón se ejecuta la función cargar y es en esta función donde vamos a usar AJAX.

Lo primero que se hace en la función cargar es obtener objeto que implementa la interfase XMLHttpRequest. XMLHttpRequest es una interfase utilizada para realizar peticiones HTTP y HTTPS a servidores Web.



  peticion = new XMLHttpRequest();


Posteriormente enlazamos la asignamos la función loadText a la propiedad onreadystatechange. Esto hace que cada vez que el atributo readyState del objeto petición cambie. En la función loadText se verifica que el estado tenga el valor 4, en este momento el servidor a respondido y la respuesta está disponible. Por otro lado se verifica que la respuesta es correcta para esto se verifica el atributo status si el valor es 200 entonces la petición se ha devuelto correctamente.


  peticion.onreadystatechange = loadText;



Finalmente se prepara la conexión y se envía la misma. Para preparar la conexión se usa la función open que tiene res parámetros:
  • String que indica el tipo de petición. Esta puede tener los valores GET, POST o HEAD. En el caso del ejemplo la url donde he puesto el recurso es http://localhost:/ajax/ajax.txt.
  • La url del recurso.
  • Un tercer parámetro opcional que indica si la petición será síncrona o asíncrona. Sólo usaremos este parámetro con el valor a falso si no necesitamos esperar por la respuesta.
Una vez preparada la conexión se ejecuta la función send que se encarga de mandar la petición al servidor. Esta función tiene como parámetro un string que se usará para el paso de parámetros a las peticiones de tipo POST.




    // Preparar la petición
    peticion.open('GET', 'http://localhost:/ajax/ajax.txt', true);
    // Enviar la petición al servidor
    peticion.send(null);


Finalmente se añade al contenido al div

  
        // Mostrar el contenido       
        document.getElementById('contenido').innerHTML = document.getElementById('contenido').innerHTML + '<br/>' + 

        peticion.responseText;