[PHP] Refresh page on submit - Form con Swiftmailer

michela90

Nuovo Utente
1 Feb 2018
8
0
1
31
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:

filomeni

Moderatore
Membro dello Staff
MOD
14 Mag 2006
1.052
6
38
50
Roseto degli Abruzzi (TE)
www.sitiweb.cloud
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.
 

michela90

Nuovo Utente
1 Feb 2018
8
0
1
31
Bologna
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:

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
4.398
338
83
Te l'ho corretto io
Per PHP usa il tag [ PHP].......[ /PHP] senza lo spazio dopo la parentesi quadra
 

zorro

Utente Attivo
20 Ott 2014
273
11
18
ROMA
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
 

zorro

Utente Attivo
20 Ott 2014
273
11
18
ROMA
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:

michela90

Nuovo Utente
1 Feb 2018
8
0
1
31
Bologna
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...
 

zorro

Utente Attivo
20 Ott 2014
273
11
18
ROMA
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
 

zorro

Utente Attivo
20 Ott 2014
273
11
18
ROMA
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]+)[email protected][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:

michela90

Nuovo Utente
1 Feb 2018
8
0
1
31
Bologna
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.
 

zorro

Utente Attivo
20 Ott 2014
273
11
18
ROMA
é 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:

michela90

Nuovo Utente
1 Feb 2018
8
0
1
31
Bologna
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.
 

zorro

Utente Attivo
20 Ott 2014
273
11
18
ROMA
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
Autore Titolo Forum Risposte Data
C Refresh parte di codice pagina php PHP 6
E Problema refresh PHP PHP 3
K [PHP] Passaggio Variabili Senza Refresh Di Pagina PHP 1
A [Javascript] [PHP] Scroll refresh chat Javascript 2
C [RISOLTO][PHP] Passaggio variabili senza refresh di pagina PHP 7
Z [PHP] Informazione al pulsante REFRESH PHP 2
gandalf1959 [PHP] refresh della pagina dopo submit PHP 3
L Refresh include php con jquery problemi negli script dopo load jQuery 2
F refresh div con variabile php jQuery 2
A Alternativa al <meta http-equiv="refresh" content="5;url=code.php" > HTML e CSS 5
max_400 php: refresh solamente alla ricezione dei dai - by max4001976 PHP 4
S Refresh immagine php PHP 3
T funzione header php e refresh PHP 2
G Invio form con PHP PHP 2
T fatture con voci fattura in php PHP 0
T ALTRO PROBLEMA CON ARRAY PHP PHP 1
M Collegamento tra form html e script php PHP 4
M Problemi con la stampa dei valori in php PHP 1
W [Cerco collaborazioni] Sviluppatore Web (PHP) Offerte e Richieste di Lavoro e/o Collaborazione 1
D passare valori da database sql a php PHP 1
L Ricezione dei dati su file php da modulo html PHP 6
E Inviare variabile a PHP da ciclo in JS Javascript 0
A form PHP prenotazione tramite query PHP 2
A Form php prenotazione di un azienda sanitaria locale presso studio medico PHP 1
F menù select dinamico da db in php PHP 3
L Problemi form Pagina php HTML e CSS 3
L php mysql non salva solo id PHP 21
L php mysql cerca e visualizza pagina PHP 0
F Il codice php è giusto? PHP 2
R Aggiornare record mysql con Ajax, jQuery e php Ajax 2
A invio massivo dati a file php Javascript 4
Z MySql injection PHP PHP 1
V PHP form intersecate PHP 0
I [Offro][Retribuito] Programmatore Php Offerte e Richieste di Lavoro e/o Collaborazione 0
P Funzione jQuery Ajax invio file a php jQuery 1
C Dopo chiusura del tag php la stringa html va a capo PHP 1
E Transaction php PHP 11
B ciclare file xml con PHP PHP 1
L Estrazione dati php Database 6
A Aiuto per pagina php PHP 0
E Php select option e ajax PHP 23
I Aiuto php Dependent Lookup PHP 0
T arretramento versione PHP... PHP 3
D problema php mysql PHP 1
D problema php mysql PHP 1
E Barra di avanzamento codice PHP PHP 4
G creazione menu a tendina e invio a pagina php PHP 1
A inserire variabile php colore in div html PHP 2
Z Video protetto con PHP PHP 0
Z Problema di sincronizzazione PAYPAL con PHP PHP 1

Discussioni simili