Sviluppare in PHP con CodeIgniter – parte 3

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!

Link