<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CescoBlog &#187; CodeIgniter</title>
	<atom:link href="http://www.cescopag.com/category/codeigniter/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.cescopag.com</link>
	<description>Web-appunti tecnici (e non) per webdesigner e sviluppatori.</description>
	<lastBuildDate>Fri, 06 Nov 2009 21:51:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Progetto Step by Step CodeIgniter &#8211; I Controller</title>
		<link>http://www.cescopag.com/2008/11/progetto-step-by-step-codeigniter-i-controller/</link>
		<comments>http://www.cescopag.com/2008/11/progetto-step-by-step-codeigniter-i-controller/#comments</comments>
		<pubDate>Tue, 18 Nov 2008 22:30:34 +0000</pubDate>
		<dc:creator>Francesco Paggin</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programmazione]]></category>

		<guid isPermaLink="false">http://www.cescopag.com/?p=78</guid>
		<description><![CDATA[In questo passaggio del tutorial a CodeIgniter vediamo finalmente l’elemento del framework che si occupa della logica dell’applicazione, e cioè il controller. Come vedremo questo elemento è quello che viene eseguito direttamente dall’utente ed è ciò che mette in comunicazione i dati (e cioè i modelli) con l’output (le viste).
CodeIgniter infatti, tramite la classe Routing, [...]]]></description>
			<content:encoded><![CDATA[<p>In questo passaggio del tutorial a CodeIgniter vediamo finalmente l’elemento del framework che si occupa della logica dell’applicazione, e cioè il controller. Come vedremo questo elemento è quello che viene eseguito direttamente dall’utente ed è ciò che mette in comunicazione i dati (e cioè i modelli) con l’output (le viste).</p>
<p>CodeIgniter infatti, tramite la classe Routing, si occupa di leggere l’URL digitato e indirizzare all’apposito controller il metodo da eseguire. Ad esempio, digitando l’indirizzo <code>http://www.dominio.com/index.php/nome_controller/nome_metodo/</code> CodeIgniter andrà a richiamare il controller <code>nome_controller</code> ed eseguirà il metodo <code>nome_metodo</code>. Se invece viene omesso <code>nome_metodo</code> verrà richiamato il metodo di default chiamato <code>index</code>.</p>
<p><span id="more-78"></span></p>
<p>Dal punto di vista del codice, un controller non è altro che una classe PHP che eredita dalla classe nativa <code>Controller</code>. Pertanto la sintassi base sarà:</p>
<pre>class Mia_classe extends Controller {
    function Mia_classe() { //questo è il costruttore
        parent::Controller(); //richiamo il costruttore della classe “Controller”
    }

    function index() {
        //funzione richiamata di default
    }

    function mia_funzione() {
        //metodo personalizzato
    }
}</pre>
<p>i controller vanno di norma salvati nella cartella <code>/system/application/controllers</code>, mentre il nome del file dovrà coincidere col nome della classe, quindi nell’esempio precedente questo dovrà chiamarsi <code>mia_classe.php</code> &#8211; Notare l’eliminazione delle maiuscole richiesta dal framework.</p>
<p>Tornando alla nostra applicazione, dato che abbiamo tre entità in gioco avremo bisogno di tre file separati. Ciò non è la regola, in quanto i controller vanno intesi più che altro come azioni da compiere. Nel nostro caso però, dato che andremo ad operare ogni volta su un elemento preciso in maniera abbastanza indipendente, ho preferito separarli in tre controller distinti anziché uno unico.</p>
<p>Partiamo dal controller delle tipologie (che sarà analogo a quello degli stati).</p>
<p>Prendendo come spunto il modello qui sopra, il nostro controller per gli stati sarà del tipo:</p>
<pre>class Statuses extends Controller {
    function Statuses() {
        parent::Controller();
        $this->load->model(‘status_model’);
    }

    function index() {
        //funzione richiamata di default
    }
}</pre>
<p>Come vedete nel costruttore <code>Statuses()</code> vado a caricare il modello <code>status_model</code> che mi servirà all’interno del controller.</p>
<p>Ora andiamo a popolare il <code>metodo index()</code> che ci servirà per la lista completa degli stati. Per farlo aggiungiamo: </p>
<pre>$data[‘statuses’] = $this->status_model->get();
$this->load->view(‘list_statuses’, $data);</pre>
<p>La prima riga si occupa di eseguire il metodo get del modello status_model e a salvarne l’output nell’array <code>$data</code>. Nella seconda riga invece andiamo a caricare la vista <code>list_statuses</code> passando i dati da visualizzare. CodeIgniter andrà a cercare la vista list_statuses.php all’interno della cartella <code>/system/application/views</code>. Vedremo in seguito come realizzare la vista, ma per quanto riguarda il Controller abbiamo già ottenuto quello che ci serve.</p>
<p>I prossimi metodi che ci servono sono quelli per interagire col sito. Infatti abbiamo previsto la possibilità di aggiungere, modificare o rimuovere stati direttamente dal sito senza dover accedere al database.</p>
<p>Presupponiamo già di avere un form che invii tramite post i campi necessari (andremo a realizzarlo in una delle viste). Il nostro metodo che chiameremo <code>add()</code> sarà:</p>
<pre>function add() {
    if ($this->input->post(‘submit’) {
        //ho fatto il submit...
        $insert[‘name’] = $this->input->post(‘name’);
        $this->status_model->add($insert);
        return $this->index();
    } else {
        //non ho fatto il submit quindi mostro il form...
        $this->load->view(‘add_status’);
    }
}</pre>
<p>Innanzitutto vedo se ho già fatto il submit o se invece devo mostrare il form per l’inserimento. Nel primo caso leggo i dati tramite <code>$this->input->post('nome')</code> che è il metodo offerto dalla libreria <em>Input</em> di C.I. per leggere i dati in POST, richiamo il metodo <code>add()</code> del modello per seguire l’inserimento. Una volta concluso mostro la lista degli articoli richiamando il metodo di default <code>$this->index()</code></p>
<p>La funzione <code>edit()</code> è molto simile, con la differenza che dovendo modificare un preciso stato dovrò specificarlo tramite id. Per farlo basta passare quest&#8217;ultimo come parametro al nostro metodo. Nel browser ciò è possibile nella forma: <code>http://www.dominio.com/index.php/mio_controller/metodo/parametro1/parametro2/</code> etc&#8230;</p>
<p>Il metodo diventa quindi:</p>
<pre>function edit($id) {
    if ($this->input->post(‘submit’) {
        //ho fatto il submit...
        $insert[‘name’] = $this->input->post(‘name’);
        $this->status_model->edit($insert, $id);
        return $this->index();
    } else {
        //non ho fatto il submit quindi mostro il form...
        $data[‘status’] = $this->status_model->get_single($id);
        $this->load->view(‘add_status’, $data);
    }
}</pre>
<p>Come vedete l’unica differenza rispetto all’inserimento sta che nel metodo <code>edit()</code> del modello devo passare anche l’id dell’elemento da modificare. Devo inoltre pre-popolare il form con i valori già esistenti. Posso farlo tramite il metodo <code>get_single($id)</code> del nostro modello, che ci permette di leggere un singolo stato e passarne i dati alla vista.</p>
<p>L’ultimo metodo è quello destinato alla cancellazione di uno stato, ed è molto semplice:</p>
<pre>function delete($id) {
    $this->status_model->delete($id);
    return $this->index();
}</pre>
<p>Come avrete sicuramente visto non viene effettuato nessun controllo sulla validità dei dati. Questo però sarà facilmente integrabile in un secondo momento tramite ulteriori controlli e la libreria <em>Validation</em> presente in CodeIgniter.</p>
<p>Il controller <code>Types</code> sarà identico a quanto appena visto, con l’unica differenza di nomenclatura tra stati e tipi. Basterà quindi fare copia-incolla dei files e modificare quanto serve.</p>
<p>Anche il controller relativo agli items sarà molto simile, con la differenza che avremo più campi da gestire (non solo il nome) e avremo bisogno di tutti e tre i modelli. Il controller completo è il seguente:</p>
<pre>class Items extends Controller {

    function Items() {
        parent::Controller();
        $this->load->model('item_model');
        $this->load->model('type_model');
        $this->load->model('status_model');
    }

    function index() {
        //lista degli elementi nel database
        $data['items'] = $this->item_model->get();
        $this->load->view('list_items', $data);
    }

    function add() {
        if ($this->input->post('submit')) {
            $insert['name']             = $this->input->post('name');
            $insert['code']             = $this->input->post('code');
            $insert['description']      = $this->input->post('description');
            $insert['position']         = $this->input->post('position');
            $insert['type_id']          = $this->input->post('type_id');
            $insert['status_id']        = $this->input->post('status_id');
            $insert['about_the_status'] = $this->input->post('about_the_status');

            $this->item_model->add($insert);
            return $this->index(); //torno all'indice...
        } else {
            $data['types']    = $this->type_model->get();
            $data['statuses'] = $this->status_model->get();
            $this->load->view('add_item', $data);
        }
    }

    function edit($id) {
        if ($this->input->post('submit')) {
            $insert['name']             = $this->input->post('name');
            $insert['code']             = $this->input->post('code');
            $insert['description']      = $this->input->post('description');
            $insert['position']         = $this->input->post('position');
            $insert['type_id']          = $this->input->post('type_id');
            $insert['status_id']        = $this->input->post('status_id');
            $insert['about_the_status'] = $this->input->post('about_the_status');

            $this->item_model->edit($insert, $id);
            return $this->index(); //torno all'indice...
        } else {
            $data['item']     = $this->item_model->get_single($id);
            $data['types']    = $this->type_model->get();
            $data['statuses'] = $this->status_model->get();
            $this->load->view('edit_item', $data);
        }
    }

    function delete($id) {
        $this->item_model->delete($id);
        return $this->index();
    }
}</pre>
<p>Anche se più lungo, il concetto è il medesimo dei precedenti. Vorrei soffermarmi semplicemente sulle istruzioni</p>
<pre>$data[‘types’] = $this->type_model->get();
$data[‘statuses’] = $this->status_model->get();</pre>
<p>presenti sia nel metodo per l’inserimento che per quello per la cancellazione. In pratica andiamo a prepararci in due array l’elenco degli stati e delle tipologie disponibili nel nostro database. Questo ci serve per realizzare delle comode dropdown nei form per i riferimenti esterni. Quando vedremo in dettaglio le viste capiremo meglio come andremo a utilizzarlo.</p>
<p>Nella prossima puntata vedremo in dettaglio le viste, completando il primo step e potendo far funzionare una prima basilare applicazione. In seguito, come già accennato, vedremo come gestire la validazione dei dati.</p>
<p>Puntate precedenti:</p>
<ol>
<li><a href="http://www.cescopag.com/2008/08/progetto-step-by-step-codeigniter-introduzione/">Introduzione</a></li>
<li><a href="http://www.cescopag.com/2008/08/progetto-step-by-step-codeigniter-il-database/">Il database</a></li>
<li><a href="http://www.cescopag.com/2008/08/progetto-step-by-step-codeigniter-i-modelli/">I modelli</a></li>
<li><a href="http://www.cescopag.com/2008/10/progetto-step-by-step-codeigniter-lapplicazione/">L&#8217;applicazione</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.cescopag.com/2008/11/progetto-step-by-step-codeigniter-i-controller/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Rilasciato CodeIgniter 1.7</title>
		<link>http://www.cescopag.com/2008/10/rilasciato-codeigniter-17/</link>
		<comments>http://www.cescopag.com/2008/10/rilasciato-codeigniter-17/#comments</comments>
		<pubDate>Sat, 25 Oct 2008 14:57:34 +0000</pubDate>
		<dc:creator>Francesco Paggin</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>

		<guid isPermaLink="false">http://www.cescopag.com/?p=58</guid>
		<description><![CDATA[E&#8217; stata rilasciata il 23 ottobre la nuova versione di CodeIgniter, la 1.7.
La novità più rilevante è la nuova classe Form Validation che presenta diverse novità rispetto alla precedente.
In pratica viene semplificato e velocizzato il modo in cui si impostano i campi, le label e le regole. Anziché usare i metodi $this->validation->set_fields() e $this->validation->set_rules() si [...]]]></description>
			<content:encoded><![CDATA[<p>E&#8217; stata rilasciata il 23 ottobre la nuova versione di CodeIgniter, la 1.7.</p>
<p>La novità più rilevante è la nuova classe <code>Form Validation</code> che presenta diverse novità rispetto alla precedente.</p>
<p>In pratica viene semplificato e velocizzato il modo in cui si impostano i campi, le label e le regole. Anziché usare i metodi <code>$this->validation->set_fields()</code> e <code>$this->validation->set_rules()</code> si può utilizzare un unico comando per ciascun input &mdash; <code>$this->form_validation->set_rules(NOMECAMPO, LABEL, REGOLA);</code> &mdash; oppure impostare direttamente un array multidimensionale, per tutti i campi, in una sola volta. Ulteriore vantaggio è  la possibilità di impostare le regole di validazione su un file di configurazione esterno, snellendo quindi il codice da usare nel controller.</p>
<p>Anche il codice lato vista, per visualizzare gli errori, beneficia dell&#8217;introduzione di appositi helper per visualizzare i messaggi di errore e per ripopolare il form. Anziché dover utilizzare i metodi <code>$this->validation->nomecampo</code> e <code>$this->validation->nomecampo_error</code> sarà sufficiente utilizzare le funzioni <code>set_value('nomecampo')</code> e <code>form_error('nomecampo')</code></p>
<p>Per tutti i dettagli e le altre novità vi rimando alla <a href="http://codeigniter.com/news/codeigniter_170_released/">pagina di annuncio</a> e al relativo <a href="http://codeigniter.com/user_guide/changelog.html">change log</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.cescopag.com/2008/10/rilasciato-codeigniter-17/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Progetto Step by Step Codeigniter &#8211; l&#8217;applicazione (edit)</title>
		<link>http://www.cescopag.com/2008/10/progetto-step-by-step-codeigniter-lapplicazione/</link>
		<comments>http://www.cescopag.com/2008/10/progetto-step-by-step-codeigniter-lapplicazione/#comments</comments>
		<pubDate>Thu, 09 Oct 2008 12:46:43 +0000</pubDate>
		<dc:creator>Francesco Paggin</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Coding]]></category>

		<guid isPermaLink="false">http://www.cescopag.com/?p=43</guid>
		<description><![CDATA[Riprendo dopo qualche tempo il tutorial su CodeIgniter, dato che ho ultimato una prima versione preliminare dell&#8217;applicazione (molto scarna, ma rende l&#8217;idea). Potete quindi già testarne il funzionamento e seguire i prossimi tutorial direttamente sul codice finito.
L&#8217;installazione è semplicissima se avete un webserver php attivo con mysql configurato. Provate visitando l&#8217;indirizzo http://localhost/ (altrimenti esistono ambienti [...]]]></description>
			<content:encoded><![CDATA[<p>Riprendo dopo qualche tempo il tutorial su CodeIgniter, dato che ho ultimato una prima versione preliminare dell&#8217;applicazione (molto scarna, ma rende l&#8217;idea). Potete quindi già testarne il funzionamento e seguire i prossimi tutorial direttamente sul codice finito.</p>
<p>L&#8217;installazione è semplicissima se avete un webserver php attivo con mysql configurato. Provate visitando l&#8217;indirizzo <a href="http://localhost/">http://localhost/</a> (altrimenti esistono ambienti preconfigurati come <a href="http://www.apachefriends.org/en/xampp-windows.html">XAMPP</a> per windows o <a href="http://www.mamp.info/en/index.php">MAMP</a> per macintosh molto facili da installare).</p>
<p>Innanzitutto scaricate il file contenente tutto il necessario: <a href='http://www.cescopag.com/wp-content/uploads/2008/10/archivio.zip'>[Scarica]</a></p>
<p>Create poi una cartella (io l&#8217;ho chiamata &#8220;homeDB&#8221;) all&#8217;interno del vostro &#8220;localhost&#8221; (dove avete le cartelle dei vostri progetti in php, per intenderci) e scompattate all&#8217;interno il file zip. Quest&#8217;ultimo contiene, oltre al framework e all&#8217;applicazione, un file SQL per creare le tabelle necessarie (eseguite la query all&#8217;interno di phpMyAdmin o della vostra interfaccia MySQL preferita).</p>
<p>Ora non resta che modificare la configurazione dell&#8217;applicazione per adattarla al vostro ambiente. Per prima cosa aprite il file <code>config.php</code> all&#8217;interno di <code>[vostraCartella]/system/application/config/</code> e modificate la riga <code>$config['base_url'] = "http://127.0.0.1/homeDB/";</code> con la vostra cartella al posto di <em>homeDB</em>.</p>
<p>In secondo luogo bisognerà indicare i nuovi parametri di connessione al database. Per farlo aprite <code>database.php</code> nella stessa cartella e modificate in fondo alla pagina i parametri con quelli corretti.</p>
<p>A questo punto tutto dovrebbe essere configurato correttamente e dovreste già poter vedere l&#8217;applicazione funzionante visitando l&#8217;indirizzo <code>http://localhost/[vostraCartella]</code>. Potete creare qualche record fittizio per provare il tutto: vi suggerisco di partire dalle tipologie e dagli stati dato che sono campi obbligatori. Potete anche vedere, nell&#8217;inserimento degli articoli, la libreria <em>Validation</em> fornita direttamente da CodeIgniter (provate a creare un articolo vuoto).</p>
<p>Nei prossimi giorni vedremo gli altri elementi dell&#8217;applicazione, ovvero i controller e le viste, nonché l&#8217;utilizzo di helper e librerie.</p>
<h4>Edit: ho messo on-line una demo di questo primo abbozzo di applicazione a <a href="http://www.cescopag.com/demos/homeDB/">questo indirizzo</a> se volete provarla &#8220;dal vivo&#8221;. Mi raccomando non scrivete oscenità <img src='http://www.cescopag.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </h4>
]]></content:encoded>
			<wfw:commentRss>http://www.cescopag.com/2008/10/progetto-step-by-step-codeigniter-lapplicazione/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Progetto step by step CodeIgniter &#8211; i modelli</title>
		<link>http://www.cescopag.com/2008/08/progetto-step-by-step-codeigniter-i-modelli/</link>
		<comments>http://www.cescopag.com/2008/08/progetto-step-by-step-codeigniter-i-modelli/#comments</comments>
		<pubDate>Sat, 23 Aug 2008 15:41:55 +0000</pubDate>
		<dc:creator>Francesco Paggin</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.cescopag.com/?p=21</guid>
		<description><![CDATA[E&#8217; finalmente giunto il momento di cominciare ad usare CodeIgniter. Come detto nel precedente step vediamo come strutturare i modelli della nostra applicazione all&#8217;interno del framework CodeIgniter, seguendo il pattern MVC su cui si basa.

Non mi dilungherò nel spiegare la struttura di CodeIgniter o in generale il pattern MVC. Per capire la struttura del primo [...]]]></description>
			<content:encoded><![CDATA[<p>E&#8217; finalmente giunto il momento di cominciare ad usare CodeIgniter. Come detto nel precedente step vediamo come strutturare i modelli della nostra applicazione all&#8217;interno del framework CodeIgniter, seguendo il pattern MVC su cui si basa.</p>
<p><span id="more-21"></span></p>
<p>Non mi dilungherò nel spiegare la struttura di CodeIgniter o in generale il pattern MVC. Per capire la struttura del primo e il significato del secondo vi consiglio di visitare la <a href="http://codeigniter.com/user_guide/" target="_blank" />guida completa di codigniter</a> e la <a href="http://it.wikipedia.org/wiki/Model-View-Controller" target="_blank" />pagina di wikipedia</a> rispettivamente.</p>
<p>Vi ricordo soltanto che dobbiamo lavorare sempre all&#8217;interno della cartella <strong>/system/application</strong>.</p>
<p>Prima di cominciare dobbiamo però dire a CodeIgniter di precaricare la libreria &#8220;Database&#8221; dato che ci servirà pressoché dappertutto. Per farlo basta modificare il file <strong>/config/autoload.php</strong> modificando la riga</p>
<pre>$autoload['libraries'] = array();</pre>
<p>con</p>
<pre>$autoload['libraries'] = array('database');</pre>
<p>
Fatto questo vediamo quindi i modelli della nostra applicazione.
</p>
<h4>il Modello &#8220;Item_model&#8221;</h4>
<p>Come regola generale nominerò i modelli nella forma <em>Nomemodello_model</em>, quindi il nostro primo modello sarà <strong>Item_model</strong> e dovrà estendere la classe predefinita per i modelli di CodeIgniter, chiamata appunto &#8220;Model&#8221;:</p>
<pre>&lt;?php
class Item_model extends Model {
    ...
}
?&gt;
</pre>
<p>All&#8217;interno del modello andremo a realizzare i vari metodi che ci servono per operare col nostro database. Ci serviranno i metodi per leggere gli elementi, per aggiungerli, modificarli o cancellarli. Partiamo dal metodo per leggerli:</p>
<pre>function get() {
    $query = $this-&gt;db-&gt;get('items');
    return $query-&gt;result_array();
}
</pre>
<p>Come vedete abbiamo usato la libreria &#8220;Database&#8221; tramite <code>$this->db</code> e il metodo &#8220;get&#8221; che accetta come parametro il nome della tabella da cui prelevare i dati. Abbiamo assegnato il risultato di questo metodo alla variabile <code>$query</code>, ma per ottenere i risultati veri e propri dobbiamo richiedere i dati tramite il metodo <code>result_array()</code> che restituisce appunto un array di risultati.</p>
<p>Se avessimo voluto avremmo potuto usare il metodo <code>result()</code> che restituisce invece un oggetto contenente i risultati. Ci sono altri metodi risponibili, ad esempio <code>row()</code> e <code>row_array()</code> che restituiscono l&#8217;ultima riga. Fate riferimento alla guida per tutti i dettagli.</p>
<p>Tornando al nostro metodo &#8220;get&#8221;, questo ritornerà quindi un array con tutti gli elementi nel nostro database. Come ricorderete però sono presenti due chiavi esterne relative al tipo e allo stato, quindi se vogliamo avere tra i risultati anche queste informazioni dobbiamo &#8220;unire&#8221; queste tabelle tramite il metodo &#8220;join&#8221;:</p>
<pre>function get() {
    $this->db->from('items');
    $this->db->join('types', 'items.type_id = types.id');
    $this->db->join('statuses', items.status_id = statuses.id');
    $query = $this->db->get();
    return $query->result_array();
}
</pre>
<p>Come potete vedere &#8220;join&#8221; accetta come primo parametro il nome della tabella e come secondo parametro la relazione tra i campi. Ho anche aggiunto il comando &#8220;from&#8221; per maggior chiarezza. Avrei infatti potuto ometterlo ed indicare la tabella &#8220;items&#8221; direttamente nel metodo &#8220;get&#8221;.</p>
<p>Naturalmente questo metodo non gestisce ancora né la paginazione né nessun tipo di ricerca o filtraggio, tuttavia avremo modo più avanti, in base alle necessità che ci occorrono, di provvedere ad integrare le funzionalità di cui avremo bisogno.</p>
<p>Aggiungiamo ora il metodo per aggiungere un elemento. Dato cheil metodo proposto dalla libreria &#8220;Database&#8221; accetta come parametro un array associativo con campi e valori, il nostro metodo ugualmente accetterà un array:</p>
<pre>function add($item) {
    return $this->db->insert('items', $item);
}</pre>
<p>Come potete notare questo metodo non aggiunge niente al metodo predefinito di CodeIgniter, tuttavia se in futuro avremo bisogno di effettuare qualche intervento sui dati prima di inserirli avremo modo di aggiungere le istruzioni, cosa impossibile da fare se avessimo usato direttamente la classe &#8220;Database&#8221;.</p>
<p>Per la cancellazione e la modifica i metodi sono molto simili:</p>
<pre>function delete($id) {
    $this->db->where('id', $id);
    return $this->db->delete('items');
}</pre>
<pre>function edit($item, $id) {
    $this->db->where('id', $id);
    return $this->db->update('items', $item);
}
</pre>
<p>Come vedete ho utilizzato &#8220;where&#8221; dato che andremo sempre a cancellare o modificare un singolo elemento, identificato tramite l&#8217;id.</p>
<p>Ricapitolando quindi la nostra classe al completo sarà</p>
<pre>
&lt;?php
Class Item_model extends Model {
    function get() {
        $this->db->from('items');
        $this->db->join('types', 'items.type_id = types.id');
        $this->db->join('statuses', items.status_id = statuses.id');
        $query = $this->db->get();
        return $query->result_array();
    }
    function add($item) {
        return $this->db->insert('items', $item);
    }
    function delete($id) {
        $this->db->where('id', $id);
        return $this->db->delete('items');
    }
    function edit($item, $id) {
        $this->db->where('id', $id);
        return $this->db->update('items', $item);
    }
}
?>
</pre>
<h4>I modelli &#8220;Status_model&#8221; e &#8220;Type_model&#8221;</h4>
<p>Per quanto riguarda i modelli dei tipi e degli stati avremo più o meno le stesse funzionalità. Riporterò quindi direttamente il codice delle classi direttamente:</p>
<pre>Class Status_model extends Model {
    function get() {
        $query = $this->db->get('statuses');
        return $query->result_array();
    }
    function add($status) {
        return $this->db->insert('statuses', $status);
    }
    function delete($id) {
        $this->db->where('id', $id);
        return $this->db->delete('statuses');
    }
    function edit($status,$id) {
        $this->db->where('id', $id);
        return $this->db->update('statuses', $status);
    }
}
</pre>
<p>E per i tipi:</p>
<pre>Class Type_model extends Model {
    function get() {
        $query = $this->db->get('types');
        return $query->result_array();
    }
    function add($type) {
        return $this->db->insert('types', $type);
    }
    function delete($id) {
        $this->db->where('id', $id);
        return $this->db->delete('types');
    }
    function edit($type,$id) {
        $this->db->where('id', $id);
        return $this->db->update('types', $type);
    }
}
</pre>
<p>Ora che abbiamo il codice dobbiamo però salvarlo in qualche file. CodeIgniter ha una suddivisione molto logica dei vari files ed ogni classe ha la propria cartella: i modelli andranno in <strong>models</strong>, i controlli in <strong>controllers</strong> e via dicendo.</p>
<p>Per quanto riguarda i nomi dei files, per permettere a CodeIgniter di caricare automaticamente i files necessari basterà utilizzare lo stesso nome, però in minuscolo, del nostro modello. Ad es. &#8220;Item_model&#8221; dovrà chiamarsi <code>item_model.php</code> e via dicendo.</p>
<p>Questi sono quindi i modelli base da cui partire. Nel prossimo step vedremo come utilizzarli attraverso i controller. Come già accennato andremo probabilmente ad integrare alcune funzionalità nei nostri modelli in base alle necessità (ad esempio per implementare la ricerca). Il vantaggio di sviluppare su un framework o comunque con un pattern MVC è quello di poter intervenire nelle varie entità in gioco in maniera indipendente e trasparente. Paradossalmente se un giorno volessimo ad esempio cambiare totalmente strada e rimpiazzare il database con un file di testo, ci basterebbe cambiare opportunamente i modelli (o addirittura la sola libreria &#8220;Database&#8221;) e il resto dell&#8217;applicazione non se ne accorgerebbe&#8230;</p>
<p>Alla prossima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cescopag.com/2008/08/progetto-step-by-step-codeigniter-i-modelli/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Progetto step by step CodeIgniter &#8211; il database</title>
		<link>http://www.cescopag.com/2008/08/progetto-step-by-step-codeigniter-il-database/</link>
		<comments>http://www.cescopag.com/2008/08/progetto-step-by-step-codeigniter-il-database/#comments</comments>
		<pubDate>Sat, 23 Aug 2008 10:36:46 +0000</pubDate>
		<dc:creator>Francesco Paggin</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.cescopag.com/?p=20</guid>
		<description><![CDATA[Vi avevo annunciato un paio di post fa il piccolo progetto in CodeIgniter che volevo realizzare. Si tratta di una piccola webapplication per tenere organizzata la propria collezione di cd, dvd e vhs.
Nel capitolo introduttivo ho descritto genericamente il funzionamento e le entità in gioco, ora vediamo più concretamente come sarà strutturata definendo le tabelle [...]]]></description>
			<content:encoded><![CDATA[<p>Vi avevo annunciato un paio di post fa il piccolo progetto in CodeIgniter che volevo realizzare. Si tratta di una piccola webapplication per tenere organizzata la propria collezione di cd, dvd e vhs.</p>
<p>Nel capitolo introduttivo ho descritto genericamente il funzionamento e le entità in gioco, ora vediamo più concretamente come sarà strutturata definendo le tabelle del nostro database.</p>
<p><span id="more-20"></span></p>
<p>
Partiamo definendo le entità e di conseguenza il database che ci serve.<br />
Ho individuato principalmente tre elementi in gioco: Item (gli elementi che catalogheremo), Type (il tipo di elementi &#8211; ad es. cd, vhs, dvd&#8230;), Status (i possibili stati &#8211; ad es. in archivio, prestato, perduto, danneggiato, etc)
</p>
<h4>Items</h4>
<p>
Ho chiamato &#8220;Item&#8221; l&#8217;oggetto del nostro archivio, sia esso un cd, una cassetta o qualsiasi altro tipo di elemento che vogliamo catalogare.<br />
La tabella nel nostro DB, che chiameremo appunto &#8220;items&#8221; conterrà queste colonne:
</p>
<ul>
<li>id (INT 7)</li>
<li>name (VARCHAR 255)</li>
<li>code (VARCHAR 255)</li>
<li>description (TEXT)</li>
<li>position (TEXT)</li>
<li>type_id (INT 7)</li>
<li>status_id (INT 7)</li>
<li>about_the_status (TEXT)</li>
</ul>
<p>
In particolare <strong>code</strong> rappresenta un eventuale codice identificativo, <strong>description</strong> una descrizione indicativa del contenuto (ad es. i titoli degli album all&#8217;interno di una compilation mp3), <strong>position</strong> il luogo dove l&#8217;abbiamo riposto (ad es. &#8220;porta cd N°1 pagina 23 scomparto 11&#8243;), <strong>type_id</strong> la chiave esterna del tipo, <strong>status_id</strong> la chiave esterna dello stato corrente e <strong>about_the_status</strong> un commento sullo stato corrente (ad es. &#8220;prestato a Mario a Natale&#8221;).
</p>
<h4>Types</h4>
<p>Nella tabella &#8220;<strong>types</strong>&#8221; andremo ad inserire le tipologie di oggetti che andremo a gestire, eventualmente con la possibilità di indicarne di nuovi  -ad es. quando compreremo qualche Blue-ray <img src='http://www.cescopag.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .<br />
I campi quindi saranno per adesso soltato due:</p>
<ul>
<li>id (INT)</li>
<li>name (VARCHAR 255)</li>
</ul>
<h4>Statuses</h4>
<p>La tabella &#8220;<strong>statuses</strong>&#8221; sarà identica alla tabella &#8220;types&#8221; ma conterrà gli stati possibili che potranno assumere i nostri elementi:
</p>
<ul>
<li>id (INT)</li>
<li>name (VARCHAR 255)</li>
</ul>
<p>
Ora che abbiamo definito le tabelle necessarie del nostro database, possiamo procedere alla stesura dell&#8217;applicazione. Nel prossimo step comincierò a lavorare su CodeIgniter, per prima cosa definendo i modelli, e cioè le rappresentazioni nel framework delle nostre entità. Più concretamente, tramite i modelli compiremo tutte le interazioni con le tabelle del DB. Nel nostro codice quindi non dovremo mai dialogare direttamente col database, useremo sempre e soltanto i metodi che andremo a definire per ciascun modello. Giusto per darvi un assaggio, useremo una sintassi del tipo <code>$this->item_model->get_all();</code>
</p>
<p>Alla prossima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cescopag.com/2008/08/progetto-step-by-step-codeigniter-il-database/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Progetto step by step CodeIgniter &#8211; introduzione</title>
		<link>http://www.cescopag.com/2008/08/progetto-step-by-step-codeigniter-introduzione/</link>
		<comments>http://www.cescopag.com/2008/08/progetto-step-by-step-codeigniter-introduzione/#comments</comments>
		<pubDate>Fri, 08 Aug 2008 21:52:10 +0000</pubDate>
		<dc:creator>Francesco Paggin</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.cescopag.com/?p=14</guid>
		<description><![CDATA[In questi giorni di ferie sto sistemando i cd e dvd che ho a casa e &#8211; come molti di voi, immagino &#8211; ho pile di cd e dvd in svariati posti. Per adesso cerco di organizzarmi scrivendo foglietti di carta, post-it, tabelle excel. Ovviamente con risultati praticamente nulli.
Mi è venuta quindi l&#8217;idea malsana di [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.cescopag.com/wp-content/uploads/2008/08/e01c14e1-9aaa-4303-b8f6-57e6b3c586b6.jpg" alt="E01C14E1-9AAA-4303-B8F6-57E6B3C586B6.jpg" border="0" width="150" height="164" align="right" class="alignright" />In questi giorni di ferie sto sistemando i cd e dvd che ho a casa e &#8211; come molti di voi, immagino &#8211; ho pile di cd e dvd in svariati posti. Per adesso cerco di organizzarmi scrivendo foglietti di carta, post-it, tabelle excel. Ovviamente con risultati praticamente nulli.</p>
<p>Mi è venuta quindi l&#8217;idea malsana di stendere un piccolo db per gestire il proprio archivio di cd, dvd e simili. Ovviamente penserete a cose tipo Bento o peggio ancora Access. In realtà, dato che vorrei costringere un po&#8217; tutta la famiglia a organizzare meglio le cose ho pensato di creare una web-application accessibile on-line, in modo che ciascuno possa intervenire dal proprio pc (o mac <img src='http://www.cescopag.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ) lavorando direttamente sul web.</p>
<p>E quale occasione se non questa per buttare giù un piccolo tutorial passo passo sul framework CodeIgniter? Ecco i dettagli del progetto che andrò a realizzare:</p>
<p><span id="more-14"></span></p>
<p>Innanzitutto il software gestirà semplicemente un elenco di supporti di vario tipo (cd, dvd, vhs etc&#8230;). Ci sarà ovviamente la possibilità di specificare per ogni record un nome, una descrizione sul contenuto, una categoria, uno spazio per indicare dov&#8217;è riposto ed eventualmente un codice (se siete maniaci e avete già inventariato le vostre cose&#8230;)</p>
<p>Altra cosa interessante sarà la possibilità di impostare uno stato, ad esempio &#8220;prestato&#8221; (in tal caso a chi, quando e perché) oppure &#8220;perso&#8221; etc. Vi permetterà di tenere sotto controllo quello che succede nel vostro archivio, e soprattutto sapere con certezza che fine ha fatto quel cd che non trovate più e che vi ricordate di aver dato a qualcuno ma non ricordate chi&#8230; non ci saranno più scuse!</p>
<p>L&#8217;interfaccia sarà molto semplice: ci sarà la pagina di elenco &#8211; con la possibilità di vedere gli articoli per tipologia e la possibilità di ricercare nella propria libreria &#8211; e la pagine di creazione e di modifica di un articolo col consueto form. In un secondo tempo vedremo di integrare qualche funzionalità Ajax tramite jQuery per dare quel tocco web 2.0 che ormai è un must.</p>
<p>Nella prossima puntata vedremo in dettaglio le entità in gioco e stenderemo la struttura del database. Nel frattempo se avete suggerimenti lasciate un commento!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cescopag.com/2008/08/progetto-step-by-step-codeigniter-introduzione/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
