[PHP] Refresh page on submit - Form con Swiftmailer

michela90

Nuovo Utente
1 Feb 2018
8
0
1
34
Bologna
Salve, sto testando un form realizzato con swiftmailer a questa pagina:
http://www.demaniomarittimo.com/offerta-lavoro/offerta-lavoro.php
Il form è a fondo pagina e con esso tutti i messaggi di success sent e di validation.
Ogni volta che si clicca su invia la pagina subisce una sorta di refresh e la pagina viene riportata al top facendo sparire sia il form che i vari messaggi di cui sopra.
Posto il file send.php di seguito:
PHP:
<?php
if(isset($_POST['invia'])){
   $error = FALSE;
   $nome = isset($_POST['nome']) ? trim( (string) $_POST['nome']) : '';
   $cognome = isset($_POST['cognome']) ? trim( (string) $_POST['cognome']) : '';
   $oggetto = isset($_POST['oggetto']) ? trim( (string) $_POST['oggetto']) : '';
   $email = isset($_POST['email']) ? trim( (string) $_POST['email']) : '';
   $messaggio = isset($_POST['messaggio']) ? trim( (string) $_POST['messaggio']) : '';

   if(empty($nome)) {
       $error = TRUE;
       $msg = 'Il campo nome è obbligatorio!';
       }
   else if(empty($cognome)){
       $error = TRUE;
       $msg = 'Il campo cognome è obbligatorio';
       }
   else if(empty($oggetto)){
       $error = TRUE;
       $msg = 'Il campo oggetto è obbligatorio';
       }
   else if(!preg_match('/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)+$/', $email)){
       $error = TRUE;
       $msg = 'Il campo email è obbligatorio. Verifica di averlo digitato correttamente.';
       }
   else if(empty($messaggio)){
       $error = TRUE;
       $msg = 'Il campo messaggio è obbligatorio';
       }
   else{
       require_once('lib/swift_required.php');
       require_once('config.php');
      
       if( (PORT_SMTP != FALSE) AND ( SECUTITY_SMTP != FALSE ) ){
           $transport = Swift_SmtpTransport::newInstance(HOST_SMTP, PORT_SMTP, SECUTITY_SMTP);
           }
       else if( PORT_SMTP != FALSE ){
           $transport = Swift_SmtpTransport::newInstance(HOST_SMTP, PORT_SMTP);
           }
       else{
           $transport = Swift_SmtpTransport::newInstance(HOST_SMTP);
           }
          
       $transport->setUsername(EMAIL_SMTP);
       $transport->setPassword(PASSWORD_SMTP);
 
       $mailer = Swift_Mailer::newInstance($transport);
      
       $message = Swift_Message::newInstance($oggetto);
       $message->setFrom(array($email => $nome));
       $message->setTo(array(EMAIL_DESTINATARIO));
       $message->setBody(
       '<html>' .
       '<head></head>' .
       '<body>' .
       'Nome:' . $nome . '<br />'.
       'Cognome:' . $cognome . '<br />'.
       'Messaggio:' . $messaggio . '<br />'.
       '</body>' .
       '</html>',
       'text/html'
       );
      
       $message->setReturnPath(EMAIL_SMTP);

       if( (isset($_FILES["allegato"])) AND ($_FILES["allegato"]['name'] != '') ){
           $tipologie_consentite = array('jpg', 'jpeg', 'png', 'gif', 'doc', 'docx', 'pdf', 'xls', 'zip', 'rar');
           $path_info = pathinfo($_FILES["allegato"]['name']);

           if(!is_uploaded_file($_FILES["allegato"]['tmp_name'])){               
               $error = TRUE;
               $msg = 'Si è verificato un errore durante il caricamento del file!';
               }
           else if(!in_array(strtolower($path_info['extension']), $tipologie_consentite)){
               $error = TRUE;
               $msg = 'Il file non è fra i tipi consentiti!';
               }

           else if($_FILES["allegato"]['size'] > MAX_DIM_FILE){

               $error = TRUE;
               $msg = 'Il file allegato eccede la dimensione massima consentita!';
               }

           else{         
               $attachment = Swift_Attachment::fromPath($_FILES["allegato"]['tmp_name']);
               $attachment->setFilename($_FILES["allegato"]['name']);
               $message->attach($attachment);
               }
           }
       }

   if($error === FALSE){
       $result = $mailer->send($message);
       if($result>0){
           $msg = "Email inviata. Presto sarai ricontattato.";
           }
       else{
           $msg = "Problemi nell'invio della email!";
           }
       }

   $get_var = urlencode($msg);
   header('location: offerta-lavoro.php?msg=' . $get_var);
   exit;
  }
?>
Immagino che il problema sia nell'header alle ultime righe che reindirizza alla pagina ma al momento non sono riuscita a risolvere il problema.


Qualche aiuto su come risolvere facendo si che la schermata resti sul form ad ogni submit?



Ringrazio in anticipo, Michela.
 
Ultima modifica di un moderatore:
Ciao, intanto il codice non va messo liberamente... bisogna inserirlo in maniera adeguata con gli strumenti dell'editor.
Per il tuo problema, che la pagina si ricarichi è normale, con un submit si fa una richiesta al server e viene ricaricata la pagina per ottenere le informazioni. Per evitare il refresh della pagina devi utilizare Ajax. Con le chiamate asincrone si ottengono risposte senza il refrash.
 
Ciao, intanto il codice non va messo liberamente... bisogna inserirlo in maniera adeguata con gli strumenti dell'editor.
Per il tuo problema, che la pagina si ricarichi è normale, con un submit si fa una richiesta al server e viene ricaricata la pagina per ottenere le informazioni. Per evitare il refresh della pagina devi utilizare Ajax. Con le chiamate asincrone si ottengono risposte senza il refrash.

Ciao e grazie per il tuo aiuto.


Scusami per il codice inserito male ma sono entrata da poco nel forum (lo so, non è una scusa..:(:().


Ho provato ad approfondire il tuo consiglio e ho trovato (forse) la possibilità di ovviare alla cosa tramite il metodo 'evt.preventDefault'.
Qualcosa del tipo:
PHP:
$('form').submit(function (evt) {
   evt.preventDefault(); //prevents the default action
}
(scusate ma sto imparando e mi rendo conto di non essere tecnicissima...:oops::oops:)


Pensi sia utile all'occorrenza?
 
Ultima modifica di un moderatore:
Te l'ho corretto io
Per PHP usa il tag [ PHP].......[ /PHP] senza lo spazio dopo la parentesi quadra
 
Ciao Michela,
non conosco swiftmailer ma, se ho capito bene, avevo il tuo stesso problema: avevo una pagilna molto lunga con un form
in fondo e ogni volta che premevo l'invio, la paginna veniva 'refresciata' riportandomi all'inizio.
Per ovviare a questo devi inserire un'ancora alla quale, una volta 'refresciata' la pagina, verrà reindirizzato l'utente (ad es. all'inizio del form).
Per lasciare invece 'pieni' i campi del form (nome, cognome, testo del messaggio ecc.) anche dopo il refresh della pagina d4vi usare le sessioni. Se mi dai un po' di tempo ti mando uno script di esempio.


Zorro
 
Clao Michela,
sono un po' occupato in questo periodo ma prima di inviarti lo script (in realtà gli script: sono tre) guarda se è questo quello che intendi. Ho cercato di simulare la realtà creando una pagina molto lunga in fondo alla quale ho inserito un form. Spero di aver interpretato bene ciò che intendi.


Zorro
 
Ultima modifica:
Ciao Zorro, l'interpretazione è perfetta. Analizzando il codice della tua pagina non riesco però a capire come tu faccia ad evitare il refreshe della pagina...
 
Ciao Michela,
in realtà la pagina viene 'refreshata' ma, avendo inserito un'àncora subito prima del form, la visualizzazione riparte
da lì, e non dall'inizio della pagina (e poi, se fai un sito per il demanio marittimo, l'àncora.........ci vuole:):):):p:p).
Ora preparo e ti mando glio script


Zorro
 
Ecco qui:

la pagina contenente il form (indice.php):

PHP:
<?php
session_start();
$testo = $_SESSION['MESSAGGIO'];
$ogg = $_SESSION['OGGETTO'];
$nomin = $_SESSION['NOMIN'];
$mail = $_SESSION['EMAIL'];
$errore = $_SESSION['ERRORE2'];
?>

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
<style type="text/css">
#pagina {
    width:1000px;
    height:2000px;
    margin:0 auto;
    background-color:#FFE1B0;
}
#areamsg {
    width:750px;
    height:700px;
    margin:0 auto;
    border:solid 2px red;
    padding-left:50px;
 
    position:relative;
    top:1000px;
}
</style>
</head>

<body>
<?php
echo '<div id="pagina">';
echo '<br><h1><center><u>Pagina di esempio</u></center></h1>';
echo '<center>(il form è in fondo alla pagina)</center>';
echo '    <div id="areamsg">';
echo '        <a name="pluto" id="pluto"></a>';      //qui inserisco un'àncora di nome e id = pluto
echo '        <h1><u>Contattami</u></h1><br>';
echo '        <form action="inviamail.php" method="get">';
echo '            <table border="0" width="400">';
echo '                <tr>';
echo '                    <td><b>Nominativo:</b></td>';
echo '                </tr>';
echo '                <tr>';
echo '                    <td><input type="text" name="nome" size="40" value="'.$nomin.'"></td>';
echo '                </tr>';
echo '                <tr>';
echo '                    <td><b>Oggetto:</b></td>';
echo '                </tr>';
echo '                <tr>';
echo '                  <td><input type="text" name="ogg" size="40" value="'.$ogg.'"></td>';
echo '                </tr>';
echo '                <tr>';
echo '                    <td><b>E_mail:</b></td>';
echo '                </tr>';
echo '                <tr>';
echo '                  <td><input type="text" name="mail" size="40" value="'.$mail.'"></td>';
echo '                </tr>';
echo '                <tr>';
echo '                    <td><b>Messaggio:</b></td>';
echo '                </tr>';
echo '                <tr>';
echo '                    <td><textarea name="commento" rows="15" cols="60">'.$testo.'</textarea></td>';
echo '                </tr>';
echo '                <tr>';
echo '                    <td height="50">'.$errore.'</td>';
echo '                </tr>';
echo '                <tr>';
echo '                    <td height="80"><input type="submit" name="invia" value="Invia Messaggio"></td>';
echo '                </tr>';
echo '            </table>';
echo '            </form>';
echo '        </div>';
echo '</div>';

?>
</body>
</html>


........il controllo del form (inviamail.php):


PHP:
<?php

$to = '';
$testo = $_GET['commento'];
$ogg = $_GET['ogg'];
$nomin = $_GET['nome'];
$mail = $_GET['mail'];

session_start();
$_SESSION['MESSAGGIO'] = $testo;
$_SESSION['OGGETTO'] = $ogg;
$_SESSION['NOMIN'] = $nomin;
$_SESSION['EMAIL'] = $mail;
 
$pattmail = '/^[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)?@[a-zA-Z]+\.[a-zA-Z]{2,3}$/';
$pattnomin = '/^([A-Za-z]+ )?[A-Za-z]+\'?([a-zA-Z]+)*$/';


if (!preg_match($pattnomin, $nomin)) {
    header("location: indice.php#pluto");         //in caso di errore rimanda alla pagina indice.php nel punto in cui si trova l'ancora con id = pluto
    $_SESSION['ERRORE2'] = " ATTENZIONE!!<br>Nominativo mancante o non corretto";
} else {
    if ($ogg == '') {
        header("location: indice.php#pluto");
        $_SESSION['ERRORE2'] = " ATTENZIONE!!<br>Devi inserire l'oggetto";
    } else {
        if (!preg_match($pattmail, $mail)) {
            $_SESSION['ERRORE2'] = " ATTENZIONE!!<br>E_mail mancante o non corretta";
            header("location: indice.php#pluto");
        } else {
            if ($testo == '') {
                $_SESSION['ERRORE2'] = " ATTENZIONE!!<br>Devi inserire il messaggio";
                header("location: indice.php#pluto");
            } else {
                if (mail($to,$ogg,'e_mail mittente: '.$mail,$testo)) {
                    echo 'La mail è stata correttamente inviata, grazie';
                }
                $_SESSION['ERRORE2'] = "E_mail correttamente inviata.<br>Ti ringrazio per avermi contattato. Ti risponderò il prima possibile.";
                header("location: indice.php#pluto");
           }
        }
    }
}

?>



.......ed infine lo script contenente le variabili di sessione (resetta.php):


PHP:
<?php
session_start();
$_SESSION['MESSAGGIO'] = '';
$_SESSION['OGGETTO'] = '';
$_SESSION['NOMIN'] = '';
$_SESSION['EMAIL'] = '';
$_SESSION['ERRORE2'] = '';

require('indice.php');
?>
 
Ultima modifica:
Ciao ragazzi e grazie ancora per il vostro prezioso contributo.


Dunque, ho provato la soluzione del refresh via ancora di Zorro inserendo poco prima del tag <form> l'ancora:

HTML:
<a name="pluto" id="pluto"></a>

e sostituendo nel file send la riga:

PHP:
header('location: offerta-lavoro.php?msg=' . $get_var);

con:

PHP:
header('location: offerta-lavoro.php#pluto?msg=' . $get_var);

La pagina però purtroppo continua a refreshare non mostrando più i messaggi di success sent e di validazione.

Probabilmente perchè (o almeno credo) gli script che utilizzo non sono compatibili con questo tipo di soluzione (o più probabilmente perchè ho sbagliato qualcosa..:().

Peccato, il concetto di mettere un ancora su una pagina di demanio marittimo mi piaceva in effetti :D:D

Ho provato anche ad inoltrarmi nel tutorial di Filomeni e, anche se spiegato benissimo, le mie conoscenze js e php non sono tali da permettermi di riuscire ad adattarlo agli script della mia pagina...:oops:

Grazie ancora una volta per i tanti consigli ragazzi.
 
é solo un tentativo: prova a cambiare la riga

PHP:
header('location: offerta-lavoro.php#pluto?msg=' . $get_var);

in

PHP:
header('location: offerta-lavoro.php#pluto;


Gli eventuali messaggi di errore provenienti dal form (se ho ben interptretato il significato di ?msg=' . $get_var) vengono memorizzati in una variabile di sessione, ad esempio

PHP:
$_SESSION['ERRORE2'] = " ATTENZIONE!!<br>Devi inserire il messaggio";

e richiamata poi nella pagina principale con

PHP:
session_start();
...........
...........
...........
$errore = $_SESSION['ERRORE2'];
 
Ultima modifica:
Ciao Zorro e grazie per l'ulteriore aiuto.

La soluzione funziona, il refresh non avviene ma non appare più il messaggio 'Email inviata con successo' all'invio.

Probabilmente lo stesso era proprio gestito dalle righe

PHP:
$get_var = urlencode($msg);
    header('location: offerta-lavoro.php?msg=' . $get_var);
    exit;
  }

che ora ho cambiato in

PHP:
$get_var = urlencode($msg);
    header('location: offerta-lavoro.php#pluto');
    exit;
  }

Anche la email viene inviata correttamente. Però niente messaggio success sent.
 
in realtà, per memorizzare i messaggi provenienti dal form (non hai inserito......., e_mail correttamete inviata ecc.) devi usare
le variabili di sessione. Prova a togliere $get_var e ad usare solo le sessioni come dall'esempio che ti ho postato (se a me
funziona, perché non dovrebbe funzionare a te?)
 

Discussioni simili