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