Advertisement
  1. Web Design
  2. Bootstrap
Webdesign

Creare un form di contatto basato su Bootstrap usando PHP e AJAX

by
Difficulty:BeginnerLength:LongLanguages:

Italian (Italiano) translation by Francesco (you can also view the original English article)

Final product image
What You'll Be Creating

In questo tutorial vado oltre i passaggi per creare un modulo di contatto funzionante, utilizzando il framework di front-end sempre popolare Bootstrap, in combinazione con AJAX e PHP. Da lì possiamo esplorare alcune funzionalità aggiuntive come ad esempio alcune animazioni CSS fantasiose con animate.css, ulteriore convalida in JavaScript e migliorare l'esperienza utente con contenuto asincrono.

Al momento della scrittura Bootstrap 3.3.5 è la versione più recente e vale la pena menzionare che stiamo usando una build predefinita di Bootstrap (con un layout a 12 colonne) per questo tutorial. Quando si segue lungo assicurarsi che si stia utilizzando gli ultimi snippet e le strutture di codice come descritto nella documentazione di Bootstrap.

File e struttura delle cartelle

In primo luogo, vogliamo creare una directory radice e includere i seguenti file e cartelle:

Sarà necessario includere alcune librerie front-end per darci una mano, quindi andare avanti e scaricare (o creare riferimento esterno) le seguenti:

Aggiunte queste librerie, la struttura dei file diventa:

Costruire le basi del modulo

Aprire il file index.html, copiare la struttura di base di HTML seguente:

Questo è il nostro modello di html di base in cui dovremo costruire il contenuto per il modulo. Si può vedere che abbiamo collegato tutti i file CSS e JavaScript file (non abbiamo effettivamente bisogno di bootstrap.js per questo particolare esempio). Abbiamo incluso un viewport meta tag per aiutare le media query all'interno di Bootstrap. Il JavaScript è stato inserito nella parte inferiore del file per aiutare a fornire il contenuto principale per primo.

All'interno del nostro tag body, abbiamo incluso un div con una classe di col-sm-6 col-sm-offset-3. Questo significa fondamentalmente che all'interno della viewport sm (piccola) e oltre vogliamo visualizzare una colonna di larghezza di 50% (ci sono un massimo di 12 colonne). La classe col-sm-offset-3 rappresenta un margine di sinistra del 25%, producendo così un layout che è metà della finestra di schermo disponibile e centrata orizzontalmente. Da qui abbiamo incluso un h3 e iniziato le basi del nostro modulo. Assicurarsi di applicare un ID a questo form così possiamo associare un evento jQuery a questo più tardi.

the offset will push our DIV 25 from the right

Chi non risica non rosica

Per costruire lo scheletro del modulo possiamo copiare/incollare o scrivere il seguente codice all'interno dei tag <form></form>:

Si tratta di tutti i campi di input e pulsanti che userà l'utente. Il div iniziale con la classe assegnata row è classica sintassi Bootstrap, che rappresenta un raggruppamento orizzontale degli elementi della colonna. Le colonne all'interno di Bootstrap creano padding o spaziature – aggiungendo una riga intorno a questi rimuoverà il padding sulla sinistra e destra permettendo di inserirsi perfettamente all'interno del loro contenitore.

Abbiamo creato due colonne con la classe col-sm-6 (50%) che useremo per suddividere il nostro modulo. All'interno del primo col-sm-6 abbiamo creato un'etichetta e il campo per il nome, il secondo è per l'enail. Ognuno di questi include un'etichetta con un proprio attributo for in modo da poter essere indirizzati al campo associato. Ognuna di queste colonne include un form-group che semanticamente raggruppa l'etichetta e il campo insieme e applica un piccolo margine in basso.

Displaying two fields inline

Tipografia

Bootstrap consente di utilizzare classi di tipografia da H1-H6. Queste classi ci aiutano a stilizzare gli elementi inline senza l'aggiunta di margini aggiuntivi o creare elementi di blocco. Abbiamo utilizzato un H4 per aggiungere stile rapidamente a queste etichette rendendole grandi e chiare.

La classe form-control applicata a ciascun input consente di estendersi su tutta la lunghezza del contenitore (larghezza 100%). Applica anche vari styling per aiutare a costruire un form facile da leggere (grande altezza, bordi ecc).

Dopo queste colonne includiamo il corpo del messaggio. Ancora una volta, raggruppiamo questo all'interno di un form-group e applichiamo stili simili alla nostra area di testo ed etichetta come abbiamo fatto prima.

La Call to Action

Infine includiamo il pulsante Invia. Bootstrap ha un numero di classi per vari colori/stati pulsante e tipografia. Abbiamo optato per utilizzare il pulsante di "success" (btn-success) che è, per impostazione predefinita, verde. Inoltre abbiamo bisogno di applicare la classe di base btn per ripristinare le funzionalità di base dei pulsanti (bordo, imbottitura, allineamento testo, font-weight). Abbiamo applicato una classe btn-lg che lo rende grande e, infine, una classe pull-right che lo fa spostare a destra.

Dopo il nostro pulsante abbiamo incluso un div con id #msgSubmit e applicato le seguenti classi: "h3 text-center hidden". L'h3 contribuisce a creare un'intestazione di dimensioni maggiore, text-center (avete indovinato) imposta l'allineamento del testo al centro e infine abbiamo fissato la classe hidden che definisce display su none e visibility su hidden.

Completed Form

Aggiunta di funzionalità di invio

Come si può vedere visualizzando nel browser preferito abbiamo creato un modulo base di Bootstrap. Tuttavia in realtà non fa nulla ancora. Il nostro prossimo passo sarà creare la funzione che accetta gli input degli utenti e li spedisce in modo asincrono al nostro PHP mailer.

Aprite il file scripts.js e copiate il seguente codice:

Questo pezzo di codice è uno snippet di jQuery che è in attesa di una funzione di invio sul nostro id #contactForm (come impostato prima). Con questa funzione analizziamo una variabile di event che memorizza l'azione del modulo di invio alla funzione. event.preventDeafult(); interrompe l'invio del modulo come farebbe normalmente, ossia aggiornare la pagina come è impostata alcuna azione di forma. Infine, chiama la  funzione submitForm();.

submitForm();

Poi costruiamo la funzione submitForm(); come segue:

Le tre variabili impostate servono a catturare i valori di ciascun input dal form e assegnarli a una variabile JavaScript da utilizzare successivamente.

Inizializziamo un oggetto AJAX con jQuery e impostiamo i parametri type su post, URL sul percorso del file PHP, data con i dati che vogliamo inviare e la funzione di successo come callback. Data include tutte le tre variabili concatenate con id/label associati. La funzione di callback di successo viene chiamato quando l'oggetto AJAX riceve correttamente informazioni dallo script PHP. La funzione recupera il testo restituito e controlla se è uguale alla stringa "success". Se è così attiva la funzione finale formSuccess.

La funzione formSuccess rimuove la classe nascosta da div #msgSubmit che abbiamo applicato in precedenza, rivelando così il testo.

Usare la funzione Mail di PHP

Infine, abbiamo bisogno scrivere uno script PHP per ricevere i dati e inviare i nostri contenuti tramite la funzione mail di php integrata. Aprite process.php e includete il seguente codice:

Come nel frammento di jQuery visto in precedenza, abbiamo bisogno di raccogliere e memorizzare le variabili che vogliamo utilizzare. Dalla funzione post possiamo raccogliere le tre variabili di input e assegnargli nomi simili alle variabili all'interno di PHP. La variabile $EmailTo è un indirizzo di email predefinito che è possibile impostare nello script per inviare al tuo indirizzo email al momento dell'invio del modulo. $Subject è una stringa che si desidera utilizzare come oggetto dell'email.

Il testo dell'email è costruito intorno alle tre variabili stabilite. In primo luogo impostiamo del testo descrittivo come "nome:", quindi la variabile, quindi una nuova riga come stabilito mediante /n (nuova interruzione di linea/nuova linea). Questo è ripetuto e concatenato alla variabile $body.

Per infine inviare l'e-mail la attacchiamo all'interno della funzione di posta elettronica. Assegnando la variabile $success includiamo l'indirizzo di posta elettronica cui inviare, l'oggetto, il corpo e la e-mail del mittente.

Per avviare il processo di invio email possiamo chiamarlo all'interno di un'istruzione if. Questo serve anche a controllare se è stato inviato con successo o no. Se la funzione di posta elettronica ha restituito "true" lo script restituirà "successo", se ha esito negativo restituirà "invalid".

Questo risultato sarà restituito all'oggetto AJAX e gestito sul lato client. La bellezza di AJAX è che tutto questo avviene in modo asincrono sul lato client, consentendo all'utente di continuare a utilizzare il sito mentre viene inviato.

Miglioramenti

Dopo aver creato la struttura di base e la funzionalità del nostro form nella prima metà di questo tutorial, ora ci metteremo all'opera per fornire un feedback utente attraverso varie funzionalità aggiuntive che possiamo includere. In particolare, ci occuperemo di fornire feedback del form sia sul lato client che sul lato server di gestione degli errori.

Ancora una volta, per aiutare con il processo di creazione di validazione di form, utilizzeremo alcuni strumenti. Questi includono:

Aggiungere questi nel progetto come fatto in precedenza con Bootstrap e jQuery. Questi strumenti ci aiuteranno a fornire un feedback all'utente quando si invia il modulo. Ci sono un sacco di strumenti validatori e framework là fuori (tra cui validazione HTML5 nativo), ma ho usato il "Bootstrap Validator" che ben si integra con il nostro modulo corrente.

La struttura del progetto dovrebbe ora essere simile a questo:

Convalida del nostro modulo

Iniziamo avviando il validator per controllare il form una volta inviato. Tornando al nostro file scripts.js abbiamo bisogno di modificare il primo blocco di codice che chiama la funzione submitForm() quando il form viene inviato.

Abbiamo bisogno di aggiornarlo al seguente codice:

Questo nuovo frammento di codice controlla se il validatore di Bootstrap ha riscontrato un problema e ha fermato l'elaborazione. In caso contrario, si continua come al solito. Abbiamo ancora bisogno di prevenire l'azione predefinita (ricaricare la pagina) in caso di successo nell'invio del modulo.

Facendo clic su Invia il nostro modulo quando non è completamente riempito mostrerà i campi vuoti evidenziati in rosso così da mostrare che cosa deve essere inserito.

Nel processo di aggiunta di questa convalida abbiamo rimosso o impedito che la convalida nativa HTML5 abbia luogo. Possiamo aggiungere ulteriore contesto alla nostra convalida includendo i messaggi di errore. Bootstrap Validator ha una caratteristica deliziosa che lascia spazio a messaggi di errore per ogni input da visualizzare abbastanza facilmente. Per aggiungere questi abbiamo bisogno di aggiungere qualche ulteriore codice HTML per dargli un luogo dove poter essere visualizzati.

All'interno di ogni form-group sotto l'input dobbiamo inserire il seguente codice html:

Ad esempio, ecco il div extra aggiunto per i campi nome e indirizzo Email:

Re-inviando il modulo ora dovrebbe mostrare il messaggio di errore predefinito quando i campi vengono lasciati vuoti "Please fill in this field.". Aggiungendo un data-attribute all'input chiamato "data-error" è possibile includere un messaggio di errore personalizzato. Per esempio:

C'è tutta una serie di altre caratteristiche come patterns di espressioni regolari che Bootstrap validator può accettare. È possibile visualizzare più su Github.

Aggiunta di animazione al feedback

La nostra convalida lato client sembra buona; abbiamo alcune evidenziazioni che si verificano su campi vuoti. Tuttavia, sarebbe bene aggiungere ulteriore animazione al form e aggiungere ulteriori messaggi consentendo all'utente di sapere ciò che sta accadendo. Attualmente disponiamo di un "Message submitted!" messaggio che appare in caso di successo, ma che cosa succede in caso di un errore?

Per utilizzare il codice esistente e rendere il nostro script un po' più riutilizzabile modificheremo il messaggio di successo esistente per accettare anche gli errori.

Prima le cose prima, andiamo a rimuovere il testo "Message Submitted!" dal codice HTML e lasciamo un div vuoto:

Ora dobbiamo creare una nuova funzione per gestire lo stato del messaggio. Aggiungiamo questa funzione in fondo a scripts.js

Questa funzione accetta due argomenti. valid sarà una variabile booleana: se è vero verrà visualizzato un messaggio di successo, falso sarà un messaggio di errore. msg sarà il messaggio che ci mostrerà in div sullo schermo.

In primo luogo la funzione consente di verificare se si ha a che fare con un messaggio di successo o un messaggio di errore controllando il valore della variabile valid. In entrambi i casi imposta la variabile di classe con le classi CSS appropriate (abbiamo bisogno di ri-includere la h3 e text-center poichè ci sarà la rimozione di questi di default più tardi nella funzione).

Nota: stiamo usando alcune classi di animate.css per la classe di successo del messaggio. L'animazione tada si attiverà in caso di successo.

Infine, la funzione rimuove tutte le classi da #msgSubmit (evita scontri di classi), quindi aggiunge le classi impostate prima e quindi aggiunge il testo del messaggio all'interno del div.

All'interno della nostra iniziazione del validator che abbiamo aggiornato all'inizio di questa sezione possiamo aggiungere la seguente chiamata di funzione all'interno di un'istruzione if quando è uguale a true.

Inviando il modulo con campi vuoti, si dovrebbe ora visualizzare il messaggio di errore "Did you fill in the form properly?"

Un ultimo passo per questa nuova funzione di submitMSG è quello di chiamarlo quando il nostro form è inviato con successo. Aggiornare la funzione di formSuccess() al seguente:

In primo luogo vogliamo ripristinare la forma e cancellare i valori sul successo, poi chiamiamo la nostra funzione submitMSG come prima con un messaggio di successo. Con successo inviando il modulo dovrebbe ora visualizzare il messaggio di successo con un effetto di animazione di tada animate.css.

Shake it

Cos'è più animato, giusto? Aggiungiamo un'altra animazione per l'intero modulo in caso di errore, un universale "scuotimento" dovrebbe essere buono!

Create una nuova funzione proprio dopo formSuccess() e chiamatela formError()

Questa funzione utilizza un approccio trovato nella pagina di demo di animate.css che permette di aggiungere un'animazione a un elemento e quindi richiamarlol/aggiungerlo ancora e ancora. Le animazioni CSS hanno un fastidioso problema in cui una volta che vengono riprodotte tendono a non funzionare di nuovo, anche quando la classe viene rimossa e aggiunta di nuovo. Questa funzione consente di reimpostare le classi su fine animazione, consentendo di ri-aggiungerle nuovamente. Quando l'utente fa clic su Invia su un form incompleto vogliamo che l'animazione shake venga eseguita.  E se inviato nuovamente quando è ancora sbagliato ha bisogno di funzionare di nuovo.

Possiamo chiamare questa funzione formError() prima della funzione submitMSG() che abbiamo creato per un messaggio di errore. Per esempio:

Ora quando si invia un modulo vuoto scuoterà per consentire all'utente di sapere che qualcosa è andato storto.

Convalida

Tutta questa convalida lato client è buona, tuttavia qualsiasi utente potrebbe disattivare queste misure e inviare il modulo con campi vuoti, modificando il codice all'interno del loro browser. È sempre una buona norma fare alcuni controlli di convalida lato server, per catturare qualsiasi cosa che viene passata.

Apriamo il nostro file di process.php perchè abbiamo bisogno di apportare alcune modifiche a questo per controllare se i campi sono vuoti; se non lo sono, inviamo un messaggio al front-end. Creiamo una variabile denominata $errorMSG per catturare i nostri messaggi di errore e quindi includere ulteriore convalida di $_POST.

Questo codice PHP controlla se sono vuote prima di impostarle come variabili corrispondenti (sostituisce il codice esistente impostando le variabili da $_POST). Se sono vuoti quindi impostiamo un messaggio base da inviare al client. Possiamo fare molto più che convalidare i campi se sono vuoti (se sono troppo corti/lunghi, confrontarlo con le espressioni regolari ecc.) in PHP e JavaScript. Tuttavia, per ragioni di semplicità, sarà meglio limitarlo solo ai campi vuoti per ora.

Abbiamo bisogno di inviare nuovamente il messaggio di errore alla chiamata AJAX iniziale da visualizzare nel browser. Modificheremo l'istruzione if che abbiamo creato in precedenza nella parte inferiore del file PHP.

Nella nostra istruzione if possiamo anche controllare se $errorMSG è vuota ("") insieme allo stato della funzione mail integrato abbiamo usato nella variabile $success. Nella nostra condizione else abbiamo incluso un ulteriore controllo. Questo controlla solo se l'errore era un risultato di errore di $success, se quindi inviare di nuovo “Something went wrong :(“. Altrimenti visualizziamo il messaggio che è stato compilato quando abbiamo controllato per i valori vuoti.

Un ultimo passo è quello di accettare questo nuovo messaggio nel nostro AJAX e visualizzarlo sul form. Abbiamo bisogno di aggiornare l'oggetto AJAX all'interno del file scripts.js come segue:

Abbiamo appena aggiornato la condizione else che controlla  se text = = success. Nel nostro else abbiamo chiamato la funzione di formError() che applicherà l'animazione per agitare e abbiamo chiesto la funzione submitMSG() per visualizzare il testo restituito indietro da PHP. Il testo restituito potrà essere “Something went wrong :(” o i campi ricevuti sono vuoti.

Conclusione

Andate su Github per dare un'occhiata al codice nella sua interezza – abbiamo fatto un sacco di strada!

Il nostro modulo ora deve fornire all'utente un feedback su quali campi sono corretti tramite convalida. Abbiamo fornito messaggi contestuali basati sullo stato e il messaggio restituito da PHP e implementato un ulteriore livello di convalida sul lato server per catturare quelli ignorati dalla convalida di front-end.

Nel complesso si dovrebbe ora avere un modulo di contatto pronto per essere integrato nel tuo sito Web. Spero vi sia piaciuto questo tutorial, sentitevi liberi di lasciare domande o opinioni nei commenti qui sotto!

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.