• User Newbie

    Problemi delle mail inviate dal form

    Ciao a tutti,
    ho un problema con l'invio delle mail dal form. Volevo creare un form per la richiesta preventivi, inserendo quindi il tag <select>. Quando arriva la mail compare tutto, meno la scelta fatta nella parte <select>.

    Vi inserisco di seguito i codici:

    Questo è il codice HTML:

    [HTML]
    <form id="formail" method="post" action="">
    <div id="risposta" style="width:50%; text-align: center; ">
    </div>
    <div class="input-field">
    <p>Nome:</p>
    <input type="text" id="nome" class="form-control" name="nome" value="" /><br />
    </div>
    <div class="input-field">
    <p>Marca:</p>
    <select id="marca" class="form-control" name="marca" value="">
    <option value="1">FIAT</option>
    <option value="2">LANCIA</option>
    <option value="3">ABART</option>
    <option value="4">ALFA</option>
    </select>
    </div>
    <div class="input-field">
    <p>E-mail:</p>
    <input type="text" id="email" class="form-control" name="email" value="" /><br />
    </div>
    <div class="input-field">
    <p>Oggetto:</p>
    <input type="text" id="oggetto" class="form-control" name="oggetto" value="" /><br />
    </div>
    <div class="input-field">
    <p>Messaggio:</p>
    <textarea id="messaggio" class="form-control" name="messaggio" rows="5" cols="4"></textarea><br />
    </div>
    <input type="submit" class="btn btn-blue btn-effect" id="invia" name="invia" value="INVIA" />
    </form>
    [/HTML]

    Questo invece è la parte Java:

    $(document).ready(function(){
       $("#invia").click(function(){
       
       //Recuperiamo tutte le variabili
           var valid = '';
           var isr = ' <p>&Eacute; richiesto';
           var name = $("#nome").val();
           var marca = $("#marca").val();
           var mail = $("#email").val();
           var subject = $("#oggetto").val();
           var messaggio = $("#messaggio").val();
       //Eseguiamo una serie di controlli
           if (name.length<1) {
               valid += isr+' un nome valido</p>';
           }
           if (!mail.match(/^([a-z0-9._-]+@[a-z0-9._-]+\.[a-z]{2,4}$)/i)) {
               valid += isr+' un indirizzo e-mail valido</p>';
           }
           if (marca.length<1) {
               valid += isr+' una marca valida</p>';
           }
           if (subject.length<1) {
               valid += isr+' un oggetto valido</p>';
           }
           
       //Se i controlli non vengono superati, appare il messaggio di errore.
           if (valid!='') {
               $("#risposta").fadeIn("slow");
               $("#risposta").html("<p><b>Errore:</b></p>"+valid);
               $("#risposta").css("background-color","#FFFFF");
               $("#risposta").css("color","rgba(116,0,1,1.00)");
           }
           //Se i controlli vengono superati, compare un messaggio di invio in corso
           else {
               var datastr ='name=' + name + '&mail=' + mail + '&subject=' + subject + '&messaggio=' + encodeURIComponent(messaggio);
               $("#risposta").css("display", "block");
               $("#risposta").css("background-color","#FFFFF");
               $("#risposta").css("color"," rgba(66,66,66,1.00)");
               $("#risposta").html("<p>Invio del messaggio in corso..</p>");
               $("#risposta").fadeIn("slow");
               setTimeout("send('"+datastr+"')",2000);
           }
           return false;
       });
    });
    //Creazione della funzione di invio. Si baserà sul nostro file php "mail.php".
    function send(datastr){
       $.ajax({    
           type: "POST",
           url: "mail.php",
           data: datastr,
           cache: false,
           success: function(html){
           $("#risposta").fadeIn("slow");
           $("#risposta").html(html);
           $("#risposta").css("background-color","#FFFFF");
           $("#risposta").css("color"," rgba(107,130,39,1.00)");
           setTimeout('$("#risposta").fadeOut("slow")',2000);
       }
       });
    }
    

    Ed infine la parte PHP:

    [PHP]<?php
    //Recuperiamo tutte le variabili
    $mail = $_POST['mail'];
    $name = $_POST['name'];
    $subject = $_POST['subject'];
    $text = $_POST['messaggio'];
    $ip = $_SERVER['REMOTE_ADDR'];

    //Qui andrà inserito il tuo indirizzo e-mail
    $to = "[email protected]";

    //Creazione del mesaggio da inviare
    $message = "Hai ricevuto una e-mail da: ".$name.", ".$mail.".<br />";
    $message .= "Messaggio: <br />".$text.", ".$marca."<br /><br />";
    $message .= "ti ha contattato per l'articolo $marca";
    $headers = "From: $mail \n";
    $headers .= "Reply-To: $mail \n";
    $headers .= "MIME-Version: 1.0 \n";
    $headers .= "Content-Type: text/html; charset=ISO-8859-1 \n";

    //Se l'e-mail viene spedita correttamente, compare un messaggio di avvenuto invio
    if(mail($to, $subject,$message, $headers)){
    echo "<p>Messaggio inviato con successo!</p>";
    }
    //Altrimenti un messaggio di errore
    else{
    echo "<p>Ci sono stati degli errori nell'invio della e-mail. Riprova</p>";
    }
    ?>[/PHP]

    Potete aiutarmi?
    grazie!


  • Moderatore

    Ciao, prova così:

    var marca = $("#marca").val();

    diventa

    var marca = $("#marca option:selected").val();


  • User Newbie

    @Shad said:

    Ciao, prova così:

    var marca = $("#marca").val();

    diventa

    var marca = $("#marca option:selected").val();

    Ciao Shad,
    non funziona neanche se faccio questa modifica...
    Altre idee?


  • User

    prova a levare l'attributo "value" dal tag "select" e lascia il "value" solo nelle "option"


  • User Newbie

    @silvername said:

    prova a levare l'attributo "value" dal tag "select" e lascia il "value" solo nelle "option"

    Non va neanche così...


  • User

    Ciao, scusa la domanda forse banale, ma dove la recuperi la variabile "marca"? Non manca un:

    $marca=$_POST["marca"];

    Scusa, ho dato una lettura veloce, magari fai in altro modo...


  • User Newbie

    @Tommy09 said:

    Ciao, scusa la domanda forse banale, ma dove la recuperi la variabile "marca"? Non manca un:

    $marca=$_POST["marca"];

    Scusa, ho dato una lettura veloce, magari fai in altro modo...

    Ciao,
    la variabile era recuperata, ma non funzionava lo stesso. Ora ho trovato la soluzione, ma non è del tutto corretta. Volevo fare in modo che la validazione dei campi e l'invio della mail avvenissero sulla stessa pagina ma non riesco. Hai qualche suggerimento?
    Grazie!


  • User

    Se vuoi fare una cosa simile laa soluzione secondo me è nell'utilizzo di AJAX come hai tentato di fare nell'esempio precedente. Percui, compili il form, con JS fai un controllo sui dati inseriti, qualora sia tutto inserito secondo le tue regole mandi tutto al file PHP con ajax e invii l'email. Il funzionamento perciò è come quello che hai adottato te, non ho guardato ne testato il funzionamento del codice, in ogni caso cos'è che non funziona? perchè la soluzione "non è del tutto corretta?"


  • User Newbie

    @Tommy09 said:

    Se vuoi fare una cosa simile laa soluzione secondo me è nell'utilizzo di AJAX come hai tentato di fare nell'esempio precedente. Percui, compili il form, con JS fai un controllo sui dati inseriti, qualora sia tutto inserito secondo le tue regole mandi tutto al file PHP con ajax e invii l'email. Il funzionamento perciò è come quello che hai adottato te, non ho guardato ne testato il funzionamento del codice, in ogni caso cos'è che non funziona? perchè la soluzione "non è del tutto corretta?"

    Praticamente il problema è che devo per forza inserire un "action" nel form, se no non funziona. Non è del tutto corretta perchè (aggiungendo l'action) ovviamente mi riporta alla pagina PHP.
    La cosa strana è che solo se inserisco la select MARCA non funziona come vorrei, mentre il form "normale" per richiesta informazioni sì. Non riesco a capire dove sia il problema (oltretutto io non so un granchè di php)


  • Moderatore

    Prova a cambiare questa:

    <input type="submit" class="btn btn-blue btn-effect" id="invia" name="invia" value="INVIA" />

    con questa:

    <input type="button" class="btn btn-blue btn-effect" id="invia" name="invia" value="INVIA" />


  • User Newbie

    @Shad said:

    Prova a cambiare questa:

    <input type="submit" class="btn btn-blue btn-effect" id="invia" name="invia" value="INVIA" />

    con questa:

    <input type="button" class="btn btn-blue btn-effect" id="invia" name="invia" value="INVIA" />

    Cambiando il codice che mi hai detto tu nella mail non compaiono i campi compilati... cosa devo modificare?

    Ti metto di nuovo i codici:

    $(document).ready(function(){
        $("#invia").click(function(){
        
        //Recuperiamo tutte le variabili
            var valid = '';
            var isr = ' <p>&Eacute; richiesto';
            var name = $("#nome").val();
            var marca = $("#marca option:selected").val();
            var mail = $("#email").val();
            var subject = $("#oggetto").val();
            var messaggio = $("#messaggio").val();
        //Eseguiamo una serie di controlli
            if (name.length<1) {
                valid += isr+' un nome valido</p>';
            }
            if (!mail.match(/^([a-z0-9._-]+@[a-z0-9._-]+\.[a-z]{2,4}$)/i)) {
                valid += isr+' un indirizzo e-mail valido</p>';
            }
            if (marca.length<1) {
                valid += isr+' una marca valida</p>';
            }
            if (subject.length<1) {
                valid += isr+' un oggetto valido</p>';
            }
            
        //Se i controlli non vengono superati, appare il messaggio di errore.
            if (valid!='') {
                $("#risposta").fadeIn("slow");
                $("#risposta").html("<p><b>Errore:</b></p>"+valid);
                $("#risposta").css("background-color","#FFFFF");
                $("#risposta").css("color","rgba(116,0,1,1.00)");
            }
            //Se i controlli vengono superati, compare un messaggio di invio in corso
            else {
                var datastr ='name=' + name + '&mail=' + mail + '&subject=' + subject + '&messaggio=' + encodeURIComponent(messaggio);
                $("#risposta").css("display", "block");
                $("#risposta").css("background-color","#FFFFF");
                $("#risposta").css("color"," rgba(66,66,66,1.00)");
                $("#risposta").html("<p>Invio del messaggio in corso..</p>");
                $("#risposta").fadeIn("slow");
                setTimeout("send('"+datastr+"')",2000);
            }
            return false;
        });
    });
    //Creazione della funzione di invio. Si baserà sul nostro file php "mail.php".
    function send(datastr){
        $.ajax({    
            type: "POST",
            url: "mail.php",
            data: datastr,
            cache: false,
            success: function(html){
            $("#risposta").fadeIn("slow");
            $("#risposta").html(html);
            $("#risposta").css("background-color","#FFFFF");
            $("#risposta").css("color"," rgba(107,130,39,1.00)");
            setTimeout('$("#risposta").fadeOut("slow")',2000);
        }
        });
    }
    
    
    

    [PHP]<?php
    //Recuperiamo tutte le variabili
    $mail = $_POST['email'];
    $name = $_POST['nome'];
    $subject = $_POST['oggetto'];
    $marca = $_POST['marca'];
    $messaggio = $_POST['messaggio'];
    $ip = $_SERVER['REMOTE_ADDR'];

    //Qui andrà inserito il tuo indirizzo e-mail
    $to = "[email protected]";

    //Creazione del mesaggio da inviare
    $message = "<p> <strong>Nome:</strong> ".$name." </p><p><strong>Mail:</strong> ".$mail." </p> <p><strong>Oggetto:</strong> ".$subject." </p><p><strong>Marca:</strong> ".$marca." </p>";
    $message .= "<p> <strong>Messaggio:</strong> ".$messaggio."<br /><br /></p>";
    $message .= "<p>IP: ".$ip."<br /></p>";

    $headers = "From: $mail \n";
    $headers .= "Reply-To: $mail \n";
    $headers .= "MIME-Version: 1.0 \n";
    $headers .= "Content-Type: text/html; charset=ISO-8859-1 \n";

    //Se l'e-mail viene spedita correttamente, compare un messaggio di avvenuto invio
    if(mail($to, $subject,$message, $headers)){
    echo "<p>Messaggio inviato con successo!</p>";
    }
    //Altrimenti un messaggio di errore
    else{
    echo "<p>Ci sono stati degli errori nell'invio della e-mail. Riprova</p>";
    }
    ?>

    [/PHP]

    [HTML]<form id="formail" method="post" action="" name="formail">
    <div id="risposta">
    </div>
    <div class="input-field">
    <p>Nome:</p>
    <input type="text" id="nome" class="form-control" name="nome" /><br />
    </div>
    <div class="input-field">
    <p>Marca:</p>
    <select id="marca" class="form-control" name="marca">
    <option value="FIAT">FIAT</option>
    <option value="LANCIA">LANCIA</option>
    <option value="ABART">ABART</option>
    <option value="ALFA">ALFA</option>
    </select>
    </div>
    <div class="input-field">
    <p>E-mail:</p>
    <input type="email" id="email" class="form-control" name="email"/><br />
    </div>
    <div class="input-field">
    <p>Oggetto:</p>
    <input type="text" id="oggetto" class="form-control" name="oggetto"/><br />
    </div>
    <div class="input-field">
    <p>Messaggio:</p>
    <textarea id="messaggio" class="form-control" name="messaggio" rows="5" cols="4"></textarea><br />
    </div>
    <input type="button" class="btn btn-blue btn-effect" id="invia" name="invia" value="INVIA" />
    </form> [/HTML]


  • Moderatore

    Togli l'action del form e per inviare il form non usare un campo INPUT.. Ad esempio se usi Bootstrap (sembra quello dal nome delle classi) utilizza il tag <a>.


  • User Newbie

    @MiWebDesign said:

    Togli l'action del form e per inviare il form non usare un campo INPUT.. Ad esempio se usi Bootstrap (sembra quello dal nome delle classi) utilizza il tag <a>.

    Riesci a farmi un esempio di come modificheresti il campo input?
    Grazie mille!


  • Moderatore

    Per trasformare il tuo campo input in un tag <a> scrivi così:

    [HTML]
    <a class="btn btn-blue btn-effect" id="invia">INVIA</a>
    [/HTML]

    In questo modo non sei vincolato dal FORM in quanto non è un INPUT SUBMIT.


  • User Newbie

    @MiWebDesign said:

    Per trasformare il tuo campo input in un tag <a> scrivi così:

    [HTML]
    <a class="btn btn-blue btn-effect" id="invia">INVIA</a>
    [/HTML]

    In questo modo non sei vincolato dal FORM in quanto non è un INPUT SUBMIT.

    Ora verifica tutto correttamente sulla pagina, ma quando ricevo la mail i campi non sono compilati..solo il messaggio compare..cosa può essere?


  • Moderatore

    Beh... Prima mandi variabili di nome: name,mail,subject tramite AJAX

    ** var datastr ='name=' + name + '&mail=' + mail + '&subject=' + subject + '&messaggio=' + encodeURIComponent(messaggio);

    E poi vorresti recuperle con i nomi:

    $mail = $_POST['email'];
    $name = $_POST['nome'];
    $subject = $_POST['oggetto'];

    **
    Presta maggiore attenzione...il nome della variabile che cerchi di recuperare tramite PHP è quella contenuta dentro POST e non quella preceduta dal simbolo del dollaro.


  • User Newbie

    @MiWebDesign said:

    Beh... Prima mandi variabili di nome: name,mail,subject tramite AJAX

    ** var datastr ='name=' + name + '&mail=' + mail + '&subject=' + subject + '&messaggio=' + encodeURIComponent(messaggio);

    E poi vorresti recuperle con i nomi:

    $mail = $_POST['email'];
    $name = $_POST['nome'];
    $subject = $_POST['oggetto'];

    **
    Presta maggiore attenzione...il nome della variabile che cerchi di recuperare tramite PHP è quella contenuta dentro POST e non quella preceduta dal simbolo del dollaro.

    Ok, ora vedo di nuovo e-mail e nome..ma l'oggetto e la marca no..come posso fare? cosa continuo a sbagliare?

    Grazie! Ho poca conoscenza di php e java purtroppo...


  • Moderatore

    Beh leggendo il tuo codice jQuery con cui fai la chiamata AJAX la marca neanche l'hai messa è normale che non te la recupera il PHP

    Non voglio postarti il codice già pronto altrimenti non capisci dove sbagli e non potrai migliorarti, ti dico ciò che devi fare e perchè sbagli:

    Vedi questa stringa? Serve a passare al file PHP le variabili che hai recuperato dai campi del FORM:

    **var datastr ='name=' + name + '&mail=' + mail + '&subject=' + subject + '&messaggio=' + encodeURIComponent(messaggio);

    **La marca non l'hai messa, quindi inserisci anche quella variabile.. Sembra un casino ma non devi leggerlo per come è scritto cerca di tradurlo in italiano

    "Creo la variabile datastr, gli assegno il nome alla variabile POST che recupererò tramite PHP e il valore della variabile Javascript.. E aggiungo una variabile mail, la cui assegno il valore della variabile Javascript mail... Ecc..."

    I nomi delle variabili che ti troverai in PHP sono quelli messi tra gli apici, quindi in questo caso avrai:

    $_POST["name"] - $_POST["mail"] - $_POST["subject"] ... ecc


  • User Newbie

    @MiWebDesign said:

    Beh leggendo il tuo codice jQuery con cui fai la chiamata AJAX la marca neanche l'hai messa è normale che non te la recupera il PHP

    Non voglio postarti il codice già pronto altrimenti non capisci dove sbagli e non potrai migliorarti, ti dico ciò che devi fare e perchè sbagli:

    Vedi questa stringa? Serve a passare al file PHP le variabili che hai recuperato dai campi del FORM:

    **var datastr ='name=' + name + '&mail=' + mail + '&subject=' + subject + '&messaggio=' + encodeURIComponent(messaggio);

    **La marca non l'hai messa, quindi inserisci anche quella variabile.. Sembra un casino ma non devi leggerlo per come è scritto cerca di tradurlo in italiano

    "Creo la variabile datastr, gli assegno il nome alla variabile POST che recupererò tramite PHP e il valore della variabile Javascript.. E aggiungo una variabile mail, la cui assegno il valore della variabile Javascript mail... Ecc..."

    I nomi delle variabili che ti troverai in PHP sono quelli messi tra gli apici, quindi in questo caso avrai:

    $_POST["name"] - $_POST["mail"] - $_POST["subject"] ... ecc

    Grazie, infatti preferisco capire dove è l'errore.

    Ho inserito questo codice:
    **var datastr ='name=' + name + '&mail=' + mail + '&subject=' + subject + '&marca=' + marca + '&messaggio=' + encodeURIComponent(messaggio); **

    ma ora non mi compare più neanche "invio in corso".
    Con questo codice invece, funzionava ma mancavano nella mail i campi compilati della marca e dell'oggetto:

    ** var isr = ' <p>É richiesto';
    var nome = $("#nome").val();
    var marca = $("#marca option:selected").val();
    var email = $("#email").val();
    var subject = $("#subject").val();
    var messaggio = $("#messaggio").val();
    **

    Cosa sbaglio?