19 commenti CodeIgniter, tutorial, php

Ho da poco tempo iniziato ad utilizzare il framework php CodeIgniter e dalle prime prove devo ammettere che la sua facilità di utilizzo rispetto ad altri framework mi ha positivamente sorpreso.

Purtroppo, in lingua italiana non si trovano molti tutorial che spiegano come utilizzarlo e muovere i primi passi con tale framework e le poche guide presenti sono piuttosto datate.

 

Per questo motivo mi accingo ad iniziare una serie di articoli dedicati all'utilizzo di CodeIgniter.

 

Iniziamo con la banalissima istallazione. Andate alla pagina di download del framework e scaricate l'ultima verisone diponibile. Scompattate il contenuto della cartella compressa.

Troveremo tre cartelle: system, application ed user_guide.

 

La cartella user_guide non contiene altro che una serie di file .html che illustrano la guida all'utilizzo del framework e, ovviamente, questi non costituisco file ricompresi nel framework vero e proprio. Pertando a fini operativi questa cartella potrà essere tranquillamente eliminata.

La User guide è la  documentazione del framework, poco prolissa ma piuttosto chiara e corredata da semplici esempi, ed è consultabile anche on line.

 

Le due catelle system e application dovranno essere collocate nella document root (oppure nella sottocartella nella quale andremo a sviluppare il nostro applicativo). A questo punto puntando su di essa ci dovrà comparira la pagina di benevenuto (welcome).

 

Code Igniter welcome page

 

Configurazione

Tutti i file di configurazione di CodeIgniter sono contenuti nella cartella /application/config/.

Vi sono diversi file e in ognuno di essi sono presenti diversi parametri di configurazione (sotto forma di array) che sarà possibile impostare. Alcuni di questi li illustrerò man mano che ve ne sarà la necessità.

Tuttavia, per iniziare a lavorare con CodeIgniter vi sarà sufficiente eseguire solo alcuni minimali settaggi.

 

Impostare l'URL della hompage

All'interno del file /application/config/config.php impostare l'url della home page dell'applicativo che andremo a sviluppare. Lavorando in locale io ho impostato http://localhost/ (che è il valore preimpostato quando lo andrete a scaricare) altrimenti dovremo impostare l'URL del nostro dominio:

$config['base_url'] = 'http://localhost/';

 

Se invece decidete di realizzare il vostro applicativo con CodeIgniter in una sottocartella del vostro sito web impostarete come segue:

$config['base_url'] = 'http://localhost/sottocartella/';

 

Impostare i parametri di connessione al database

Essendo che quasi sicuramente dovremo interagire con una base dati dovremo impostare i parametri di connessione ad essa. Tale impostazione è presente nel file /application/config/database.php.

Sono presenti diversi parametri (alcuni dei quali anche io al momento non ne conosco lo scopo) ma ai nostri fini, ovvero interagire con un database MySql, sarà sufficiente impostare i seguenti:

$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
$db['default']['password'] = '';
$db['default']['database'] = 'codeigniter';
$db['default']['dbdriver'] = 'mysql';

 

Il paradigma MVC

Dalla pagina di welcome è possibile leggere da essa che:

Se si desidera modificare questa pagina la troverete in:

application/views/ welcome_message.php

Il controller corrispondente per questa pagina è disponibile in:

application/controllers/welcome.php

 

Vediamo cosa significa tutto ciò.

 

CodeIgniter è un framework che rispetta il paradigma MVC, acronimo di Model-View-Controller: questo, come vedremo pocanzi, costituisce una struttura ordinata di progettazione del nostro applicativo.

 

Iniziare a lavorare rispettanto il pattern MVC inizialmente può disorientare ma, vi assicuro, col tempo imparerete ad apprezzarlo. Infatti, il codice che andremo a scrivere risulterà essere maggiormente ordinato e manutenibile dato che andemo a separare rigidamente tre aspetti:

  • la gestione dei dati che sarà affidata ai model;
  • la gestione delle richieste provenienti dall'utente che sarà affidata ai controller;
  • la gestione dell'interfaccia grafica che sarà affidata alle view.

 

Se avete capito poco o nulla del pattern MVC non spaventatevi, anzi è del tutto normale. Ma con un banalissimo esempio mostreremo in che modo si coordinano queste tre componenti e sarà tutto più chiaro.

 

Model: gestore dei dati

Ogni model si occupa di gestire i dati riguardanti un certo oggetto o caratteristica.

 

Ad esempio, poniamo di voler creare un model per gestire alcune informazioni della nostra azienda e che gestirà tre dati: il nome dell'azienda, il numero di telefono e gli indirizzi email.

 

Nel creare un model dovremo rispettare quattro semplici regole:

  1. dovranno essere tutti extends CI_Model (CI sta per Code Igniter).
  2. la prima lettera del nome della classe dovà essere maiuscola e la restante parte minuscolo;
  3. il nome del file che contiene il modello dovrà avere lo stesso nome della classe ma tutto minuscolo.
  4. dovranno essere collocati all'interno della cartella /application/models/.

 

Quindi, il nostro model lo chiameremo, ad esempio "Info_azienda_model", e sarà collocato al seguente percorso /application/models/info_azienda_model.php.

 

Vediamo come si articolerà questo semplificissimo model:

<?php
/*
meccanismo adottato da CodeIgniter 
per evitare gli accessi diretti al file
*/
if ( ! defined('BASEPATH')) exit('No direct script access allowed');

Class Info_azienda_model extends CI_Model{
	private $nome = 'Miniscript Spa';
	private $telefono = '00 11223344';
	private $email = array(
				'DirettoreVendite' => [email protected]',
				'DirettoreAquisti' => [email protected]'
				);

	public function GetNome(){
		return $this->nome;
		}

	public function GetTelefono(){
		return $this->telefono;
		}
	
	public function GetEmail($settore_aziendale){
		switch($settore_aziendale){
			case 'acquisti': 
				return $this->email['DirettoreAquisti'];
				break;
			case 'vendite': 
				return $this->email['DirettoreVendite'];
				break;
			default:
				return null;
				break;
			}
		}
	}

 

Si tratta di una classe semplicissima (fin troppo): tre proprietà private ($nome, $telefono, $email) che rappresentano in questo caso i dati da "gestire" e tre metodi (GetNome, GetTelefono, GetEmail) per ottenere i valori di queste proprietà.

 

Ovviamente questo model ha scopo prettamente didattico e, generalmente, i model hanno metodi che si interfacciano con un database. In qul caso "gestire" assumerà varie declinazioni: restituzione dei daiti, inserimento, modifica, eliminazione, etc etc..

Tuttavia, al fine di comprendere il pattern MVC prendiamo per buono questo model.

 

Controller: gestire le richieste dell'utente

Il controller sulla base della richiesta di un URL proveniente dall'utente decide se e quale model utilizzare nonchè se e quale view mostrare.

In particolare gli URL nell'ambito dell'MVC assumeranno una particolare struttura che vedremo poco appresso.

 

In analogia con quanto visto per i model nel creare un controller dovremo rispettare quattro regole:

  1. dovrà essere extends CI_Controller;
  2. il nome della classse dovrà iniziare con la lettera maiuscola;
  3. il nome del file dovrà essere tutto minuscolo;
  4. Il file dovrà essere collocato nella cartella /application/controllers/.

 

Per seguire il nostro esempio creiamo il controller che chiameremo, ad esempio, "Azienda" e sarà collocato al seguente percorso /application/controllers/azienda.php.

 

Esso avrà tre metodi in corrispondenza delle diverse richieste provenienti dal client: l'utente potrà richedere di visualizzare il nome dell'azienda, il numero di telefono oppure le email.

Pertanto il controller avrà tre metodi: "index" per visualizzare il nome della nostra azienda; "telefono" per visualizzare il numero di telefono; "email" per visualizzare gli indiritti email.

<?php
/*
meccanismo adottato da CodeIgniter 
per evitare gli accessi diretti al file
*/
class Azienda extends CI_Controller {
	
	public function index(){
		/* 
		eseguiamo il load del model che ci occorre
		(indicazione tutta minuscola)
		*/
		$this->load->model('info_azienda_model');
		
		/* 
		ci facciamo restituire dal nostro model il nome dell'azienda 
		eseguendo il metodo GetNome()
		*/		
		$nome = $this->info_azienda_model->GetNome();

		/* 
		creiamo un array $data che conterrà tutte le variabili 
		che andremo a passare alla view 
		*/
		$data = array();
		$data['titolo'] = 'La nostra azienda';
		$data['contenuto'] = 'Il nome della nostra azienda: ' . $nome;

		/*
		eseguiamo il load della view e nei due parametri fissiamo
		quale view mostrare (senza indicare .php)
		e passiamo l'array $data che abbiamo popolato
		*/
		$this->load->view('vista', $data);
		}

	public function telefono(){
		/* analogamente faremo per questo metodo */
		$this->load->model('info_azienda_model');		
		$telefono = $this->info_azienda_model->GetTelefono();

		$data = array();
		$data['titolo'] = 'Il nostro numero di telefono';
		$data['contenuto'] = 'Il numero di telefono della nostra azienda: ' . $telefono;

		$this->load->view('vista', $data);
		}

	public function email($parametro = 'acquisti'){
		$this->load->model('info_azienda_model');
		/* 
		a seconda del $parametro 
		andremo a selezionare uno degli indirizzi email 
		attraverso il metodo GetEmail del model model info_azienda_model 
		*/
		if($parametro == 'acquisti'){
			$email = $this->info_azienda_model->GetEmail('acquisti');
			}
		else if($parametro == 'vendite'){
			$email = $this->info_azienda_model->GetEmail('vendite');
			}
		else{
			$email = 'Undefined';
			}

		$data = array();
		$data['titolo'] = 'Le nostre email';
		$data['contenuto'] = $email;

		$this->load->view('vista', $data);
		}
	}

 

Occorre notare che il metodo "email" richiede un parametro e assume come valore di default 'acquisti'. Ciò avrà importanza quando andremo a vedere il modo in cui si compone l'URL.

 

La view: interfaccia grafica

Le view si occupano dell'interfaccia grafica del nostro applicativo e della stampa a video dei dati provenienti dal controller (cha sua volta li preleva dal model).

 

Nell'esempio esempio proposto tutti i metodi del controller azienda (index, telefono ed email) eseguono il load della stessa view chiamata "vista" e gli passano come dati un array ($data) con chiavi letterali ('titolo' e 'contenuto').

 

Andiamo, quindi, a creare la view che collocheremo in /application/views/vista.php al cui interno i dati dell'array $data diventano delle variabili il cui nome è costituito dalle chiavi che queste assumono nell'array ($titolo e $contenuto).

<html>
<head>
	<title><?php echo $titolo; ?></title>
</head>
<body>
	<h1><?php echo $titolo; ?></h1>
	<p><?php echo $contenuto; ?></p>
</body>
</html>

 

La struttura degli URL

Creati questi tre file e opportunamente collocati come da indicazioni andiamo ad visualizzare i seguenti URL:

  • http://localhost/index.php/azienda/
  • http://localhost/index.php/azienda/telefono
  • http://localhost/index.php/azienda/email
  • http://localhost/index.php/azienda/email/acquisti
  • http://localhost/index.php/azienda/email/vendite

 

E' facile, quindi, intuire la struttura assunta dagli URL nell'ambito di un framework che segue la logica dell'MVC:

index.php/CONTROLLER/METODO_CONTROLLER/PARAMETRO_METODO/ALTRO_PARAMETRO_METODO

 

Nei seguenti URL vi è una parte ridondante composta da index.php che dal punto di vista SEO non è ottimale. Per eliminare index.php dai nostri URL dovremo inserire nella document root del nostro sito un file .htaccess con i seguenti comandi:

RewriteEngine on
RewriteCond $1 !^(index\.php|images|css|js|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

 

Dopodichè dovrete andare a modificare nel file di configurazione /application/config/config.php il parametro $config['index_page'] e lasciarlo vuoto:

$config['index_page'] = '';

 

Affinchè ciò funzioni correttamente occorre che apache abbia il mode rewrite attivato.

Io in locale su windows ho avuto problemi ad eliminare index.php con questo tipo di mode rewrite (rinunciandoci) mentre on line su hosting linux non ho avuto alcun problema (test su Altervista e su Aruba).

 

Impostare il controller della homepage

La home page del nostro applicativo è tuttavia rimasta la pagina di welcome preimpostata.

Poniamo di voler impostare il nostro controller "Azienda" come home page.

Dovremo andare a modificare il file di configurazione /application/config/routes.php ed in particolare il parametro $route['default_controller'] che sarà impostato in questo modo:

$route['default_controller'] = "azienda";

 

Ulteriormente potremo settare la pagina di errore tramite la variabile $route['404_override']. Queste pagine dovranno essere collocate in /application/errors/.

 

Errori da non compiere

I diversi "ruoli" che il sistema MVC affida ai suoi tre componenti devono essere rispettati.

Per tale ragone è opportuno sgombrare il campo da alcuni errori fequenti:

  • inserire markup (html) nel model o nel controller: l'interfaccia grafica deve essere affidata solo alle view; questa regola, in via eccezionale, potrebbe anche avere delle limitatissime deroghe ma è sempre meglio rispettarla in modo rigoroso.
  • gestire i dati attraverso i controller (o peggio ancora nelle view): il controller deve occuparsi esclusivamente di interpretare la richiesta effettuara dall'utente tramite l'URL andando a prelevare i dati necessari tramite gli opportuni model e selezionare la view corrispondente.

 

Conclusioni

L'esempio proposto è volutamente banale dato che il mio scopo era puramente illustrare il funzionamento del pattern MVC, che costituisce un aspetto fondamentale di tutti i framework php attualmente più diffusi.

Ovviamente CodeIgniter offre anche molto altro e non è facile riassumerlo. I prossimi articoli avranno un taglio più "operativo" e vedremo come in concreto si articola un model che interagisce con un database.

 

Per qualsiasi dubbio, critica o problema non esistate a lasciarmi un commento.

Olimpio Romanella

Sono un appassionato di Web Developing con un particolare debole per php. Mi dedico principalmente dello sviluppo back-end ed in particolare programmazione lato server con php, sviluppo di database relazionali MySql e progettazione di CMS di piccole e medie dimensioni.

Mi avvalgo del framework javascript Jquery, utilizzando molti dei suoi plugin e nei dei miei progetti utilizzo spesso il framework MVC Codeigniter.

19 Commenti presenti

avatar Emilio Franco

Emilio Franco

29 May 2017 ore 17:38

Anche se datato ho trovato il tuo sito uno dei migliori a livello mondiale per cio' che attiene la didattica orientata soprattutto a coloro che si accostano per la prima volta ad un Framework PHP. Continui con altri articoli o questo e' tutto il materiale reperibile su questa pagine?
Grazie comunque per questa raccolta di tutorial che mi hanno semplificaTO LA VITA.

avatar Andrea

Andrea

12 March 2014 ore 14:27

Sei il mio salvatore! L'unica guida in cui ho capito davvero bene in poco tempo MVC. Grazie di cuore! Sei un boss ;)

avatar GioMBG

GioMBG

03 December 2013 ore 16:16

@Olimpio Romanella:ciao Olimpio, Le ho prvate tutte e andando in giro di qui e di la mi sono accorto che questo non è l'unico problema di ci anche se probabilmente è il problema di ci, ad ogni modo anche con il file .htaccess nisba, è evidente che sul mio linux CentOS 6.4 non riesco a masticare questo framework, mi sa che butto la spugna per un 6 mesi aspettando un avanzamento del progetto in termini di configurazione... in giro e' pieno di gente divetata x dietro a ste beghe di configurazione.

avatar GioMBG

GioMBG

03 December 2013 ore 01:27

@Olimpio Romanella: ok vado a vedere grazie!

avatar Olimpio Romanella

Olimpio Romanella

03 December 2013 ore 00:42

@GioMBG:l'argomento esula dall'obiettivo di questo articolo.
In ogni caso è un semplice problema di percorsi che poi affrontare in diversi modi:
- utilizzando percorsi assoluti
- utilizzando l'[url href=http://ellislab.com/codeigniter/user-guide/helpers/url_helper.html]URL Helper[/url] che prevede la funzione base_url
- utilizzando l'[url href=http://ellislab.com/codeigniter/user-guide/helpers/html_helper.html]HTML Helper[/url] che prevede la funzione link_tag()

avatar GioMBG

GioMBG

01 December 2013 ore 23:11

@GioMBG:
scusa: (ultima riga del mio mega post doveva essere:
localhost/beta/ci/index.php/site/asd problem (carico la pagina ma non i css)

avatar GioMBG

GioMBG

01 December 2013 ore 23:08

@Olimpio Romanella:
ciao Olimpio,
grazie per la Tua risposta,
nel frattempo sono andato avanti con gli studi e ho capito che i dati ai controller vengono passati dai models ma arrivato a questo punto ho bisogno di un parere al riguardo all'assemblamento dei vari scripts:
ipotizza di avere un file di configurazione dove ho inserito la mia base_url/dir (quindi ci non è nella html ma dentro la dir) e di aver settato come index_page la index.php, nel routes di aver impostato un certo controller di default 'site' e di aver inserito i css in dir/assets/css/css.css ci ovviamente è in dir.
Quando carico localhost/dir i css caricano perfettamente come quando vado su localhost/dir/index.php MA se poi ripasso nell'url addizzionando /site/asd (rispettivamente mio controller e funzione che mi richiama nelle view/templates un certo file.php posizionato esattamente come quello che viene richiamato dal controller site di default e quindi senza problemi di caricamento css) non riesco a caricare i css (la view si)... consigli ?
Tu dove posizioneresti i css ?
e come imposteresti il file di configurazione ?
NOTA che io metta index.php o no nel file di configurazione riscontro sempre il medesimo problema (non cambia nulla al di fuori del fatto di non dover inserire index.pgp nella uri
ricapitolando:
--
con index.php in config:
localhost/beta/ci/index.php no problem css
localhost/beta/ci/index.php/site/asd problem css (ma carico la pagina)
--
senza index.php in config:
localhost/beta/ci no problem css
localhost/beta/ci/site/asd nulla (404 di apache) non warn di ci
localhost/beta/ci/site/asd problem (carico la pagina ma non i css)
--
grazie
GioMBG

avatar Olimpio Romanella

Olimpio Romanella

25 November 2013 ore 15:38

@GioMBG: Non preoccuparti, non stai abusando, anzi i commenti sono fatti apposta per questo.

I vantaggi nell'uso di un framework php sono argomento dibattuto a dai pareri discordanti. Ti esprimo la mia opinione sul punto senza pretesa alcuna.

Un framework ti mette a disposizione una gamma di funzioni pronte all'uso e testate ampiamente ma, soprattutto, ti impone un'architettura ordinata dell'applicativo assegnando ruoli precisi a ciascun componente (models, controllers, view, librerie, helpers, etc etc).

Tali benefici sono percepibili a tre condizioni:
si ha buona padronanza del linguaggio nativo php;
si ha una minima padronanza del framework;
si ha a che fare con un progetto web di una certa complessità.

L'assenza di una sola di tali condizioni impedisce di apprezzare le reali potenzialità del framework e si rischia, anche, di generare codice di qualità mediocre.
Inoltre, in assenza di buone basi di php si può creare confusione fra ciò che è nativo del linguaggio e ciò che invece costituisce funzionalità propria del framework.

In conclusione: pur riconoscendo le potenzialità dei framework il loro uso deve avvenire nei modi e nei tempi giusti.

In ordine alla tua seconda domanda ti rimando ad un mio tutorial che ti introdurrà al tema.

avatar GioMBG

GioMBG

24 November 2013 ore 19:46

@Olimpio Romanella: figurati !
spero di non abusare postando quest'altra domanda:
premesso: visto che TUTTI o circa il 70% dei post che ho visto in giro per la rete affermano che i framework sono ottimi per la programmazione (personalmente non ho ancora capito perché visto che so fare quello che voglio con il php convenzionale mentre sono 2 giorni che provo a capire qualche cosa da questo modo forse troppo astruso per me, volevo provare l'approccio in una maniera differente (se mi puoi rispondere).
ipotizziamo di dover tirare giù dei dati da una tabella e stamparli.
dove si ci collega al database ? (controller ?)
dove si stampano i dati ? (view ?)
come si passano i dati ? (model ?)
grazie in ogni caso
GioMBG

avatar Olimpio Romanella

Olimpio Romanella

24 November 2013 ore 12:18

@GioMBG: Grazie per i complimenti. Nel sito troverai anche altre guide e tutorial su Codeigniter che ti consiglio di seguire.

avatar GioMBG

GioMBG

23 November 2013 ore 13:28

bravo!
sei l'unico che mi ha dimostrato che la mia installazione di ci funzionasse (non ci credevo) dovresti farne uno anche al sito ufficilae di ci, quello che hanno fatto loro non funziona...
Grazie
GioMBG

avatar NicK

NicK

30 April 2012 ore 22:27

Trasportato tutto su altro server e magicamente funziona!!!

Vedrò di riveredere le configurazioni lato server.

Grazie ;)

avatar NicK

NicK

30 April 2012 ore 21:01

Ho ricontrollato nomi e contenuti (a proposito, mancano i tag di chiusura di PHP ?>).

Se non carico il modello controller e vista funzionano. Scrivendo un modello semplicissiomo con un return "PIPPO" come GetNome(), di nuovo pagina bianca.

avatar oly1982

oly1982

30 April 2012 ore 20:26

Con un URL qualsiasi ti dà pagina totalmente bianca? Troppo strano, quantomeno dovrebbe darti errore 404. Qualcosa non quadra.

Il Model l'ho ipertestato in locale. Non saprei dirti così su due piedi. Hai collocato correttamente i file dandogli i nomi così come indicato nel tutorial?

avatar NicK

NicK

30 April 2012 ore 20:23

Il problema pare risiedere nel model

commentando la linea $this->load_model('info_azienda_model);
la view viene caricata e mostrata.

avatar NicK

NicK

30 April 2012 ore 20:06

Giusto per un primo impatto ho provato a copiare l'intero tutorial.
Lancio localhost/azienda (o qualunque altro URL) e ...

... pagina completamente bianca.

se lancio localhost/welcome invece ottengo la pagina di benvenuto a CodeIgniter.

Cosa è che sbaglio?

Grazie

avatar enrico

enrico

05 March 2012 ore 21:07

smanettando ho risolto ma per un po' la tua pagina rimarrà nei preferiti

avatar enrico

enrico

05 March 2012 ore 20:11

smanettando ho risolto ma per un po' la tua pagina rimarrà nei preferiti

avatar enrico

enrico

05 March 2012 ore 19:48

Ciao,
ottima guida! complimenti!
Sono un vero niubbo di php e volevo imparare ad usarlo con codeigniter. Ho un problema, ho scaricato l'ultima versione e ho configurato apache affinché la root coincidesse con la root di codeigniter. Ho impostato il base url in questa maniera:
$config['base_url']= 'http://localhost/';
e ho scritto il mio primo controller:


<?php

class Helloworld extends Controller{

function Helloworld(){
parent::Controller();
}

function index(){
echo("ciao mondo");
}

}
?>


Ho salvato il controller come helloworld.php
Quando cerco di raggiungere uno degli indirizzi
http://localhost/index.php/helloworld/
mi ritrovo con l'errore http 500
cosa ho sbagliato?

ciao grazie anticipatamente