sabato 20 ottobre 2012

Guida Codeigniter 3 - Uso avanzato

Uso avanzato

4.1  Rimuovere index.php dagli Url

Nell’installazione standard, la stringa "‘index.php"’ compare negli url di Codeingniter, ad esempio:
example.com/index.php/news/article/my_article
È possibile rimuovere quell’antiestetico index.php usando, ad esempio un file .htaccess se si sta lavorando su web server Apache, usando il modulo chiamato mod_rewrite e una logica chiamata "‘negativa"’: a parte determinate eccezioni (cartella assets, file robots.txt, il file index.php stesso) considera tutto ciò che viene richiesto come concatenato ad index.php.
RewriteEngine on
RewriteCond $1 !^(index\.php|assets|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
Non dimentichiamoci inoltre di modificare il file di configurazione impostando una determinata variabile vuota
$config['index_page'] = '';
Questa soluzione può non sempre funzionare. A seconda delle configurazioni dell’hosting / web server, può non dare il risultato sperato. In questi casi viene consigliato di tentare tutte le possibili configurazioni per la variabile che determina la stringa URI
/*
| Se AUTO (auto-detect) non funziona, prova uno dei seguenti
|
| 'PATH_INFO'           Uses the PATH_INFO
| 'QUERY_STRING'        Uses the QUERY_STRING
| 'REQUEST_URI'         Uses the REQUEST_URI
| 'ORIG_PATH_INFO'      Uses the ORIG_PATH_INFO
*/
$config['uri_protocol'] = 'AUTO';
Ad esempio, per il diffuso hosting aruba, è necessario il seguente .htaccess
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/system.*
RewriteCond $1 !^(index\.php|assets|robots\.txt)
RewriteRule ^(.*)$ index.php?/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?/$1 [L]
 

Sessioni

Codeigniter offre un comodo strumento per mantenere informazioni relative ad un determinato utente, la classe Session. Bisogna subito chiarire che non fa uso delle classiche sessioni Php, ma anzi ha un meccanismo diverso, basato sui cookies oppure, fortemente consigliato, su un database. La visione classica di una sessione, in questo framework, è un cookies che contiene informazioni. Queste informazioni sono strutturate in modo da poter leggere e scrivere variabili di sessione in modo agile e semplice. Per rendere univoca la sessione e fare in modo che i dati siano relativi ad un solo utente, una sessione in CI è così strutturata:
  • dati di sessione (variabili)
  • id di sessione (univoco)
  • indirizzo ip dell’utente
  • user agent del browser dell’utente
  • timestamp dell’ultima attività
Di base queste informazioni vengono salvate su un cookie, il quale è notoriamente quanto di più insicuro ci sia in ambito web. C'è ovviamente la possibilità di cifrare il contenuto del cookie di sessione, impostando una determinata variabile all'interno del file di configurazione principale (/application/config/config.php)
$config['sess_encrypt_cookie']=TRUE;
Una limitazione da non poco conto è relativa alla dimensione dei dati salvabili in una sessione basata su cookies, ossia 4 KB. In caso di cifratura del cookie, questo limite si abbassa poiché gli algoritmi spesso aumentano la dimensione della stringa. Poiché le sessioni vengono usate soprattutto in caso di login da parte di un utente, ossia per contenere le informazioni di accesso di quest’ultimo e permettergli di eseguire determinate azioni, la sicurezza ricopre un ruolo fondamentale. Il consiglio è quindi quello di salvare le sessioni su database, creando una semplice tabella (ad esempio per MySql):
CREATE TABLE IF NOT EXISTS  `ci_sessions` ( 
session_id varchar(40) DEFAULT '0' NOT NULL, ip_address varchar(16) 
DEFAULT '0' NOT NULL, user_agent varchar(50) NOT NULL, last_activity 
int(10) unsigned DEFAULT 0 NOT NULL, user_data text NOT NULL, PRIMARY 
KEY (session_id) );
Comunichiamo ora a Codeigniter che le sessioni dovranno basarsi sulla tabella appena creata:
$config['sess_use_database'] = TRUE;
$config['sess_table_name'] ='ci_sessions';
Bisogna tenere bene a mente il funzionamento della sessione: dopo un tempo definito il sistema ricreerà il session_id e aggiornerà data e ora dell’ultima attività (il timestamp visto in precedenza). L’intervallo predefinito per questo aggiornamento è 5 minuti, ma può essere modificato.

Inizializzare e distruggere una sessione

Possiamo caricare manualmente la libreria di sessione usando il comando:
$this->load->library('session');
Per distruggere una sessione, usiamo:
$this->session->sess_destroy();

Interagire con le sessioni

Scrivere una variabile di sessione è possibile mediante una specifica funzione della classe Session:
//Singola variabile
$this->session->set_userdata('some_name', 'some_value');

//Più variabili in una volta sola con array associativo
$newdata = array(
                   'username'  => 'johndoe',
                   'email'     => 'johndoe@some-site.com',
                   'logged_in' => TRUE
               );

$this->session->set_userdata($newdata);
Per ottenere una delle variabili di sessione impostate in precedenza:
$username = $this->session->userdata('username');
Infine, per cancellare una variabile di sessione (ad esempio username):
$this->session->unset_userdata('username');

Flashdata: un tipo particolare di sessione

Una variabile flashdata può essere letta solo una volta, poiché alla lettura la variabile viene eliminata. Molto spesso viene usata per i vari messaggi di errore o di feedback positivo (ad esempio "Operazione completata con successo"). Una variabile di questo tipo si imposta con la funzione:
$this->session->set_flashdata('item', 'value');
E si legge (ricordate bene: una sola volta, dopodiché la variabile sarà cancellata) con il comando
$this->session->flashdata('item');

Download assistito di file

Codeigniter offre un comodo strumento per forzare il download di un determinato file da parte di un utente. Per prima cosa, bisogna caricare l'helper adatto:
$this->load->helper('download');
Ed utilizzare la funzione apposita, con il seguente formato
force_download('filename', 'data')
Questa funzione genera automaticamente gli header http necessari per forzare un download all’utente. Il primo parametro è il nome che si vuol dare al file da salvare, il secondo parametro sono i dati che si vogliono far scaricare. Quest’ultimo parametro deve essere sempre una stringa; bisogna quindi caricare il contenuto di un file come stringa per effettuarne il download. Vediamo qualche esempio:
$data = 'Here is some text!';
$name = 'mytext.txt';

force_download($name, $data);
Il seguente codice è necessario nel caso di un file esistente:
// Leggo tutto il contenuto del file
$data = file_get_contents("/path/to/photo.jpg");
$name = 'myphoto.jpg';

force_download($name, $data);

Prima parte della guida: Guida Codeigniter 1 - Introduzione
Seconda parte della guida: Guida Codeigniter 2 - Primi passi
Quarta parte della guida: Guida Codeigniter 4 - Gestione del multilingua

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

1 commento:

Anonimo ha detto...

ho impostato il file htaccess nella root del server aruba, ma non funziona, invece funziona perfettamente per il mio server locale apache,
prof. Zullo stefano.zullo@tiscali.it