CakePHP - 101 Creare un'applicazione con CakePHP massimoi@impronta48.it http://impronta48.it
Come Installare cakephp 1.3.x 1) Mi collego a https://github.com/cakephp/cakephp/archives/1.3 2) Salvo il file tar.gz 3) Scompatto il file tar.gz nel mio webserver [in aula si trova su www di a22docente - cake- 1.3.tar.gz] /var/www/massimoi/cake 4) Ricordarsi di mostrare i file nascosti! (per l'.htacces)
L'Applicazione Cake La nostra APPLICAZIONE si scrive nella cartella app (Ignoro CAKE, PLUGINS, VENDOR) Entro nella cartella APP Copio database.default.php in database.php Modifico i paramentri in database.php Imposto i permessi di scrittura 777 alla cartella app/tmp Verifico collegandomi a http://a22docente/massimoi/cake che le 3 righe centrali siano OK (verdi)
Creazione dei Model Creo i model corrispondenti alle tabelle autori >>> Autore libri >>> Libro ESEMPIO: libro.php <?php } class Libro extends AppModel { var $name='libro';
Impostazione dei plurali Imposto i plurali in Italiano, modifico il file app/config/bootstrap.php Inflector::rules('plural', array('rules' => array(), 'irregular' => array('libro'=>'libri', 'autore'=>'autori', ), 'uninflected' => array() ) );
Creazione dei Controller Creo i controller autori_controller.php e libri_controller.php ESEMPIO per LIBRI <?php class LibriController extends AppController { var $name='libri'; var $scaffold; } Mi collego a http://localhost/massimoi/cake/libri Notare lo SCAFFOLDING (fa automaticamente CRUD)
CREO LE RELAZIONI 1) Aggiungo nel MODEL libro $belongsto = 'Autore'; (singolare come la classe) 2) Aggiungo nel MODEL autore $hasmany = 'Libro'; (singolare come la classe) 3) Scoprio che tutto funziona automagicamente con le relazioni
CAMPI DI DEFAULT Aggiungo nel MODEL dell'autore $displayfield = 'nome'; così dappertutto l'autore viene identificato con il suo nome
Creare una home page e un layout 1) Creo un file app/views/pages/home.ctp e metto il contenuto della home page 2) Creo una pagina statica contatti.ctp 3) Modifico il file di layout. Parto dall'esempio standard che trovo in cake/libs/views/layout/default.ctp che copio nella mia cartella layout!!! NON MODIFICO QUELLO DI CAKE!!!
personalizzo il controller e le view 1) Creo nel controller autori_controller il metodo mostra($id) 2) Creo nella cartella /vies/autori/ il file mostra.ctp
Url amichevoli (pretty url) NON AMICHEVOLE http://www.trenitalia.it/orario.do? da=torino&a=milano&datada=31+5+2012... http://www.biblio.it/index.php?q=libri&action=edit&libroid=5 URL AMICHEVOLE http://www.biblio.it/libri/edit/5.htaccess fa l'operazione di rewriting, quindi ci dev'essere!
IL DATABASE Nel file di configurazione del db io devo scrivere il nome del server. 99% delle volte è localhost perchè è sulla stessa macchina del webserver!
CONVENZIONI invece che CONFIGURAZIONI Elenco di tutte le convenzioni di cake http://book.cakephp.org/1.3/it/view/901/conventions-in-cakephp http://cakephp.org/files/resources/cakephp-1.2-cheatsheet.pdf
Esercizio Biblioteca - Autori SPECIFICHE Riscrivere la funzionalità index per gli autori in modo da mostrare la foto dell'autore e il nome sotto la foto (tipo "amici di facebook") Quando faccio click sul nome o sulla foto vado alla pag mostra/id PASSAGGI 1) Nel controller creo una funzione index 2) Legge tutti gli autori dal database 3) Passa alla view (/views/autori/index.ctp) la lista degli autori (id, nome)
Controller Autori - mostra //corrisponde a http://.../autore/mostra/1 function mostra($id) { $a = $this->autore->findbyid($id); //Dopo la chiamata con $id = 1 // $a appare come segue // ['Autore']['id'] = 1 // ['Autore']['nome'] = manzoni $this->set('autore', $a); }
Controller Autori - index function index() { //Non mi serve portare dietro i libri $this->autore->recursive = 0; //leggo dal db la lista degli autori //$l = $this->autore->find('all'); //leggo dal db la lista degli autori ordinata per nome $l = $this->autore->find('all', array('order'=>'nome' ) ); } $this->set('autori', $l);
Controller Autori edit passo 1 function edit($id = null) { $this->autore->id=$id; //Se mi stai chiamando prima di aver premuto //submit if (empty($this->data)) { $this->data = $this->autore->read(); } else //hai già premuto submit { $this->autore->save($this->data) }
Controller Autori edit - passo2 function edit($id = null) { if (empty($id)) { //Scrivi un errore $this->session->setflash('manca id'); return; } Introduco gestione errori e casi particolari $this->autore->id=$id; //Se mi stai chiamando prima di aver premuto //submit if (empty($this->data)) { $this->data = $this->autore->read(); } else //hai già premuto submit { if ($this->autore->save($this->data)) { $this->session->setflash('salvato Autore'); $this->redirect('index'); } else { $this->session->setflash('salvataggio non riuscito'); } }
Controller Autori - delete function delete($id = null) { if (empty($id)) { $this->session->setflash('manca id'); $this->redirect('index'); } if ($this->autore->delete($id)) { $this->session->setflash('cancellato!'); $this->redirect('index'); } else { $this->session->setflash('non trovato e NON cancellato!'); } }
Autori / Views / Edit <?php echo $this->form->create('autore');?> <?php echo $this->form->input('id');?> <?php echo $this->form->input('nome');?> <?php echo $this->form->input('data_nascita');?> <?php echo $this->form->input('email');?> <?php echo $this->form->end('salva');?> Es: Validazione sull'email NEL MODEL autore.php var $validate = array ( 'email' => array('rule'=>'email', 'message' => 'email not valid', ), Cake usa le caselle più appropriate e fa la validazione!
Esercizio Biblioteca - Libri STORIE: 1) Vorrei vedere un elenco di libri con copertina La copertina è in img/libri/id.jpg Ogni libro > Edit / Delete / View 2) Scheda del libro che riporti: Titolo, Copertina, e Autore con Foto e Link alla scheda dell'autore (a partire dal nome e foto dell'autore)
Creo un link da un controller ad un altro Sono in libri/mostra.ctp e voglio creare un link a autori/mostra/1 $this->html->link('manzoni', 'mostra/1') mi fa vedere il libro 1 >>> libri/mostra/1 $this->html->link('manzoni','/autori/mostra/1') mi fa vedere l'autore 1 >>> autori/mostra/1 $this->html->link('manzoni', array('controller'=>'autori', 'action'=>'mostra', 1)); Il parametro
Gestiamo i prestiti Libri n-1 Autori n-1 Prestiti n-1 Utenti Scelta: scompongo la molti-a-molti in due 1- a-molti
Come creo il mio codice Scaffolding genera automaticamente index, edit, add, delete (CRUD) A mano Bake Scrittura del codice guidata
Usare Bake 1) Apro un terminale (sotto Win+R cmd) 2) Mi posiziono nella cartella dove c'è il mio cake (cd /var/www/massimoi/cake) Se sono su una cartella di rete (montata) cd.gvfs/a22\ docente\ Sotto linux mi assicuro di aver installato php5- cli Eseguo cake/console/cake bake
Pagination
Ritocchi Il menu contenga anche utenti e prestiti Scegliere alcuni campi da visualizzare nei prestiti Titolo libro, Utente, DataP, DataR (in quest'ordine) Visualizzare correttamente le tendine dentro il prestito (utente e libro) Data vuota
Ricerca Utente - view Aggiungere la possibilità di effettuare la ricerca di tra gli utenti per nome e cognome e filtrare la lista degli utenti Nella view utenti/index.ctp aggiungo il campo per la ricerca lo chiamo q <?php echo $this->form->create('utente', array('action'=>'index')); echo $this->form->input('q', array('label'=>'cerca per nome o cognome') ); echo $this->form->end('cerca');?>
Ricerca Utente 2 - controller //Inizializzo le variabili vuote $q=''; $conditions=array(); //Se i campi sono valorizzati //metto nella variabile $q //quello che l'utente ha scritto nel campo q if (!empty($this->data)) { $q = $this->data['utente']['q']; } if (!empty($q)) { $conditions = array('or' => array('cognome LIKE' => "%$q%", 'nome LIKE' => "%$q%") ); } $u = $this->paginate('utente',$conditions);
Profilo Utente Aggiungere data di nascita Email Telefono Visualizzare il datepicker jquery per la data di nascita
Esecuzione Profilo Utente Aggiungo i campi al db: email -varchar(255), tel varchar(50), data_nascita date tutti accettano null Nelle view aggiungo la gestione di questi campi Edit / Add Index
Gestione data di nascita (1) Uso i selettori standard di cake, in ordine italiano (GMA), e con l'anno partenza a 1900 echo $this->form->input('data_nascita', array( 'type'=>'date', 'dateformat'=>'dmy', 'minyear'=>1900 //Utile per le date di nascita ) );
Usiamo jquery per la data di nascita La libreria di base si chiama jquery La libreria con le interfacce utente interessanti si chiama jquery UI tutte le info su http://jqueryui.com/docs/getting_started Le scarico dalla sezione download del sito jqueryui.com e le copio in /app/webroot/js il contenuto della cartella js /app/webroot/css il contenuto della cartella css (ignoro la cartella development-bundle) Richiamo le librerie in views/layout/default.ctp echo $this->html->css('ui-lightness/jquery-ui-1.8.18.custom.css'); echo $this->html->script('jquery-1.7.1.min.js'); //Include jquery echo $this->html->script('jquery-ui-1.8.18.custom.min.js'); Aggiungo datepicker nella views/utenti/edit.ctp <script> $("#UtenteDataNascita").datepicker( ); </script>
Attributi del datepicker Data in formato 2011-04-29 $("#UtenteDataNascita").datepicker( { dateformat: 'yy-mm-dd' }); Primo giorno della settimana sia LUN $("#UtenteDataNascita").datepicker( { dateformat: 'yy-mm-dd', firstday: 1 });
Selezione di un elemento con jquery ES: Voglio cambiare lo sfondo a un campo di testo <input id= cognome class= campi /> $(SELETTORE).azione() $('#cognome').css('background-color:red'); ES: Voglio nascondere il campo quando uno ci clicca sopra $('#cognome').hide();
Esercizio Parte 4-4 Convertire data prelievo e data restituzione (prestito) in datepicker jquery ui Aggiungere al libro un link che mostri tutti i prestiti in cui è stato coinvolto (ordinati con il più recente in alto) mostrare sia in view che in index Nell'elenco dei libri aggiungere una casella di ricerca per titolo o autore Colorare lo sfondo della cella dei libri (nell'elenco libri) di rosso pallido se il libro è in prestito
Aggiungere al libro un link che mostri tutti i prestiti in cui è stato coinvolto (ordinati con il più recente in alto) mostrare sia in view che in index Model >>> Niente da cambiare Controller Agisco sul controller dei prestiti (! non su quello dei libri, perchè voglio vedere un elenco di prestiti, non di libri, e il libro è il parametro) Function stato($idlibro) {...} View app/views/prestiti/stato.ctp Presento una tabella di prestiti (utente, datap, datar) ordinata per datar e ORDINABILE
Link Utili Template e Layout Professionali http://960.gs/ http://www.templatemonster.com/cms-blog-templates.php (50$ circa) Programmazione Agile 1) SCRUM from the trenches (SCRUM dalle Trincee) Opensource - http://www.infoq.com/resource/news/2007/06/scrum-xpbook/en/resources/scrumandxpfromthetrenchesitalian.pdf;jsessioni d=df3d2fd7d5422e0c2ab257132dcd127a 2) EXTREMEPROGRAMMING.ORG - Extreeme Programming Installed