sabato 20 ottobre 2012

Guida Codeigniter 2 - Primi passi

Primi passi con Codeigniter

Controller

I Controllers, come già detto, sono la parte fondamentale del software strutturato con il framework CodeIgniter. Il tutorial della documentazione ufficiale li definisce la colla della web application. Cerchiamo di comprendere meglio la logica di funzionamento: quando viene fatta una richiesta del tipo
http://localhost/index.php/news/view/12
il framework elabora la richiesta in questo modo:
http://localhost/index.php/<controller>/<metodo>/<parametri>
richiedendo l’esecuzione del metodo "view" con parametro "12" al controller denominato "news". Questo significa che, per far funzionare la richiesta GET specificata, deve essere implementato un controller news.php sotto la cartella application/controllers, con il seguente contenuto:
<?php
    class News extends CI_Controller {
        public function view($id)
        {
                //qui codice per fare qualcosa
        }
        public function index()
        {
                //qui codice per fare qualcosa
        }
}
Capendo questo meccanismo, si è a buon punto nella comprensione di CodeIgniter; bisogna smettere di ragionare in termini di files php e iniziare a spostare l'attenzione su controllers e metodi. Anche se inizialmente sembra complicato, in realtà questo modo di strutturare l’applicazione porta enormi vantaggi.
Non preoccupiamoci, per il momento, del poco estetico "‘index.php"’ all’interno dell’Url che stiamo considerando: con una semplice configurazione può essere eliminato, risultando molto più facile da leggere sia per i motori di ricerca sia per gli esseri umani. Cerchiamo ora di analizzare questo codice, comprendendo la logica base del framework. Per prima cosa un controller deve essere definito come classe Php che estende CI_Controller e deve essere chiamato con lo stesso nome del file (senza l'estensione .php, ma con la prima lettera maiuscola, news.php diventa News). All’interno della classe notiamo un metodo pubblico (view) che accetta un parametro ($id). Come già scritto, il sistema andrà a richiamare il metodo view con il parametro passato (12) ricercandolo all’interno del controller news. In caso di più parametri, basta separarli con il carattere "/" slash.
Il metodo "index" non è obbligatorio, tuttavia ha il ruolo di gestire le richieste generiche al controller, cioé non specificando metodo né parametri:
http://localhost/index.php/news
Ricordiamo è compito del controller fare da tramite tra l’elaborazione dei dati e la visualizzazione degli stessi; il che significa che, una volta eseguite determinate operazioni sui dati, deve caricare un altro mattone fondamentale: la vista (view). Per questo motivo il codice visto in precedenza viene così modificato: ,
public function view($id)
{
        $data['id'] = $id;
        $this->load->view('news/view', $data);
}
public function index()
{
        $this->load->view('news/index');
}
La prima funzione ha due istruzioni, che servono per inserire all’interno di un array il contenuto della variabile $id e per caricare in memoria una vista posizionata sotto /application/views/ news/view.php passando il suddetto array. Traspare già il modo per passare dei dati alla vista specificata, in modo che la vista li possa mostrare (vedremo poi in che modo). Da notare che tutte le viste vengono ricercate nella directory /application/views al cui interno possono esistere sottocartelle (news ne è un esempio) che contengono le viste di categorie simili, in questo caso tutte le viste utilizzate dal controller news. La vista deve essere specificata senza l'estensione .php tramite il comando ,
$this->load->view('nomeDellaVista',$eventualeArrayDaPassare);

View

Nel paragrafo precedente abbiamo visto come caricare una vista da un controller, funzione fondamentale per il corretto di una web application con il framework CodeIgniter. Ma come deve essere strutturata una vista? Rispolverando l’esempio precedente, nella directory che contiene le view (application/views) deve essere creata una sottocartella news, che conterra due viste:
  • view.php
  • index.php
che corrispondono alle viste caricate in precedenza nel codice del controller. Analizziamo ora il contenuto della vista view.php, che e semplicemente HTML con l’aggiunta di codice Php dove necessita
<html>
<head>
<title>CodeIgniter a modo mio - Esempio di Vista</title>
</head>
<body>
<h1>
Hai specificato il parametro id impostandolo al valore <?php echo $id; ?> </h1>
</body>
</html>
Il concetto chiave per il passaggio dei dati da un controller ad una view è il seguente: passando un array del tipo $data['qualcosa'], accederò ai dati dalla view interagendo con la variabile $qualcosa. Nel caso del nostro esempio, $data['id'] diventa $id all’interno della vista. La vista mostra i dati elaborati dal controller; il controller a sua volta accede ai dati attraverso un modello, anche se non è espressamente richiesto dal framework, ma fortemente consigliato dal pattern MVC.

Caricamento di più viste

È buona prassi in una applicazione web complessa suddividere le viste creando un header ed un footer uguali per tutte le pagine. Come è possibile in CodeIgniter fare una cosa del genere, come si possono caricare più viste da un controllore? Semplicemente chiedendo di caricarle una di seguito all'altra:
$this->load->view('header');
$this->load->view('example_view', $data);
$this->load->view('footer');

Model

Il Model si occupa dell’interazione con i dati, offre sostanzialmente al controller un approccio ad un livello più astratto delle semplici interrogazioni su database. Ad esempio, per gestire un motore di news, un modello potrebbe avere il seguente scheletro:
//news_model.php
class News_model extends CI_Model {
        function __construct()
        {
                // Richiamo del costruttore parent
                parent::__construct();
                $this->load->database();
        }
        function get_latest_news()
        {
                // qui codice
        }
        function insert($data)
        {
                // qui codice
        }
        function update($news_id, $data)
        {
                // qui codice
        }
}
Un modello è una classe che estende CI_Model (base Model class), il cui nome deve essere lo stesso del file posizionato sotto application/models/ e deve avere la prima lettera maiuscola. Il modello deve quindi venire caricato dal controller, il quale ne eseguirà le funzioni per accedere ai dati (nell’esempio, get_latest_news, insert o update). Nel costruttore del modello si può notare il caricamento del database
$this->load->database();
fondamentale per accedere ai dati.

Caricare un modello

Il controller, come già scritto, deve caricare il modello: questo può essere fatto attraverso il comando
$this->load->model('News_model');
che permette di caricare in una variabile con lo stesso nome del modello (nell’esempio, $News_model) e quindi di poter interagire con essa:
$this->News_model->get_latest_news();

Helpers

I programmatori nostalgici del periodo precedente il passaggio del Php ad una struttura Object Oriented non potranno che essere entusiasti degli Helpers. Gli Helpers, come suggerisce il nome stesso, sono degli aiutanti che offrono delle funzioni per le operazioni più comuni. Avete capito bene, funzioni, non classi. Semplici funzioni Php. Un Helper va caricato con la seguente sintassi:
$this->load->helper('nome_helper');

Parametri di input

Per gestire al meglio i parametri GET, POST o COOKIE CodeIgniter mette a disposizione una comoda classe che si preoccupa di mettere in sicurezza le variabili al posto nostro e offre un insieme di funzioni quali capire lo user agent utilizzato, scoprire se e una richiesta ajax, catturare l’indirizzo ip dell’utente (per informazioni vedi questo indirizzo). Di seguito sono mostrate le funzioni fondamentali della classe input:
$this->input->post('some_data')
se $_POST['some_data'] è impostato ritorna il valore, FALSE altrimenti
$this->input->get('some_data')
se $_GET['some_data'] è impostato ritorna il valore, FALSE altrimenti
$this->input->cookie('some_data')
se $_COOKIE['some_data'] è impostato ritorna il valore, FALSE altrimenti
$this->input->server()
ricerca nell'array globale $_SERVER
$this->input->get_post('some_data')
ricerca sia nelle variabili post che in quelle get
$this->input->set_cookie()
indispensabile per impostare un cookie
$cookie = array(
'name' => 'The Cookie Name',
'value' => 'The Value',
'expire' => '86500',
'domain' => '.some-domain.com',
'path' => '/',
'prefix' => 'myprefix_',
'secure' => TRUE
);
$this->input->set_cookie($cookie);

Prima parte della guida: Guida Codeigniter 1 - Introduzione

EDIT:
Ho pubblicato la guida in formato PDF contenente tutti gli argomenti affrontati sul blog, liberamente scaricabile e stampabile. La trovate al link:
http://stefanobianchini.blogspot.it/2012/11/guida-codeigniter-modo-mio-pdf-in.html

Nessun commento: