Los formularios de contacto son una caracteristica fundamental que poseen los sitios, los cuales nos permiten tener un acercamiento más proximo con aquellos quienes visitan nuestro sitio, ya sea para mantenerlo al tanto de las últimas novedades, ofertas, promociones, etc.
AJAX, JavaScript Asíncrono y XML, (Asynchronous JavaScript And XML), es la técnica por defecto para realizar interacciones con los usuarios y el servidor.
JavaScript, es el lenguaje de programación multiparadigma del lado del cliente, que hace vida en el navegador, que nos permite realizar aplicaciones web sumamente intuitivas.
La parte asíncrona de todo éste cuento es lo que nos abre muchisimas puertas en el desarrollo de un sitio web, esa posibilidad de establecer una conexión en segundo plano con el servidor sin que ésta interrumpa la visualización o comportamiento del sitio. (Muy importante a la hora de desarrollar teniendo en mente la experiencia de usuario e interfaces, UI/UX)
En cuanto a XML, no hace referencia al meta-lenguaje, si no, a XMLHttpRequest, un objeto, contenido en el DOM de nuestros navegadores con el cual podemos establecer dicha conexión asíncrona hacía un servidor web, el formato de dicha transferencia de datos puede ser, entre otros: HTML, XML, Json e inclusive texto plano.
PHP siendo el lenguaje interpretado de uso general que implementaré para éste ejemplo sencillo de un formulario utilizando estas tecnologias.
Para que todo lo que desarrollemos funcione en nuestra instancia en producción, debemos verificar que nuestro servidor web nos proporcione la funcionalidad de envíar correos electrónicos, SMTP: Protocolo simple de transferencia de correo (Simple Mail Transfer Protocol)
Aquí les dejo unos links utiles de cómo hacerlo, también es recomendable contactar con el soporte del servicio de hosting que estén utilizando.
Para arrancar con un ejemplo sencillo, partimos de la siguiente estructura HTML:
<form id="contactform" action="enviarcorreo.php"method="POST">
<div id="campos">
<input name="correo"type="text"/>
<input name="asunto"type="text"/>
<textarea name="mensaje"type="text"></textarea>
<button type="submit">Enviar mensaje</button>
</div>
</form>
siendo el action del formulario, el script PHP que se ejecutara una vez el formulario sea envíado, el input que posea el parametro type=“submit” de nuestro formulario.
Dentro de un archivo .js que llamamos, se encuentra lo siguiente:
$(document).ready(function(){
$('#contactform').submit(function(event){
event.preventDefault();
$.ajax({
type: 'POST',
url: $(this).attr('action'),
data: $(this).serialize(),
success: function(data){
//Cuando la interacción sea exitosa, se ejecutará esto.
},
error: function(data){
//Cuando la interacción retorne un error, se ejecutará esto.
}
}
})
});
Donde:
$(document).ready(function(){
Es la instrucción que le indica al navegador que la siguiente función estará disponible en cuanto el documento esté completamente cargado (document ready), siendo el documento la url actual y todos sus recursos.
$('#contactform').submit(function(event){
Ésto lo que nos dice, es que al elemento HTML con el id #contactform, cuando la acción de enviar (submit) sea llevada acabo, realizará la función que querramos, y le pasamos de parametro a dicha función, el evento que acaba de ocurrir (submit-post)
event.preventDefault();
Esta función, cancela la acción por defecto de los navegadores al ser realizado una acción del tipo submit-post, que es, redirigirse a la url del action del formulario, cosa que no queremos. Pues no queremos que el navegador refresque,
$.ajax({
type: 'POST',
url: $(this).attr('action'),
data: $(this).serialize(),
Aquí, le estamos diciendo al navegador, atraves de javascript (recuerden que esto se encuentra del lado del cliente), que vamos a realizar una interacción con el servidor, utilizando AJAX. ($.ajax() es un metodo de JQuery).
Le especificamos que dicha petición será del tipo POST, le pasamos una URL, en donde se encuentran las instrucciones de dicha petición, en este caso
$(this).attr(‘action’), hace referencia al atributo action que posee nuestro formulario (enviarcorreo.php)
y que los datos, serán los mismos suministrados por dicho formulario pero serializados.
Posteriormente, en orden de ejecución, ahora corresponderia nuestro archivo php, el cual es la acción de nuestro formulario:
El código más simple para esto seria el siguiente:
mail("[email protected]", $_POST['asunto'], $_POST['mensaje']); ?>
Lo cual, entenderán, si ya vieron el curso de PHP, tenemos estas variables inicializadas, $_POST[‘parametro’], únicamente si el action del post fue llamado.
Un esquema completo del ejemplo sería:
Sé que quedaron muchos conceptos por fuera, pero de lo contrario el post se haría aún más largo. Esperemos en un futuro cercano Platzi nos nutra con tecnicas nuevas e innovadoras para interactuar con servidores de manera asíncrona.
Link demo del formulario: https://ajaxphpform.herokuapp.com/
Link del repositorio en GitHub: https://github.com/Otacon98/PhpAjaxForm
Con esta función se puede enviar valores de input checkbox y radio?
Gracias por el tutorial Angel
Consulta
Este ejemplo funciona solo si trabajas con archivos php, es decir, noté que en tu repositorio el index es php no html, buen punto para darme el por qué no funcionaría con un archivo html?.
En mi caso he estado tratando de hacer funcionar un archivo html que llama a un app.js para controlar el evento submit del formulario.
Luego en app.js:
fetch('contact.php', { method: 'POST', body: datos })
donde datos fueron tomados por medio de FormData del formulario con su id “formContact”
const formulario = document.getElementById('formContact') const datos = new FormData(formulario)
El archivo PHP ahora no es importante. Porque veo un error 404 en el archivo contact.php. Al parecer hay un tema de reconocimiento el archivo php y cuando lo llamar desde app.js no lo encuentra… Es necesario el formulario este corriendo con servidor APACHE para que funcione ? cuando el proyecto enteramente esta funcionando desde un servicio nodejs??
Muy buen tutorial!!!
Para complementar, es muy importante que los elementos del formulario tengan la etiqueta NAME, si los INPUT, CHECKBOX, etc. únicamente tienen la etiqueta ID entonces no va a funcionar
PD. También sirve para RADIO BUTTON y CHECK BOX sólo no olviden la etiqueta NAME
Saludos!!!
Esto es porque la Serialización (“data: $(this).serialize(),”) hace el barrido de todos los elementos del formulario a través de la etiqueta NAME, por lo tanto, los que no tienen dicha etiqueta no los encuentra.
Saludos
Excelente aporte compañero, pero como puedo hacer compatible la funcion async await en IE11 ???