SummArg | Cursos y recursos para webmasters

17/08/2010

Recibir datos a través de un formulario y enviarlos vía mail en un PDF

Esta guía está basada en el tutorial de CoreyWorrell, que me sacó de apuros y que quiero compartir con ustedes.

Básicamente lo que haremos será tomar datos a través de un formulario web, lo procesaremos y enviaremos los datos a un archivo que le dará formato html. Ese html resultante será convertido en PDF y enviado vía email a donde nosotros le indiquemos.

Para ello subiremos las librerias de dompdf (generador de PDF) y Swift Mailer (envio de email) al servidor de nuestro website en las carpetas dompdf y swift. Ambos scripts tienen documentación completa para personalizarlos en sus propios sitios. Esta es la estructura de archivos y directorios que utilizaremos.

El formulario

Los datos que deseamos recibir en PDF serán insertados por los usuarios a través de un formulario html.

 

<form action="" method="post" id="formulario">
<label for="nombres">Nombre y Apellido</label>
<input id="nombres" type="text" name="nombres" value="" />
<label for="sexo">Sexo</label>
<select id="sexo" name="sexo">
<option value="M">Masculino</option>
<option value="F">Femenino</option>
</select>
<label for="dni">DNI</label>
<input id="dni" type="text" name="dni" value="" />
<label for="domicilio">Domicilio</label>
<input id="domicilio" type="text" name="domicilio" value="" />
<label for="localidad">Localidad</label>
<input id="localidad" type="text" name="localidad" value="" />
<label for="cp">Codigo Postal</label>
<input id="cp" type="text" name="cp" value="" />
<label for="telefono">Telefono</label>
<input id="telefono" type="text" name="telefono" value="" />
<label for="email">Email</label>
<input id="email" type="text" name="email" value="" />
<input type="reset" name="reset" value="Limpiar" />
<input type="submit" name="submit" value="Enviar" />

Procesaremos los datos utilizando el mismo archivo form.php, en este caso no validaremos el tipo de dato ingresado ni personalizaremos los errores, sino que meramente verificamos que exista contenido y nada mas:

<?
if (!empty($_POST)) {
// Determina el resultado
$success = $error = false;
$post = new stdClass;
foreach ($_POST as $key => $val)
$post->$key = trim(strip_tags($_POST[$key]));
// busca campos en blanco
if (empty($post->nombres) OR empty($post->sexo) OR empty($post->dni) OR empty($post->domicilio)
OR empty($post->localidad) OR empty($post->cp) OR empty($post->telefono) OR empty($post->cel)
OR empty($post->email))
$error = true;
else {
crear el pdf..
}
?>

Template para el PDF

El archivo pdf.php tomará las variables de nuestro formulario para darles un formato html que luego será convertido en PDF.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formulario</title>
</head>
<body style="font-family:arial;font-size:14px;">
<table width="90%" style="margin-left:10px;" border="0">
<tr>
<td>Apellido  y Nombres:  </td>
<td><?php echo $post->nombres; ?></td>
<td>Documento  de Identidad&nbsp; DNI&nbsp; N&deg;</td>
<td><?php echo $post->dni; ?></td>
</tr>
<tr>
<td>Domicilio: </td>
<td><?php echo $post->domicilio; ?></td>
<td>Localidad:</td>
<td><?php echo $post->localidad; ?></td>
</tr>
<tr>
<td>C.P.</td>
<td><?php echo $post->cp; ?></td>
<td>Celular:</td>
<td><?php echo $post->cel; ?></td>
</tr>
<tr>
<td>Tel&eacute;fono: </td>
<td><?php echo $post->telefono; ?></td>
<td>E-mail:</td>
<td><?php echo $post->email; ?></td>
</tr>
</table>
</body>
</html>

Para enviar nuestras variables al archivo pdf.php, desde el form.php pasamos a completar el else { } que antes dejamos en blanco:

// directorio en donde buscar el script pdf.php
$dir = dirname(__FILE__);
// Toma el contenido de pdf para despues
ob_start();
require_once($dir.'/pdf.php');
$pdf_html = ob_get_contents();
ob_end_clean();
// carga dompdf
require_once($dir.'/dompdf/dompdf_config.inc.php');
$dompdf = new DOMPDF(); // nueva instancia de dompdf
$dompdf->load_html($pdf_html); // carga el html
$dompdf->render(); // parsea el html y lo convierte a pdf
$pdf_content = $dompdf->output(); // coloca el contenido de pdf en una variable

Acto seguido procedemos a completar el archivo html.php que contendrá el cuerpo del email, el cual meramente tendrá el nombre del usuario y un breve mensaje.

<html>
<body>
<p style="font-family:Helvetica, Arial, sans-serif;">
<?php echo $post->nombres; ?> ha enviado un formulario</p>
</body>
</html>

Y desde form.php cargamos el html en el cuerpo del correo.

// Toma el contenido de html y lo coloca en una variable
ob_start();
require_once($dir.'/html.php');
$html_message = ob_get_contents();
ob_end_clean();

Con nuestro archivo PDF generado y un mensaje personalizado para el cuerpo del email ya podemos proceder a enviar el email con el adjunto utilizando SwiftMailer.

// carga SwiftMailer
require_once($dir.'/swift/swift_required.php');
$mailer = new Swift_Mailer(new Swift_MailTransport()); // Crea nueva instancia de SwiftMailer
$message = Swift_Message::newInstance()
->setSubject('Asunto del Mail ' ) // Asunto del Mail
->setTo('summarg@summarg.com') // Destinatario
->setFrom(array('summarg@summarg.com' => 'SummArg')) // Remitente
->setBody($html_message, 'text/html') // inserta el mensaje HMTL en el cuerpo del mail
->attach(Swift_Attachment::newInstance($pdf_content, 'formulario.pdf', 'application/pdf')); // Adjunta el PDF que generamos
// envia el mensaje y muestra el status
if ($mailer->send($message))
$success = true;
else
$error = true;
}
}

Pueden descargar los dos scripts y los tres archivos listos para usar y modificar desde aquí: form2pdf.

Dejar un comentario

  1. Información Bitacoras.com…

    Valora en Bitacoras.com: Esta guía está basada en el tutorial de CoreyWorrell, que me sacó de apuros y que quiero compartir con ustedes. Básicamente lo que haremos será tomar datos a través de un formulario web, lo procesaremos y enviaremos los datos…..

  2. Jesus

    Ya intente arrancar el codigo pero no me funciona en mi website. Que esta mal ?

  3. Nekko

    Hola Jesus! Descargaste los archivos que nosotros brindamos? Te funcionaron? Cómo insertaste el código dentro de tu proyecto? Danos mas información para que podamos ayudarte. Si necesitás postear mas detalladamente podés hacerlo en nuestro foro.

  4. hola, una pregunta:

    ¿hay una manera de tomar los datos del formulario, ordenarlos en html, e irlos alojando en un archivo html variable (o en una base de datos externa)?

    simplemente ordenados con el formato que yo quiera (no es un formato complejo, solo necesito que estén de esa manera para poder imprimirlos sin antes tener que ordenarlos manualmente)

    gracias de antemano, espero su respuesta

  5. Nekko

    iszlonn, no entiendo muy bien tu consulta. El script permite enviar los datos a un archivo html de tu autoría, en donde vos podés ordenar las variables del formulario como te convenga.

  6. me refería a que necesito el mismo procesamiento de datos que brindas con estos scripts, pero en vez de enviarlos por correo, guardarlos en un archivo dentro del servidor donde está alojada mi página, o simplemente ir modificando un archivo html existente (en el mismo sitio) en donde se vayan acumulando todos los datos recibidos, para poder imprimirlos sin necesidad de ordenarlos manualmente.
    lo que pasa es que actualmente los datos me llegan a un archivo de google docs (utilizo el sistema de formularios de google docs) y son muchos al día, y necesitaba poder tenerlos ordenados de una vez a la hora de imprimirlos (somos una empresa que trabaja con ventas por internet y tengo la necesidad de imprimir los datos de cada cliente para el envío)
    (sí, soy muy novato en esto)
    muchas gracias, espero tu respuesta, de igual manera tu post me está ayudando

  7. Nekko

    Hola iszlonn! Por lo que me comentás podría ser de mas utilidad este otro script, que almacena todos los datos recibidos en un archivo excel en tu servidor. http://www.summarg.com/2010/recibir-informacion-en-un-formulario-y-colocarla-dentro-de-un-archivo-excel/

  8. Angie

    Hola! necesito además de los campos existentes agregar tres archivos adjuntos (imágenes) y enviarlos por correo junto con el pdf.
    Muchas gracias, espero su respuesta.

  9. Nekko

    Acá te dejo un tutorial para subir imágenes
    http://www.tizag.com/phpT/fileupload.php

  10. Angie

    Hola de nuevo, me pueden AYUDAR! Tengo un formulario que permite subir un archivo adjunto. He logrado que me guarde el archivo adjunto(imagen) en la carpeta uploads de mi hosting con el siguiente código.

    En este otro intento enviar el archivo adjunto por correo, pero no lo hace. Ni siquiera guarda el adjunto en mi hosting. Lo he intentado cambiando fromPath por newInstance. No se donde está el error.

    setSubject(‘Formulario de inscripción’)
    ->setTo(array(‘correo@hotmail.com’ => ‘Inscripciones’))
    ->setFrom(array($post->email => $post->nombre) // From:
    ->attach(Swift_Attachment::fromPath($_FILES[‘archivo’][‘tmp_name’], $uploadfile, $_FILES[‘archivo’][‘name’]));

    if ($mailer->send($message))
    $success = true;
    else
    $error = true;
    ?>
    Muchas gracias de antemano, espero su respuesta.

  11. Angie

    Hola!! Con el tutorial que me han facilitado he logrado subir el adjunto, pero sigue sin enviarme el archvo al correo. Este es el código.
    setSubject(‘Formulario de inscripción’) // Message subject
    ->setTo(array(‘correo@hotmail.com’ => ‘Inscripciones 2012’))
    ->setFrom(array($post->email => $post->nombre))
    –>attach(Swift_Attachment::newInstance($_FILES[‘archivo’][‘tmp_name’], $target_path, ‘imagen.jpg’));
    ?>

  12. thirdanswer

    No me funciona el código estimado….”ERROR: Su formulario no pudo ser enviado”.Ejecuté tal cual los archivos que dejaste para descargar sin ninguna modificación.¿hay que modificar o parametrizar algo para que funcione?

  13. Hola, al igual que thirdanswer, me aparece un mensaje de “ERROR” en el formulario, descargué los archivos y sólo modifiqué el destinatario, el resto está correctamente empleado, he revisado rutas y variables y todo está de acuerdo al tutorial que pones aquí ¿falta algo para hacer?
    Agradezco infinitamente tu ayuda.

  14. Estimado, yo me baje los archivos, cambie el correo al que se envía el correo y lo subí. Pero me tira error al completar los datos.
    Soy de madera en programación, agradeceré toda la ayuda que puedas darme
    http://www.telextorage.com/mail/2014/desafio/form.php

    Mil gracias!!!

  15. El error que le da a “Estudio” es porque en el formulario falta el dato “Celuar”, pero valida si está en blanco

    if (empty($post->nombres) OR empty($post->sexo) OR empty($post->dni) OR empty($post->domicilio)
    OR empty($post->localidad) OR empty($post->cp) OR empty($post->telefono) OR **********************empty($post->cel)******************
    OR empty($post->email))

Dejar un comentario