Foros del Web » Programando para Internet » Jquery »

Duda con jquery validate y jquery form

Estas en el tema de Duda con jquery validate y jquery form en el foro de Jquery en Foros del Web. Saludos a todos... Tengo el siguiente formulario el cual pretendo enlazar al documento email.php. Código HTML: <form id= "form" name= "form" > <label for= "nombre" ...
  #1 (permalink)  
Antiguo 25/01/2012, 19:08
 
Fecha de Ingreso: enero-2011
Ubicación: Cali
Mensajes: 73
Antigüedad: 13 años, 3 meses
Puntos: 2
Pregunta Duda con jquery validate y jquery form

Saludos a todos...

Tengo el siguiente formulario el cual pretendo enlazar al documento email.php.
Código HTML:
<form id="form" name="form">
<label for="nombre">Nombre: </label>
<input id="nombre" name="nombre" placeholder="Escribe tu nombre" autofocus><br />
<label for="email">Email: </label>
<input type="email" id="email" name="email" placeholder="Escribe tu email"><br />
<label for="destino">Destino: </label>
<input type="email" id="destino" name="destino" placeholder="[email protected]" disabled><br />
<label for="mensaje">Mensaje: </label><br />
<textarea id="mensaje" name="mensaje" placeholder="Escribe tu mensaje" rows="10" cols="45"></textarea><br />         
<input type="submit" id="enviar" name="enviar" value="Enviar">
<input type="reset" id="borrar" value="Borrar">
</form> 
El mismo lo estoy validando con jquery validate http://docs.jquery.com/Plugins/Validation

El problema está cuando en el método submitHandler intento procesar el formulario con jquery form (ajaxSubmit) tal como recomienda en la documentación de jquery validate.

Simplemente no logro el prósito de procesar el formulario e imprimir el resultado del proceso sin tener que refrescar la página.

Nota: Cuando desactivo el metodo submitHandler todo funciona bien sólo que obviamente el usuario se redirige hacia email.php, y el correo si se envía. Pero pues no es lo que quiero.

El código jquery es el siguiente:
Código:
// Para validar el formulario con jqueryValidate plugin
	$('#form').validate({
	   rules:{
		   'nombre':{required: true, minlength: 3},
		   'email':{required: true, email: true},
		   'mensaje':{required: true, minlength: 15}
	   },
   	   messages:{
		   'nombre':{required:'<br/>Debe ingresar el nombre<br/>', minlength: '<br/>Requiere mínimo 3 letras<br/>'},
		   'email':{required: '<br/>Debe ingresar un correo electrónico<br/>',email:'<br/>Debe ingresar el correo electrónico con el formato correcto. Por ejemplo: [email protected]<br/>'},
		   'mensaje':{required:'<br/>Debe ingresar algún mensaje<br/>', minlength: '<br/>Requiere mínimo 15 letras<br/>'}
   	   },
	    submitHandler:function(form){
			var opciones={
				target: $("#formV").after(),
				beforeSubmit: mostrarLoader, //funcion que se ejecuta antes de enviar el form
				success: mostrarRespuesta,//funcion que se ejecuta una vez enviado el formulario
				url: email.php,
				type: post,
				clearForm: true,
				resetForm: true
			};
			$('#form').submit(function(){
				$(this).ajaxSubmit(opciones);
				return false;
			});
			
			function mostrarLoader(){
				$("#formV").fadeIn("slow").after("<p>Procesando el formulario para su envio.</p>"); //muestro el loader de ajax
			};
			
			function mostrarRespuesta (responseText){
      			$("#sec4 form").fadeOut("slow");
			    $("#formV").fadeIn("slow");	
				$("#formV").after(responseText);
			};
			}
	});
el documento email.php es como sigue:
Código PHP:
<?php
$nombre 
=  $_REQUEST["nombre"];
$email =  $_REQUEST["email"];
$destino "[email protected]";
$asunto "Mensaje de cliente";
$mensaje =  $_REQUEST["mensaje"];
$cuerpo "
<html>
<head>
   <title>Correo de cliente</title>
</head>
<body>
<h1 style='
       text-align: left;
       font-family: verdana,arial;
       font-size: 21px;
       color: #f00;'>De: $nombre</h1>
<h1 style='
       text-align: left;
       font-family: verdana,arial;
       font-size: 21px;
       color: #f00;'>Para: quien corresponda...</h1>
<p id='parrafo' style='
       text-align: justify;
       color: #000;
       font-family: verdana,arial;
       font-size: 16px;
       line-height: 30px;'>
$mensaje
</p>
</body>
</html>
"
;

//para el envío en formato HTML
$headers "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=utf-8\r\n";

//dirección del remitente
$headers .= "From: $nombre <$email>\r\n";

//direcciones que recibirán copia
$headers .= "Cc: [email protected]\r\n";

mail($destino,$asunto,$cuerpo,$headers) or die("El email no se pudo enviar.");

if(
$_POST['mensaje'] != ''){
    echo 
"Tu mensaje ha sido enviado con éxito. Prontamente responderemos al mismo.<br /><br />";
    echo 
"Mensaje enviado por: ";
    echo 
$_POST['nombre'];
    echo 
"<br><br>";
    echo 
"Correo de remitente: ";
    echo 
$_POST['email'];
    echo 
"<br><br>";
    echo 
"Enviado a: ".$_POST['destino'];
    echo 
"<br><br>";
    echo 
"El mensaje dice: <br>";
    echo 
$_POST['mensaje'];
}
?>
Agradezco de ante mano la ayuda que me puedan ofrecer como también sus consejos.
  #2 (permalink)  
Antiguo 26/01/2012, 09:34
 
Fecha de Ingreso: enero-2011
Ubicación: Cali
Mensajes: 73
Antigüedad: 13 años, 3 meses
Puntos: 2
Pregunta Respuesta: Duda con jquery validate y jquery form

Saludos nuevamente...

Ya logré que el envío de correo funcione sin tener que salir de la página principal. Pero no logro dos cosas que van de la mano:

1. Que a través de $.ajax pueda imprimir en pantalla la información que tengo en email.php posterior a validar el formulario y enviar el correo.

Este es el código al cual me refiero:
Código PHP:
if($_POST['mensaje'] != ''){
    echo 
"Tu mensaje ha sido enviado con éxito. Prontamente responderemos al mismo.<br /><br />";
    echo 
"Mensaje enviado por: ";
    echo 
$_POST['nombre'];
    echo 
"<br><br>";
    echo 
"Correo de remitente: ";
    echo 
$_POST['email'];
    echo 
"<br><br>";
    echo 
"Enviado a: ".$_POST['destino'];
    echo 
"<br><br>";
    echo 
"El mensaje dice: <br>";
    echo 
$_POST['mensaje'];

En este caso lo que se imprime es: "Su mensaje no ha podido ser enviado." Este string corresponde a
Código:
error: function(){
$("#formV").fadeIn("slow").after("Su mensaje no ha podido ser enviado.");
}
Pero a pesar que imprime el aviso de error, el correo siempre llega aunque con el remitente desconocido (punto 2).

2. El correo se envía, pero parece ser que el email.php no me está reconociendo los valores del formulario y pues el corro llega pero con remitente desconocido.

Nota: Si en el método submitHandler cambio el $.ajax por la sola línea de código form.submit() todo funciona bien y el correo funciona bien con todos sus elementos, pero me direcciona de la página principal a la de email.php, lo cual no quiero.

Pero bueno ya es algo de avance.

Agradezco que me puedan asesorar con esto :)

Que tengan buen día !!!

Los códigos actualizados como siguen:
javascript:
Código:
	$('#form').validate({
	   rules:{
		   'nombre':{required: true, minlength: 3},
		   'email':{required: true, email: true},
		   'mensaje':{required: true, minlength: 15}
	   },
   	   messages:{
		   'nombre':{required:'<br/>Debe ingresar el nombre<br/>', minlength: '<br/>Requiere mínimo 3 letras<br/>'},
		   'email':{required: '<br/>Debe ingresar un correo electrónico<br/>',email:'<br/>Debe ingresar el correo electrónico con el formato correcto. Por ejemplo: [email protected]<br/>'},
		   'mensaje':{required:'<br/>Debe ingresar algún mensaje<br/>', minlength: '<br/>Requiere mínimo 15 letras<br/>'}
   	   },
   		debug:true,
	    submitHandler:function(){
			$.ajax({
				url: "email.php",
				type: "GET",
				dataType: "json",
				success: function(){
					$("#formV").fadeIn("slow").after(responseText);
				},
				error: function(){
					$("#formV").fadeIn("slow").after("Su mensaje no ha podido ser enviado.");
				}
			});
		}
	});
El de email.php no lo he cambiado.

Última edición por gcrlink; 26/01/2012 a las 09:50
  #3 (permalink)  
Antiguo 26/01/2012, 10:58
 
Fecha de Ingreso: enero-2011
Ubicación: Cali
Mensajes: 73
Antigüedad: 13 años, 3 meses
Puntos: 2
Respuesta: Duda con jquery validate y jquery form

Saludos nuevamente...

Utilizando sólo jquery form (http://jquery.malsup.com/form/#getting-started) logro todo lo que quiero hacer con el formulario. Entiéndase:

1. validar el formulario

2. Enviar la petición a email.php

3. imprimir en pantalla la confirmación del envío del correo sin direccionar al usuario hacia email.php

4. enviar un correo con todos sus elementos.

PERO CUÁL ES EL PROBLEMA QUE NOTO
Es que con jquery form la validación del formulario no es tan buena como cuando se realiza con jquery validate.

Puedo validarlo por mi cuenta, pero entiendo que se me escaparían muchas cosas que con jquery validate no pasarían; como por ejemplo: La validación del campo email.

Luego puedo decir que con HTML 5 y el atributo required en la etiqueta input ya logré el comentido, pero en IE no acepta ese atributo, y aun utilizando Modernizr no he logrado que lo acepte. Asi que regreso al punto anterior. Lo que me preocupa es la calidad de validación del formulario. :)
  #4 (permalink)  
Antiguo 26/01/2012, 13:20
 
Fecha de Ingreso: enero-2011
Ubicación: Cali
Mensajes: 73
Antigüedad: 13 años, 3 meses
Puntos: 2
De acuerdo Respuesta: Duda con jquery validate y jquery form

Nuevamente saludos...

Ya logré resolver el problema.

La clave estaba en incluir en la función $.ajax el elemento data: "string" y no definir el elemento dataType. También en cambiar el type: GET por POST.

Otro cambio que realicé fue en la forma en que recojo los valores para imprimir un mensaje de confirmación en la pantalla. Estos valores no los obtengo de email.php, sino que los obtengo del jquery mismo con $("#nombre").val(), etc.

El ejemplo lo pueden ver en funcionamiento en esta página en construcción: http://discotecamangobiche.com/

En fin para todos los que han tenido los mismas o similares dudas a las mías expresadas en este foro, dejo los códigos para que les pueda servir como guía.

Aclaro: Estoy seguro que este código y su función se pueden mejorar así que invito a los más expertos a que nos asesoren con este tipo de programas con el fin de que podamos mejorar :)

Formulario:
Código HTML:
<form id="form" name="form" action="email.php" method="post">
<label for="nombre">Nombre: </label>
<input id="nombre" name="nombre" placeholder="Escribe tu nombre" autofocus><br />
<label for="email">Email: </label>
<input type="email" id="email" name="email" placeholder="Escribe tu email"><br />
<label for="destino">Destino: </label>
<input type="email" id="destino" name="destino" placeholder="[email protected]" disabled><br />
<label for="mensaje">Mensaje: </label><br />
<textarea id="mensaje" name="mensaje" placeholder="Escribe tu mensaje" rows="10" cols="45"></textarea><br />         
<input type="submit" id="enviar" name="enviar" value="Enviar">
<input type="reset" id="borrar" value="Borrar">
</form> 
email.php
Código PHP:
<?php
$nombre 
=  $_REQUEST["nombre"];
$email =  $_REQUEST["email"];
$destino "correo de destino";
$asunto "Mensaje de cliente"// Aquí puedo recoger un valor de formulario con $_REQUEST["asuto"] su fuera el caso. 
$mensaje =  $_REQUEST["mensaje"];
$cuerpo "
<html>
<head>
   <title>Correo de cliente</title>
</head>
<body>
<h1 style='
       text-align: left;
       font-family: verdana,arial;
       font-size: 21px;
       color: #f00;'>De: $nombre</h1>
<h1 style='
       text-align: left;
       font-family: verdana,arial;
       font-size: 21px;
       color: #f00;'>Para: quien corresponda...</h1>
<p id='parrafo' style='
       text-align: justify;
       color: #000;
       font-family: verdana,arial;
       font-size: 16px;
       line-height: 30px;'>
$mensaje
</p>
</body>
</html>
"
;

//para el envío en formato HTML
$headers "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=utf-8\r\n";

//dirección del remitente
$headers .= "From: $nombre <$email>\r\n";

//dirección de respuesta, si queremos que sea distinta que la del remitente
/*$headers .= "Reply-To: algún correo \r\n";

//ruta del mensaje desde origen a destino
$headers .= "Return-path: [email protected]\r\n";*/

//direcciones que recibirán copia
$headers .= "Cc: algún correo \r\n";

/*//direcciones que recibirán copia oculta
$headers .= "Bcc: algún correo \r\n";*/

mail($destino,$asunto,$cuerpo,$headers) or die("El email no se pudo enviar.");

?>
Javascript (jquery):
Código Javascript:
Ver original
  1. // Para validar el formulario con jqueryValidate plugin
  2.     $('#form').validate({
  3.        rules:{
  4.            'nombre':{required: true, minlength: 3},
  5.            'email':{required: true, email: true},
  6.            'mensaje':{required: true, minlength: 15}
  7.        },
  8.        messages:{
  9.            'nombre':{required:'<br/>Debe ingresar el nombre<br/>', minlength: '<br/>Requiere mínimo 3 letras<br/>'},
  10.            'email':{required: '<br/>Debe ingresar un correo electrónico<br/>',email:'<br/>Debe ingresar el correo electrónico con el formato correcto. Por ejemplo: [email protected]<br/>'},
  11.            'mensaje':{required:'<br/>Debe ingresar algún mensaje<br/>', minlength: '<br/>Requiere mínimo 15 letras<br/>'}
  12.        },
  13.         debug:true,
  14.         submitHandler:function(){
  15.             $.ajax({
  16.                 url: "email.php",
  17.                 type: "POST",
  18.                 data: "nombre="+$('#nombre').val()+"&email="+$('#email').val()+"&destino="+$('#destino').val()+"&mensaje="+$('#mensaje').val(),
  19.                 success: function(){
  20.                     var confirmacion = '<br/><br><p id="confirm">Tu mensaje ha sido enviado con éxito. Prontamente responderemos al mismo.<br /><br />Mensaje enviado por: '+$("#nombre").val()+'<br><br>Correo de remitente: '+$("#email").val()+'<br><br>Enviado a: [email protected]<br><br>El mensaje dice: <br>'+$("#mensaje").val()+'</p>';
  21.                     $("#form").css("display","none");
  22.                     $("#formV").fadeIn("slow").after(confirmacion);
  23.                     $("#confirm").fadeIn("slow");
  24.                     $("#confirm").css("font-size","12px");
  25.                     $("#confirm").css("color","#f00");
  26.                 },
  27.                 error: function(){
  28.                     $("#formV").fadeIn("slow").after("<br/><br><p id='confirm'>Su mensaje no ha podido ser enviado.</p>");
  29.                     $("#confirm").fadeIn("slow");
  30.                     $("#confirm").css("font-size","12px");
  31.                     $("#confirm").css("color","#f00");
  32.                 },
  33.                 /*complete: function(){
  34.                     $("#formV").fadeIn("slow").after("Su mensaje ha sido enviado.");
  35.                 }*/
  36.             });
  37.         }
  38.     });

::: ahhhh y mega IMPORTANTE :::
Según el documento de jqueryForm nunca se debe usar en un mismo formulario ajaxForm y ajaxSubmit. Por yo no haber leido antes me estaba rompiendo la cabeza en vano. Pero bueno a veces pasa :)

Que tengan todos buen día !!!

Última edición por gcrlink; 05/02/2012 a las 08:06
  #5 (permalink)  
Antiguo 24/05/2012, 03:56
 
Fecha de Ingreso: diciembre-2007
Ubicación: Sevilla, España
Mensajes: 2
Antigüedad: 16 años, 4 meses
Puntos: 0
Exclamación Respuesta: Duda con jquery validate y jquery form

He probado tu código, y si falla en el servidor de correos... No entra en error: function(), lo has probado?

Etiquetas: ajax, validar, formulario
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 17:45.