[PHP] Refresh page on submit - Form con Swiftmailer

michela90

Nuovo Utente
1 Feb 2018
8
0
1
33
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.054
6
38
53
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
33
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.449
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
322
21
28
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
322
21
28
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
33
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
322
21
28
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
322
21
28
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]+)?@[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
33
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
322
21
28
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
33
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
322
21
28
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
F Cerco Hosting con VECCHIE versioni di php Hosting 0
Cosina Captcha php PHP 1
S passare un valore da un form a un file .php con metodo post PHP 4
N php msyql PHP 6
N php problemi a visualizzare video PHP 3
A menu a tendina php PHP 1
D protezione cartelle: blocco visualizzazione/scaricamento contenuto, ma abilitazione utilizzo dati da parte di file .php presenti sul sito Web Server 1
F Php date_diff PHP 1
K [PHP] Aggiungere caratteri ad una stringa in base alla lunghezza della stessa PHP 2
C Wp-admin a file php WordPress 5
Lino80 [Retribuito] Cerco programmatore php per modifica/inserimento funzione/valori da un plugin importer wordpress Offerte e Richieste di Lavoro e/o Collaborazione 0
csi Inviare file jpg in locale alla stampante con php PHP 0
M Passaggio variabili array php su un tasto jq PHP 3
E Php aggiornamento tabella PHP 9
G phpmailer e php 8.1 con estensione mysqli PHP 6
M Invio dati database via email php PHP 0
K [php] Problema con inner join PHP 4
K [php]form invio dati PHP 0
P Codifica caratteri speciali mysql php PHP 0
K [PHP] Problema con variabili concatenate. PHP 1
E Stampante termica escpos-php PHP 6
JeiMax Modifica codice php personalizzato PHP 2
G Come modificare un pdf in php PHP 1
U Link a doppio file PHP PHP 0
E PHP & jQuery PHP 8
N Passare array da php a javascript PHP 5
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
U PHP creare un file excel dopo ricerca nel DB PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
F Php e fatturazione elettronica PHP 0
P lanciare script asp (o php) da jquery Javascript 1
Couting95 inserire dati da un file di testo in una tabella in php PHP 1
P Data scraping in PHP non funziona PHP 4
C Calcoli matematici in php PHP 5
F Scrivere dei dati in word con php PHP 0
D PHP leggere cartella di Windows PHP 1

Discussioni simili