Primi passi con CodeIgniter (parte 3)

Il Model è la parte dell’applicazione che si occupa di gestire i dati; nella maggior parte dei casi si tratta di dati che vengono salvati su database. Il controller farà uso dei metodi disponibili nella classe model per ricevere i dati di cui ha bisogno.

Nella nostra applicazione di gestione di magazzino, possiamo immaginare di avere una tabella che cataloghi tutto il contenuto del magazzino. La tabella, molto semplicemente potrebbe essere:

CREATE TABLE `oggetti` (
`id` int(11) NOT NULL auto_increment,
`nome` varchar(50) collate utf8_unicode_ci NOT NULL,
`scaffale` int(11) NOT NULL,
`quantita` int(11) NOT NULL,
UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Il modello corrispondente, quindi, potrebbe essere:

class Oggetti extends Model {
  var $nome;
  var $scaffale;
  var $quantita;

  function Oggetti () {
    parent::Model();
  }

  function mostra_tutti () {
    // estrae tutti gli elementi dal database
  }

  function mostra_scaffale ($id_scaffale) {
    // estrae gli elementi filtrandoli per scaffale
  }

  // più i soliti metodi crea, modifica, cancella,...
  function crea ($nome, $scaffale, $quantita) { }
  function modifica ($id, $nome, $scaffale, $quantita) { }
  function cancella ($id) { }
}

Quindi in buona sostanza una classe che implementi i classici metodi CRUD più altri metodi d’utilità.

Per interrogare il DB, CodeIgniter fornisce una versione del pattern Active Record che semplifica la creazione di query e ci permette di scrivere codice indipendente dal tipo di database usato (attualmente i driver disponibili sono mssql, mysql, mysqli, oci8, odbc, postgres e sqlite).

La classe ActiveRecord fornisce metodi per la selezione, la modifica, l’inserimento e la cancellazione di dati. Inoltre sono supportate le funzioni più comuni (sum, avg…), le join, le transazioni e molto altro.

A questo punto possiamo entrare più nel dettaglio delle nostre funzioni e fare qualche esempio pratico:

  function mostra_tutti () {
    $out = array();
    $this->db->select('nome, scaffale, quantita');
    $this->db->order_by('nome');
    $query = $this->db->get('oggetti');
    foreach ($query->result() as $row) {
      $out[] = $row;
    }
    return $out;
  }

Per semplificare la sintassi è anche possibile utilizzare il chaining dei metodi:

$query = $this->db->select('nome, scaffale, quantita')
              ->order_by('nome')
              ->get('oggetti');

Per quanto riguarda la modifica e l’inserimento invece basta passare ai metodi insert() e update() un oggetto o un array di valori. In questo caso passeremo l’oggetto $this, ma potremmo anche creare un array od un oggetto ad hoc.

  function crea ($nome, $scaffale, $quantita) {
    $this->nome = $nome;
    $this->scaffale = $scaffale;
    $this->quantita = $quantita;
    $this->db->insert('oggetti', $this);
  }
 function modifica ($id, $nome, $scaffale, $quantita) {
    $this->nome = $nome;
    $this->scaffale = $scaffale;
    $this->quantita = $quantita;
    $this->db->where('id', $id);
    $this->db->update('oggetti', $this);
  }

Molto semplicemente la cancellazione sarà:

  function cancella ($id) {
    $this->db->where('id', $id);
    $this->db->delete('oggetti');
  }

Rimando come al solito alla guida per un ulteriore approfondimento della classe Database e dell’ActiveRecord. Inoltre consiglio di dare anche un’occhiata al meccanismo di Caching di CodeIgniter che può alleggerire di molto il carico sul database.

A questo punto siamo pronti per il lato di presentazione della nostra applicazione: la view, che affronterò nella prossima lezione.

16 commenti

  1. Pubblicato 15 ottobre 2008 alle 21:59 | Permalink

    ottime potenzialità…attendo le view :)
    ma non esiste un codeIgniter in italiano??

  2. Pubblicato 22 ottobre 2008 alle 13:05 | Permalink

    cool

  3. Pubblicato 13 febbraio 2009 alle 16:00 | Permalink

    Hey stiamo diventando vecchi ! Aggiorna il blog!!!
    Io nel frattempo mi sono dato a cakePhp :)

  4. Pubblicato 24 luglio 2009 alle 12:21 | Permalink

    Beh ma niente più tutorial?
    Dai su, dai su.

  5. admin
    Pubblicato 24 luglio 2009 alle 14:30 | Permalink

    Hai ragione, purtroppo ho sempre poco tempo :( … Però si accettano richieste!!!

  6. Pubblicato 27 luglio 2009 alle 12:18 | Permalink

    Ok, ok. Ho studiato la paginazione di codeigniter, tanto di cappello per la facilità di implementazione, di flessibilità nel desgin degli elementi, ma purtroppo quando vai da una pagina all’altra, l’Url che appare non dà l’effettiva pagina, ma l’offset dei record.
    quindi invece di visualizzare: mysite.com/pagina/2 visualizza mysite.com/pagina/20 dove 20 è l’offest che ho impostato nella configurazione della classe pagination.

    Tra le diverse opzioni non ho trovato nulla e non credo che sia una questione di uri routing.

    a te la palla ;)

  7. Pubblicato 27 luglio 2009 alle 23:45 | Permalink

    A me la paginazione funziona bene.. ;) comunque trovate qualche tutorial utile su http://www.programmazione-web.com

    ciao

  8. Pubblicato 28 luglio 2009 alle 09:59 | Permalink

    @neryo: Ciao, cioè a te funziona correttamente facendoti visualizzare il numero di pagina e non l’offset?

    Ho trovato solo un plug-in che in realtà riscrive la libreria della paginazione per fare quello che hai fatto tu.

    http://codeigniter.com/wiki/Pagination_Mod/

    Però non mi convince ficcare troppo il naso nelle librerie.

  9. admin
    Pubblicato 28 luglio 2009 alle 10:24 | Permalink

    @Dk: Ho provato Pagination_Mod e mi sembra funzionare bene.
    Ovviamente andare a modificare una libreria è sbagliatissimo, quindi quello che puoi fare è utilizzare il sistema standard di estensione delle classi di libreria di CodeIgniter.
    Semplicemente crea nella cartella /system/application/libraries un file e nominalo MY_Pagination.php.
    All’interno crea una classe MY_Pagination che estenda CI_Pagination e copiaci dentro solo il metodo create_links() della classe Pagination_Mod. Da quel momento la tua applicazione userà quel metodo al posto dell’originale.
    L’unica altra cosa a cui devi fare attenzione a questo punto è il codice delle tue query: ovviamente il parametro che prima usavi direttamente ora dovrai moltiplicarlo per il numero di records per pagina.

  10. Pubblicato 28 luglio 2009 alle 10:46 | Permalink

    @Admin: Fatto e funziona, come funzionava la libreria di pagination_mod.
    Certo è che non vedo l’utilità del passaggio dell’offset. è come se sfogliando un libro, invece del numero di pagina si trovasse il numero dei caratteri utilizzati.

    Vado ad aprire il libro al carattere 12.800. a presto.

  11. admin
    Pubblicato 28 luglio 2009 alle 10:52 | Permalink

    Infatti mi sembra un pò scritta di getto quella libreria, speriamo in una futura release pensata meglio…

  12. Pubblicato 28 luglio 2009 alle 11:20 | Permalink

    Anche la guida della classe è un pò a portar via. Magari quel giorno avevano finito il caffè.

    Appurato il nostro nerdismo, nei vostri cms come gestite l’upload? Il dilemma nasce dal fatto se conviene scrivere una procedura per caricare più file contemporaneamente e nel caso delle immagini creare la thumb in automatico, oppure permettere il caricamento di un file alla volta e, se si tratta di immagini, permettere all’utonto di scegliere la propria thumb. Nel nostro vecchio sistema utilizzavo il primo metodo. In quello nuovo il secondo. In entrambe i casi ho clienti che si lamentano.

  13. admin
    Pubblicato 28 luglio 2009 alle 12:07 | Permalink

    Mah io decido di volta in volta, cerco sempre di capire prima se l’utente è in grado di fare da solo il resize e il crop con Photoshop.
    Ogni tanto ho provato anche ad usare JCrop (http://deepliquid.com/content/Jcrop.html), ma non tutti lo capiscono.
    Forse la cosa migliore è dare sempre la possibilità di caricare l’immagine e la thumb, generandola automaticamente se non viene specificata.

  14. Pubblicato 29 luglio 2009 alle 16:34 | Permalink

    Tanto per rimanere in tema con l’articolo scritto dall’admin.

    Per i metodi CRUD, solitamente, invece di passare separatamente tutti i valori alla funzione, preferisco passare un array che li contiene:

    //model
    function crea ($data) {
    $this->nome = $data['nome'];
    $this->scaffale = $data['scaffale'];
    $this->quantita = $data['quantita'];
    $this->db->insert(‘oggetti’, $this);
    }

    sostanzialmente non cambia nulla, ma mi trovo meglio nel controller utilizzando array per organizzare i dati.

    //controller

    $prodotto = array();
    $prodotto['nome'] = $this -> input -> post(‘nome’);

    $this->Oggetti->crea($prodotto);

  15. Davide
    Pubblicato 15 agosto 2009 alle 12:09 | Permalink

    volevo sapere come gestire il layout in codeigniter (partifisse come header sidebar content e footer) stavo cercando di utilizzare zendframework ma è troppo dispersivo, ma li almeno ho capito come poter creare un layout.

  16. Dk.
    Pubblicato 22 agosto 2009 alle 11:39 | Permalink

    Ciao Davide,
    per scriverlo il 15 agosto, devi essere davvero in difficoltà ;)

    Venendo al sodo, in generale, i layout puoi salvarli nella cartella views (system/application/views).

    Vengono richiamati dai controllers (cartella controllers system/application/controllers).

    Ad esempio:
    il controller welcome.php che è quello che vedi di default all’interno della cartella controllers richiama la ‘vista’ welcome_message.php contenuta nella cartella views.
    load->view(‘welcome_message’);
    }
    }

    Ti consiglio comunque di leggere bene la guida su codeigniter.com è molto chiara.

Scrivi un commento

La tua e-mail non sarà mai pubblicata o ceduta ad altri. I campi obbligatori sono contrassegnati con un *

*
*