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!