Nei primi due appuntamenti abbiamo imparato ad usare CodeIgniter e ad apprezzarne le doti di semplicità e flessibilità; in questa terza e ultima puntata vedremo come utilizzare gli Helper per realizzare efficacemente le nostre applicazioni.
Helper e Libraries
Gli Helper sono delle funzioni PHP fornite da CodeIgniter e raggruppate in categorie; la collezione comprende funzioni di formattazione/escape di stringhe, creazione di form, invio di email, prevenzione XSS (Cross-site Scripting), e molto altro.
Per caricare un helper è sufficiente inserire questa istruzione:
$this->load->helper('helper1'));
oppure:
$this->load->helper(array('helper1', 'helper2', 'helper3'));
dove helper1, helper2, eccetera sono gli identificatori degli helper (gli identificatori specificati nella documentazione). Ad esempio, per caricare le funzioni di form scriveremo:
$this->load->helper(array('form'));
Se la nostra applicazione deve fare un uso frequente di un certo helper possiamo istruire CodeIgniter in modo che effettui il caricamento automatico, per fare ciò è necessario modificare il file di configurazione application/config/autoload.php, aggiungendo all’array $autoload[‘helper’] gli identificatori necessari:
$autoload['helper'] = array('url', 'form');
Discorso simile per le Libraries, con alcune piccole differenze di utilizzo; le librerie infatti sono delle vere e proprie classi PHP, una cui istanza verrà aggiunta al controller, ovvero l’oggetto $this. Anche le librerie possono essere caricate automaticamente, l’array da modificare in autoload.php però è $autoload[‘libraries’]:
$autoload['libraries'] = array('form_validation');
Creazione di un form per l’invio di email
Vediamo ora come realizzare un form dei contatti per il nostro sito; solitamente questo tipo di pagina consente di inviare un messaggio a diversi destinatari:
- al responsabile commerciale dell’azienda, per questioni relative all’attività;
- al webmaster, per segnalare malfunzionamenti del sito, suggerimenti, ecc.
Iniziamo configurando l’autoloading delle librerie e degli helper necessari in autoload.php:
$autoload['libraries'] = array('form_validation', 'email'); ... $autoload['helper'] = array('url', 'form');
form_validation è la libreria che si occupa della validazione dei dati inseriti dall’utente.
Ecco quindi il nostro controller, da salvare nel file application/controllers/contact.php:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class Contact extends CI_Controller { public function index() { $data = array(); $this->getForm($data); // mostra form $this->load->view('contact', $data); } public function post() { $data = array(); $this->getForm($data); if ($this->validate() == FALSE) { $this->load->view('contact', $data); } else { $this->email->from($data['email']['value']); if ($data['recipient'] == 'COMMERCIAL') { $this->email->to('commercial@example.org'); } else if ($data['recipient'] == 'WEBMASTER') { $this->email->to('webmaster@example.org'); } $this->email->subject($data['subject']['value']); $this->email->message($data['message']['value']); $this->email->send(); // mostra messaggio di avvenuto invio $this->load->view('contact_success', $data); } } /* * metodi privati */ private function getForm(&$data) { $data['email'] = array( 'name' => 'email', 'id' => 'email', 'maxlength' => '255', 'size' => '50', 'value' => $this->input->post('email') ); $recipient = $this->input->post('recipient'); $data['recipient'] = $recipient; $data['recipient_COMMERCIAL'] = array( 'name' => 'recipient', 'id' => 'recipient_COMMERCIAL', 'value' => 'COMMERCIAL', 'checked' => $recipient == 'COMMERCIAL' ? true : false ); $data['recipient_WEBMASTER'] = array( 'name' => 'recipient', 'id' => 'recipient_WEBMASTER', 'value' => 'WEBMASTER', 'checked' => $recipient == 'WEBMASTER' ? true : false ); $data['subject'] = array( 'name' => 'subject', 'id' => 'subject', 'maxlength' => '255', 'size' => '50', 'value' => $this->input->post('subject') ); $data['message'] = array( 'name' => 'message', 'id' => 'message', 'rows' => '10', 'cols' => '80', 'value' => $this->input->post('message') ); } private function validate() { $config = array( array( 'field' => 'email', 'label' => 'Email', 'rules' => 'trim|required|valid_email' ), array( 'field' => 'recipient', 'label' => 'Destinatario', 'rules' => 'trim|required' ), array( 'field' => 'subject', 'label' => 'Oggetto', 'rules' => 'trim|required' ), array( 'field' => 'message', 'label' => 'Messaggio', 'rules' => 'trim|required' ) ); $this->form_validation->set_rules($config); return $this->form_validation->run(); } }
Abbiamo due metodi pubblici, index() e post(), che corrispondono ai path:
- index() : /index.php/contact/ oppure /index.php/contact/index;
- post() : index.php/contact/post.
Entrambi creano una variabile $data, di tipo Array, e la passano al metodo getForm(), che si occupa di inizializzarla. Da notare l’utilizzo della chiamata a $this->input->post(‘nomeparametro’) all’interno di getForm(). Può capitare infatti che l’utente non inserisca tutti i dati necessari o che commetta degli errori; inizializzare il valore di default prendendolo dai parametri della POST evita di dover ri-digitare tutto quanto, presentando i valori inseriti in precedenza. Per ogni elemento del form dobbiamo quindi creare un array di parametri, dove specifichiamo il nome del parametro, l’id che avrà nell’HTML, il valore di default, e altri parametri.
Il metodo validate() si occupa della validazione utilizzando la libreria form_validate configurata in precedenza. Per ogni elemento del form dobbiamo specificare il nome del parametro, l’etichetta che verrà mostrata in caso di errore e le regole di validazione; ad esempio aggiungere required al parametro ‘rules’ renderà il campo obbligatorio. Facciamo notare che il campo email possiede due regole di validazione, concatenate dal segno “|” (pipe): required|valid_email. La regola valid_email indica che il campo deve contenere una mail valida, ma la regola viene valutata solo se required viene soddisfatta.
Infine, se tutti i controlli di validazione passano, ovvero se il metodo $this->form_validation->run() restituisce TRUE, viene inviato un messaggio email al destinatario corretto.
Ecco il codice della view, da salvare in application/views/contact.php:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Contatti</title> <style type="text/css"> body { background-color: #fff; margin: 40px; font-family: Lucida Grande, Verdana, Sans-serif; font-size: 14px; color: #4F5155; } div.error { color: #f00; font-weight: bold; margin: 0; } </style> </head> <body> <h1>Tutorial CodeIgniter</h1> <h2>Pagina dei contatti</h2> <p>Inserisci i tuoi dati e il testo del messaggio, verrai contattato quanto prima da un nostro responsabile.</p> <?php echo form_open('contact/post'); ?> <?php $this->form_validation->set_error_delimiters('<div class="error">', '</div>'); ?> <p> <label for="email"><strong>Email</strong></label><br /> <small>Inserisci il tuo indirizzo email, verrà utilizzato per la risposta</small><br /> <?php echo form_error('email'); ?> <?php echo form_input($email); ?> </p> <p> <strong>Destinatario</strong><br /> <?php echo form_error('recipient'); ?> <?php echo form_radio($recipient_COMMERCIAL); ?> <label for="recipient_COMMERCIAL"><strong>Responsabile commerciale</strong>: domande relative ai prodotti e ordini</label><br /> <?php echo form_radio($recipient_WEBMASTER); ?> <label for="recipient_WEBMASTER"><strong>Web master</strong>: segnalazione malfunzionamenti e/o problemi del sito</label><br /> </p> <p> <label for="subject"><strong>Oggetto</strong></label><br /> <?php echo form_error('subject'); ?> <?php echo form_input($subject); ?> </p> <p><label for="message"><strong>Messaggio</strong></label><br /> <?php echo form_error('message'); ?> <?php echo form_textarea($message); ?> </p> <p> <?php echo form_submit('submit', 'Submit'); ?> </p> <?php echo form_close(); ?> </body> </html>
Qui abbiamo fatto ampio uso degli helper di form: form_open(), form_input(), form_error(), form_radio() e altri. Da notare:
- form_open(‘contact/post’) crea un tag <form> con i vari attributi (action e method) valorizzati correttamente;
- la chiamata a $this->form_validation->set_error_delimiters() ci permette di specificare come rappresentare i messaggi d’errore. Nel nostro caso, avendo specificato uno stile per div.error, diciamo alla validazione di racchiudere ogni messaggio in <div class=”error”> e </div>;
- è possibile mostrare i messaggi d’errore singolarmente, passando alla funzione form_error() il nome del parametro coinvolto.
Conclusioni e sviluppi
Con poche righe di codice abbiamo realizzato un form non banale, con tanto di validazione e formattazione. CodeIgniter è sicuramente entrato nelle nostre simpatie, se non altro per l’estrema leggerezza e per essere molto meno invadente rispetto ad altri framework. Non abbiamo visto le funzioni di accesso al database, ma i lettori più interessati (o semplicemente curiosi) hanno ora gli strumenti giusti per poter capirne il funzionamento da sè. Al lavoro, dunque!