Foros del Web » Programando para Internet » Javascript »

Formulario que se envía por email, validación en JS y mostrar mensaje

Estas en el tema de Formulario que se envía por email, validación en JS y mostrar mensaje en el foro de Javascript en Foros del Web. Hola, a ver si alguien me puede echar una manita, tengo un formulario cuyo contenido se envía mediante PHP por email, todo funciona a la ...
  #1 (permalink)  
Antiguo 13/04/2015, 14:09
Avatar de GekoDH  
Fecha de Ingreso: diciembre-2014
Ubicación: Ourense
Mensajes: 58
Antigüedad: 9 años, 4 meses
Puntos: 0
Pregunta Formulario que se envía por email, validación en JS y mostrar mensaje

Hola, a ver si alguien me puede echar una manita, tengo un formulario cuyo contenido se envía mediante PHP por email, todo funciona a la perfección a excepción de que al enviar el formulario el mensaje de éxito/error aparece en una nueva página. Me gustaría poder validar el formulario con JS o JQuery antes de que el usuario le de a enviar (marcar en rojo los campos que están mal) y, una vez enviado el formulario, mostrar el mensaje de éxito debajo del botón sin recargar página.
A ver si alguien me puede explicar el tema este, darme alguna pista o decirme al menos por donde empezar para poder intentar continuar yo, sé que igual es mucho trabajo para pedirlo así por la cara pero es que ahora mismo estoy con el agua al cuello

HTML
Código:
<form action="envio.php" method="post">
                <label>Nombre </label>
                <input type="text" name="name"><br>
                <label>Email</label> 
                <input type="text" name="email"><br>
                <label>Teléfono</label> 
                <input type="text" name="phone"><br>
                <label>Mensaje</label>
                <textarea name="message"></textarea><br>
                <input id="submit" type="submit" name="submit" value="Enviar">
</form>
PHP

Código:
<?php 
if(isset($_POST['submit'])){
    $to = "[email protected]"; // email destinatario
    $from = $_POST['email']; // email del cliente
    $name = $_POST['name'];
    $phone = $_POST['phone'];
    $mes = $_POST['message'];
    $subject = "Formulario web";
    $subject2 = "Copia de su formulario de consulta";
    $message = $name . " con número de teléfono: " . $phone . " escribió lo siguiente:" . "\n\n" . $_POST['message'];
    $message2 = "Aquí tiene una copia de su mensaje " . $name . "\n\n" . $_POST['message'];

    $headers = "From:" . $from;
    $headers2 = "From:" . $to;
    $success = (preg_match("/^[0-9]{9}$/",$phone) && preg_match("/^[a-zA-Z]*$/",$name) && $mes!='' && filter_var($from, FILTER_VALIDATE_EMAIL));
    if ($success){
    mail($to,$subject,$message,$headers);
    mail($from,$subject2,$message2,$headers2); // copia para el cliente
        echo "Formulario enviado. Muchas gracias " . $name . ", en breve contactaremos con usted.";
    }
    else{
        echo "Lo sentimos, se ha producido un error al enviar el formulario, revise su contenido y vuelva a intentarlo.";
    }
   
}
?>
  #2 (permalink)  
Antiguo 13/04/2015, 15:24
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Formulario que se envía por email, validación en JS y mostrar mensaje

Antes de que se realice el envío de los datos del formulario, debes de cancelar el evento submit, el cual se ejecuta al momento de enviar los datos del formulario a procesarse. Para esto, debes de usar el método preventDefault. Luego de esto, puedes usar ya sea códigos ASCII o expresiones regulares para realizar las validaciones.

Por ejemplo, supongamos que el formulario tuviera un solo campo de texto y deseas que solamente contenga letras del alfabeto inglés (sin eñes, tildes ni diéresis) y espacios, esta sería la manera de hacerlo con expresiones regulares (la cual me parece más conveniente que usar códigos ASCII):

Código HTML:
Ver original
  1. <form id = "id_form">
  2.     Texto: <input type = "text" name = "ejemplo" />
  3.     <input type = "submit" />
  4. </form>

Código Javascript:
Ver original
  1. var form = document.querySelector("#id_form"), //Tomo al formulario
  2.     input = form.ejemplo, //Tomo a la caja de texto
  3.     patron = /^[a-z\s]+$/gi; //Expresión regular de validación
  4.  
  5. form.addEventListener("submit", function(event){ //Cuando se intente enviar los datos
  6.     event.preventDefault(); //Cancelo el envío
  7.  
  8.     if (patron.test(input.value)){ //Si el texto escrito concuerda con la expresión regular
  9.         form.submit(); //Envío los datos del formulario
  10.     }
  11.     else{ //Caso contrario
  12.         input.style.border = "1px red solid"; //Le añado un borde rojo a la caja de texto
  13.     }
  14. }, false);

La expresión regular consiste de lo siguiente:
  • ^: Inicio de la cadena.
  • $: Fin de la cadena.
  • a-z: Rango de letras de la A a la Z.
  • \s: Espacio en blanco.
  • []: Para crear un grupo de caracteres.
  • +: De una a más coincidencias.
  • g: Modificador de patrón para realizar una búsqueda global.
  • i: Modificador de patrón para realizar una búsqueda sin distinguir entre mayúsculas y minúsculas.

En el ejemplo, utilizo el método test para comparar a la expresión regular con el valor de la caja de texto. Este método devuelve true cuando todo concuerda y false cuando no es así. También hay otros métodos que puedes usar, como match, compile y exec.

También puedes realizar validaciones con los atributos pattern y required de HTML5, con los cuales te ahorrarías todas estas líneas de código. La única desventaja está en que si el usuario accede desde un navegador que no tenga soporte para el estándar HTML5, no surtirá efecto y, en ese caso, tendrías que echar mano de JavaScript.

No olvides validar del lado del servidor.

Saludos

EDITO: Como deseas que no se recargue la página al realizar el envío, necesitas realizar una petición asíncrona.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 13/04/2015 a las 15:35 Razón: Explicación de expresiones
  #3 (permalink)  
Antiguo 14/04/2015, 08:15
Avatar de GekoDH  
Fecha de Ingreso: diciembre-2014
Ubicación: Ourense
Mensajes: 58
Antigüedad: 9 años, 4 meses
Puntos: 0
Respuesta: Formulario que se envía por email, validación en JS y mostrar mensaje

Muchas gracias, me ha servido de mucha ayuda y ya tengo un formulario bastante majo casi terminado :D

Etiquetas: php+ajax+formularios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:21.