Foros del Web » Programando para Internet » PHP »

ayuda con formulario y envio de archivos adjuntos

Estas en el tema de ayuda con formulario y envio de archivos adjuntos en el foro de PHP en Foros del Web. Hola amigos, Resulta que tengo el siguiente formulario: Código: <? if (!$HTTP_POST_VARS){ ?> contenido html <form id="order" class="order-form" action="orderS.php" method="post"> ... <input id="boton" type="submit" name="enviar" ...
  #1 (permalink)  
Antiguo 20/03/2010, 17:37
Avatar de cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 14 años, 10 meses
Puntos: 269
Pregunta ayuda con formulario y envio de archivos adjuntos

Hola amigos,
Resulta que tengo el siguiente formulario:

Código:
<?
if (!$HTTP_POST_VARS){
?>

contenido html
<form id="order" class="order-form" action="orderS.php" method="post">
...
<input id="boton" type="submit" name="enviar"  value="Enviar"/>   

}else{
//Estoy recibiendo el formulario, compongo el cuerpo
    $fecha=date("d-m-Y");
    $hora=date("H:i:s");
    $cuerpo = "Formulario enviado\n";
    $cuerpo .= "Nombre: " . $HTTP_POST_VARS["name"] . "\n";
    $cuerpo .= "Dirección: " . $HTTP_POST_VARS["direccion"] . "\n";
    $cuerpo .= "Telefono: " . $HTTP_POST_VARS["phone"] . "\n";
    $cuerpo .= "Email: " . $HTTP_POST_VARS["email"] . "\n";
    $cuerpo .= "Comentarios: " . $HTTP_POST_VARS["comments"] . "\n";
    $cuerpo .= "URL:: " . $HTTP_POST_VARS["link"] . "\n";
    $cuerpo .= "Páginas: " . $HTTP_POST_VARS["pages"] . "\n";  
    $cuerpo .= "Días: " . $HTTP_POST_VARS["days"] . "\n";
    $cuerpo .= "Entregar como: " . $HTTP_POST_VARS["template_type"] . "\n";    
    $cuerpo .= "comentarios: " . $HTTP_POST_VARS["cd_commented"] . "\n"; 
    $cuerpo .= "Libreria preferida: " . $HTTP_POST_VARS["cd_javascript_framework"] . "\n";  
    $cuerpo .= "scripts del lado del servidor: " . $HTTP_POST_VARS["cd_ssi"] . "\n";  

    
    //mando el correo...
    mail("[email protected]","Formulario recibido",$cuerpo);

    //doy las gracias por el envío
    echo "Gracias por rellenar el formulario. Se ha enviado correctamente.";
    
    echo '<META HTTP-EQUIV="Refresh" CONTENT="3"; URL="http://www.estudiojamba.com.ar/MARKUP/orderS.php">';
}
?>
e intento integrar un envio de multiples archivos adjuntos al estilo de gmail, que tome de este sitio y cuyo código php es:

Código:
<?php 
    /*
     * Permite enviar y/o subir múltiples archivos, usando PHP, javascript y PHP Mailer para  el envío de mails
     * Autor: Alexander Concha Abarca <alex[@]buayacorp.com>
     * http://www.buayacorp.com/
     * 
     * Este script está bajo licencia de Creative Commons 
     * http://creativecommons.org/licenses/by/2.0/
     */
    // Para el envío de mails
    include_once('class.phpmailer.php');
    // Indica si los datos provienen del formulario
    $postback = isset($_POST['postback']) ? true : false;
    
    if ($postback) {
        extract($_POST);
        $mail = new phpmailer (); # Crea una instancia
        $mail -> From = $from;
        $mail -> FromName = "frm"; # Puede obtenerse del formulario, por facilidad se hace de esta manera
        $mail -> AddAddress ($to);
        $mail -> Subject = $sbj;
        $mail -> Body = $msg;
        $mail -> IsHTML (true);
        $archivos = '';
        $msg = "Mensaje Enviado";
        
           if (isset ($_FILES["archivos"])) { # Si es que se subió algún archivo
            $msg .= "<ul>";
            foreach ($_FILES["archivos"]["error"] as $key => $error) { # Iterar sobre la colección de archivos
                if ($error == UPLOAD_ERR_OK) { // Si no hay error
                    $tmp_name = $_FILES["archivos"]["tmp_name"][$key];
                    $name = $_FILES["archivos"]["name"][$key];
                    $msg .= "<li>$name</li>";
                    $name = uniqid('bc') . '_' . $name; # Generar un nombre único para el archivo
                    $mail -> AddAttachment ($tmp_name, $name); # Añade el archivo adjunto
                    /*
                    Si se van a guardar los archivos en un directorio, deberían descomentarse
                    las siguientes líneas, si se van a guardar los nombres 
                    de los archivos en una base de datos, aquí debería realizarse algo...                    
                       
                    move_uploaded_file($tmp_name, "ruta/directorio/$name"); # Guardar el archivo en una ubicación, debe tener los permisos necesarios
                    */
                } #if
               } # foreach
            $msg .= '</ul>';
        } # if
        if (!$mail -> Send ()){
            $msg = "No se pudo enviar el email";
        }
    }
?>
y cuyo codigo javascript es:
Código:
<script type="text/javascript">
var numero = 0;

// Funciones comunes
c= function (tag) { // Crea un elemento
   return document.createElement(tag);
}
d = function (id) { // Retorna un elemento en base al id
   return document.getElementById(id);
}
e = function (evt) { // Retorna el evento
   return (!evt) ? event : evt;
}
f = function (evt) { // Retorna el objeto que genera el evento
   return evt.srcElement ?  evt.srcElement : evt.target;
}

addField = function () {
   container = d('files');
   
   span = c('SPAN');
   span.className = 'file';
   span.id = 'file' + (++numero);

   field = c('INPUT');   
   field.name = 'archivos[]';
   field.type = 'file';
   
   a = c('A');
   a.name = span.id;
   a.href = '#';
   a.onclick = removeField;
   a.innerHTML = 'Quitar';

   span.appendChild(field);
   span.appendChild(a);
   container.appendChild(span);
}
removeField = function (evt) {
   lnk = f(e(evt));
   span = d(lnk.name);
   span.parentNode.removeChild(span);
}
</script>
y cuyo html es:
Código:
   <?php if (isset($msg)) echo $msg;?>
    <form name="frm" id="frm" action="uploader.php" method="post" enctype="multipart/form-data">
    <dl>
        <dt><label for="to" accesskey="1">Para</label></dt>
        <dd><input type="text" name="to" id="to" size="60" /></dd>
        
        <dt><label for="from" accesskey="2">De</label></dt>
        <dd><input type="text" name="from" id="from" size="60" /></dd>
        
        <dt><label for="sbj" accesskey="3">Asunto</label></dt>
        <dd><input type="text" name="sbj" id="sbj" size="60" /></dd>
        
        <dt><label for="msg" accesskey="4">Mensaje</label></dt>
        <dd><textarea id="msg" name="msg" rows="7" cols="45"></textarea></dd>
        
        <dt><label>Archivos Adjuntos:</label>&nbsp;&nbsp;&nbsp;<a href="#" onclick="addField()" accesskey="5">A&ntilde;adir Archivo</a></dt>
        <dd><div id="files"></div></dd>
        <dd><input type="submit" value="Enviar" id="postback" name="postback" accesskey="6" /></dd>
   </dl>
   </form>
Como podrán ver, este script utiliza PHP, javascript para crear nuevos elementos HTML en la página y para el envío del mail se utiliza PHP Mailer que permite adjuntar archivos.

Como no se casi nada de php se me complica para agrupar estos dos codigos en uno, a los fines de que pueda enviar el formulario junto con los archivos adjuntos al hacer click en el boton de envio.

¿me dan una manito? no pretendo me hagan el trabajo, simplemente con una pista o algun articulo para leer me ayudarian muchisimo.

Supongo puedo hallar la solución modificando principalmente (entre otras cosas) esta línea del primer formulario que mostre:
mail("[email protected]","Formulario recibido",$cuerpo);
donde de alguna manera debo incluir el envio de los archivos, pero como no entiendo el trabajo con variables de php estoy perdidísimo en el código.

Algo que me cuesta entender es esto: <?php if (isset($msg)) echo $msg;?>
es decir, ¿que es lo que hace isset()?

Desde ya muchas gracias, un saludo!

Última edición por cristian_cena; 20/03/2010 a las 19:03
  #2 (permalink)  
Antiguo 21/03/2010, 00:56
 
Fecha de Ingreso: abril-2007
Ubicación: Tandil, Bs As, Argentina
Mensajes: 106
Antigüedad: 17 años
Puntos: 2
Respuesta: ayuda con formulario y envio de archivos adjuntos

Hola.. bueno para empezar vamos desde tu ultima pregunta isset es una funcion que te permite (tal y como su nombre indica) preguntar si una variable tiene o no un valor asignado. Sale del ingles "is set" (esta seteado o esta asignado).

Código PHP:
<?
if (!$HTTP_POST_VARS){
?>
Código HTML:
<form id="order" class="order-form" action="orderS.php" method="post">
...
<input id="boton" type="submit" name="enviar"  value="Enviar"/> 
Código PHP:
<?php 
}else{
    
/*
     * Permite enviar y/o subir múltiples archivos, usando PHP, javascript y PHP Mailer para  el envío de mails
     * Autor: Alexander Concha Abarca <alex[@]buayacorp.com>
     * http://www.buayacorp.com/
     * 
     * Este script está bajo licencia de Creative Commons 
     * http://creativecommons.org/licenses/by/2.0/
     */
    // Para el envío de mails
    
include_once('class.phpmailer.php');
   
        
extract($_POST);
        
$mail = new phpmailer (); # Crea una instancia
        
$mail -> From $from;
        
$mail -> FromName "frm"# Puede obtenerse del formulario, por facilidad se hace de esta manera
        
$mail -> AddAddress ($to);
        
$mail -> Subject $sbj;
        
$mail -> Body $msg;
        
$mail -> IsHTML (true);
        
$archivos '';
        
$msg "Mensaje Enviado";
    
$msg .= "Nombre: " $HTTP_POST_VARS["name"] . "\n";
    
$msg.= "Dirección: " $HTTP_POST_VARS["direccion"] . "\n";
    
$msg.= "Telefono: " $HTTP_POST_VARS["phone"] . "\n";
    
$msg.= "Email: " $HTTP_POST_VARS["email"] . "\n";
    
$msg.= "Comentarios: " $HTTP_POST_VARS["comments"] . "\n";
    
$msg.= "URL: " $HTTP_POST_VARS["link"] . "\n";
    
$msg.= "Páginas: " $HTTP_POST_VARS["pages"] . "\n";  
    
$msg.= "Días: " $HTTP_POST_VARS["days"] . "\n";
    
$msg.= "Entregar como: " $HTTP_POST_VARS["template_type"] . "\n";    
    
$msg.= "comentarios: " $HTTP_POST_VARS["cd_commented"] . "\n"
    
$msg.= "Libreria preferida: " $HTTP_POST_VARS["cd_javascript_framework"] . "\n";  
    
$msg.= "scripts del lado del servidor: " $HTTP_POST_VARS["cd_ssi"] . "\n";
        
           if (isset (
$_FILES["archivos"])) { # Si es que se subió algún archivo
            
$msg .= "<ul>";
            foreach (
$_FILES["archivos"]["error"] as $key => $error) { # Iterar sobre la colección de archivos
                
if ($error == UPLOAD_ERR_OK) { // Si no hay error
                    
$tmp_name $_FILES["archivos"]["tmp_name"][$key];
                    
$name $_FILES["archivos"]["name"][$key];
                    
$msg .= "<li>$name</li>";
                    
$name uniqid('bc') . '_' $name# Generar un nombre único para el archivo
                    
$mail -> AddAttachment ($tmp_name$name); # Añade el archivo adjunto
                    /*
                    Si se van a guardar los archivos en un directorio, deberían descomentarse
                    las siguientes líneas, si se van a guardar los nombres 
                    de los archivos en una base de datos, aquí debería realizarse algo...                    
                       
                    move_uploaded_file($tmp_name, "ruta/directorio/$name"); # Guardar el archivo en una ubicación, debe tener los permisos necesarios
                    */
                
#if
               
# foreach
            
$msg .= '</ul>';
        } 
# if
        
if (!$mail -> Send ()){
            
$msg "No se pudo enviar el email";
        }

    
//doy las gracias por el envío
    
echo "Gracias por rellenar el formulario. Se ha enviado correctamente.";
    
    echo 
'<META HTTP-EQUIV="Refresh" CONTENT="3"; URL="http://www.estudiojamba.com.ar/MARKUP/orderS.php">';
}
?>
Mmm no me tengo mucha fe con esto jajajaja!!! Pero mas vale intentarlo, no xD! Suerte con esto :D
  #3 (permalink)  
Antiguo 21/03/2010, 03:09
Avatar de cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 14 años, 10 meses
Puntos: 269
Respuesta: ayuda con formulario y envio de archivos adjuntos

Hola megcapkill, jaa buen intento, pero ahora no llega nada de nada al mail jaja. que se yo ya estoy mareado de tanto codigo, los ojos rojos y un stress barbaro, me voy a dormir y mañana lo sigo, si me sale te cuento como me fue, muchas gracias che, la intención es lo que vale. un abrazo!

Etiquetas: adjuntos, envio, 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 22:48.