tags search: cakephp
CakePHP Supercache plugin 0.2
Ho pubblicato oggi la nuova versione 0.2 di CakePHP Supercache plugin, che porta con se un paio di succose novità. Prima di tutto il sistema è ora basato su una configurazione di tipo whitelist / blacklist, che significa rispettivamente "non fare la cache di nulla tranne ciò che specifico" e "fai la cache di tutto tranne ciò che ti specifico". La blacklist è comoda per tutti quei siti con molte pagine che possono essere visualizzate senza aver bisogno di interrogare o lavorare con il database. Quello che fa un CMS come questo, per esempio :) La whitelist, al contrario, è utile per tutti quei siti con molte pagine che "scrivono" sul database, come può essere un gestionale in cui le pagine "statiche" sono poche.
Altra novità importante è che ora la cache viene automaticamente sospesa nel momento in cui CakePHP imposta un messaggio di sessione (i classici $this->Session->setFlash(), per intenderci). Ovviamente non vogliamo che questo genere di messaggi vengano mostrati ad utenti che non c'entrano nulla con chi l'ha fatto generare (per esempio compilando il modulo contatti), e da ora è più semplice gestire questo genere di eccezioni.
Nella prossima versione ho intenzione di concentrarmi sull'ottimizzazione delle pagine html: tidy, compressione e via dicendo... sono aperto a consigli in merito :)
CakePHP Supercache plugin
CakePHP è lento, dicono. E forse hanno anche ragione, benchmark alla mano, ma la vita reale è molto diversa da un benchmark ed io tutta questa lentezza non l'ho mai realmente percepita. Discorso ben diverso invece è gestire un sito molto visitato su un server con risorse limitate, cosa che può causare una lentezza dovuta, appunto, alle scarse prestazioni del server più che a quella del framework in se.
Tempo fa scoprii un fantastico plugin di Matt Curry che permetteva di creare dei file html statici, in modo del tutto trasparente all'utente finale, che fossero una copia esatta di una precedente elaborazione di CakePHP. Per farla semplice: la prima volta cakephp genera la pagina, la salva in un file html e la seconda volta visualizza direttamente il file html invece di ri-elaborare il tutto. Figata!
Implementai quel sistema ma mi resi conto che non era ancora una soluzione ottimale: il tutto si basava infatti comunque sull'infrastruttura di CakePHP (che quindi faceva comunque lavorare il server, se non altro per caricare il framework). Volevo qualcosa di più radicale.
CakePHP supercache plugin
Così mi misi a lavorare su qualcosa che facesse più o meno la stessa cosa e decisi di operare alla fonte: il file app/webroot/index.php. Questo mi permise di saltare totalmente l'infrastruttura di CakePHP facendo richiamare direttamente il file cache, quando richiesto. In pratica, poche righe di php (puro) per decidere cosa fare, per poi richiamare il framework o la cache a seconda delle necessità. Senza praticamente alcuno sforzo per il server. Non appena poi un utente effettua il login la cache viene automaticamente svuotata, così da evitare il rischio di mantenere in cache file obsoleti.
Installazione
Per installare questo plugin è necessario:
- Creare la cartella app/webroot/cache, con permessi di scrittura;
- rinominare il file app/webroot/index.php in app/webroot/index_cake.php;
- scaricare il file index.php da github;
- curiosare nel file ed indicare quali tipi di pagine debbano essere salvate in cache (il tutto è gestito in stile whitelist: di default nessuna pagina viene salvata tranne quelle specificate);
- godersi il risultato.
Risultati
Per avere un'idea del risultato ho fatto qualche misurazione del consumo di memoria necessario alla visualizzazione della home page di questo stesso sito: senza il plugin abilitato la memoria utilizzata dal server per mostrare l'home page è di 3,78mb e 0.075281 secondi di elaborazione. Con il plugin attivato è di 768kb e 0.000977 secondi.
Mica male per un plugin così semplice da implementare, no?
Libro "Instant CakePHP Starter", di Mark Robert Henderson
Alcuni giorni fa ho ricevuto un contatto da parte di Packt Publishing, casa editrice specializzata in libri di informatica (dalla programmazione alla grafica, con tutto quello che ci sta in mezzo), in cui mi fornivano l'opportunità di recensire un libro su CakePHP, scritto da Mark Robert Henderson, chiamato "Instant CakePHP Starter".
Avevo già fatto qualcosa del genere in passato, così ho accettato di buon grado.
Quello che mi ha incuriosito fin da subito è quell'"INSTANT" che fa capolino sin dalla copertina, seguito da "Short | Fast | Focused". Tutte caratteristiche che ritengo fondamentali in un libro/manuale di programmazione: odio perdere giorni a leggere teoria, preferisco andare al sodo e poter provare direttamente, magari contemporaneamente, quello che sto studiando.
Cosa è
Questo libro fa esattamente quanto promesso dalla copertina: l'autore parte da un'esigenza pratica e, dopo una breve panoramica sul framework e sul pattern MVC, ci spiega come creare l'applicazione dall'inizio alla fine, spiegando i vari passaggi intermedi: l'installazione, la configurazione iniziale, l'utilizzo del tool da riga di comando "cake", fino alla pubblicazione online, sfruttando il servizio gratuito di AppFog. Nel giro di poche decine di pagine Mark ci mostra come, sfruttando automatismi e convenzioni, CakePHP sia in grado di generare un'applicazione funzionante, seppur grezza, scrivendo pochissime linee di codice.
Poco dopo la metà del libro, dopo aver creato la nostra applicazione, l'autore va avanti e ci illustra altre importanti funzionalità di Cake: routing, themes, behaviors, fixtures e tests.
Secondo me
Quello che mi è piaciuto maggiormente di questo libro è che nel giro di poche pagine (un'ottantina in tutto) offre una bella panoramica di quanto offre CakePHP e lo fa in modo piacevole e diretto, senza tralasciare gustosi particolari. È un libro adatto sia a chi sta iniziando a conoscere questo bellissimo framework sia a chi, come me, lo utilizza già da alcuni anni ma ha sempre qualcosa da imparare o da migliorare. E poi... costa meno di 10 euro, è decisamente abbordabile ;)
Twitter bootstrap su CakePHP... senza sforzo
Twitter Bootstrap, per chi non lo conoscesse, è un bellissimo framework css, realizzato originariamente da quei geniacci di Twitter per semplificare la realizzazione di interfacce che, oltre ad essere graficamente consistenti (una manna dal cielo per chi, come me, non è dotato di particolari doti grafiche), sono anche responsive. In grado quindi di adattarsi a diverse risoluzioni e tipi di dispositivo: cellulare, tablet, schermo ecc.
Lo scaffolding di CakePHP, (o il codice generato da bake), genera invece layout molto semplici, con pagine che sarebbero da modificare pesantemente per adattarle all'uso di bootstrap.
Per fortuna c'è un punto d'incontro: javascript. Sfruttando questa bellissima tecnologia (ed in particolare jQuery) possiamo adattare il codice generato da CakePHP in modo da far gestire la grafica a twitter bootstrap, senza doverlo nemmeno modificare.
Per comodità ho realizzato un piccolo file javascript, che prende le più comuni classi generate da CakePHP e gli "appiccica" gli stili di cui avevo bisogno.
Se anche tu hai necessità di fare qualcosa del genere, chissà, magari questo può servirti da spunto:
// cakePHP bootstrap - based on twitter bootstrap 3 $(document).ready(function() { /* * LAYOUT * aggiungo le classi relative alle dimensioni degli elementi */ $("#container").addClass("row-fluid"); $("div.actions").prependTo("#content"); $("div.actions").addClass("span3"); $("div.index").addClass("span9"); $("div.form").addClass("span9"); $("div.view").addClass("span9"); $("div.related").addClass("span9"); $("div.flashMessage").addClass("span9"); /** * TABELLE * aggiungo il tag <thead> per la riga di intestazione delle tabelle **/ $("table").prepend( $('<thead></thead>').append($('table tr:first').remove()) ); /* * FORMS * classi per form ed inputs */ $("input:not(.datepicker)").addClass("input-block-level"); $("textarea").addClass("input-block-level"); /* * BOTTONI * classi per bottoni, link etc. */ $(":submit").addClass("btn btn-success"); $(".actions ul li a").addClass("btn-block"); $("#content a").addClass("btn"); $("div.actions").addClass("row"); $(".actions a[href*='delete']").addClass("btn-danger"); $("a[href*='add']").addClass("btn-primary"); $("a[href*='view']").prepend("<i class='icon-search'></i> "); $("a[href*='edit']").prepend("<i class='icon-edit'></i> "); $("a[href*='delete']").prepend("<i class='icon-remove'></i> "); $("form[action*='delete']").next("a").prepend("<i class='icon-remove icon-white'></i> ").addClass("btn-danger"); /**/ });
Preparare i file .po per tradurre un sito fatto in cakephp
Recentemente mi è capitato di dover tradurre tutte le stringhe di un sito scritto in CakePHP, ma solo in inglese. Un autentico lavoraccio visto che il sito aveva una miriade di pagine e di funzionalità.
Dalla mia c'era il fatto, e chi usa CakePHP lo sa, che gli strumenti che questo fantasmagorico framework offre sono infiniti.
Fortunatamente il sito era già predisposto per la traduzione, quindi bastava preparare il file .po ed inserirvi le traduzioni. Lo strumento di cui mi sono servito, anche questa volta, è la potentissima console di CakePHP, che con il comando
/var/www/ilmiosito/app$ ./Console/cake i18n
ha cercato (da sola!!) tutte le stringhe traducibili in tutte le sottodirectory dell'applicazione "ilmiosito" (quelle scritte in modo simile a __('Traducimi', true), per intenderci) ed ha salvato il tutto, comodamente, nella directory ./app/Locale nella forma di un file con sintassi gettext, cioè qualcosa di simile a questo:
msgid "Translate me" msgstr "Traducimi"
... naturalmente, inserire la traduzione nella stringa msgstr rimane compito di chi scrive, non tutto è così automatizzato :)
Comodo, no?
[Recensione] CakePHP 1.3 Application Development Cookbook
Una doverosa premessa
Fin da quando sono entrato nel colorato e caramelloso mondo multiforme dell'informatica ho sempre prediletto blog e siti tematici; ho un brutto rapporto con manuali, libri e quant'altro riguardante la programmazione: ne ho acquistati alcuni insieme a riviste o per conto mio, ma immancabilmente la loro fine è quella di essere riposti in uno scaffale il giorno stesso o di restare sul tavolo in attesa di decidere cosa farne.
Qualche tempo fa sono stato contattato per recensire "CakePHP 1.3 Application Development Cookbook", di Mariano Iglesias. Conosco di fama Mariano Iglesias perchè diverse volte, cercando informazioni su come-fare-cosa su CakePHP mi sono imbattuto in alcuni suoi contributi, così, vista la mia stima nei suoi confronti, pur senza averci mai avuto a che fare direttamente, mi sono incuriosito e ho deciso di provare a farne una recensione.
Il libro
Il libro, che mi è arrivato in formato elettronico, è sostanzialmente un incrocio fra un manuale "pratico" ed un libro di ricette. Cookbook è un nome perfettamente azzeccato, e come tale è consigliabile leggerlo: se per esempio avessi bisogno di sapere cosa sono e come funzionano i Test, argomento su cui ho sempre avuto molte lacune e su cui non sono mai riuscito a trovare qualcosa di realmente utile a riguardo, mi basterebbe aprire il libro su quel capitolo per scoprire cosa sono, come funzionano e trovare degli esempi pratici su come usarli. Esempi che non sono mai banali (non è un libro per principianti: è infatti indicato per utenti medio-avanzati, categoria nella quale spero di potermi inserire).
Ogni capitolo si suddivide in un'introduzione, che spiega genericamente l'argomento trattato, e la parte tecnica, suddivisa a sua volta in almeno 3 sottocapitoli: getting ready (preparazione dell'ambiente di lavoro), how to do it (il codice vero e proprio, spesso con immagini e screenshot per rendere graficamente più chiaro il tutto) e how it works (che spiega ciò che succede nelle due parti precedenti). In alcuni capitoli è presente anche un there's more, che contiene curiosità o altre funzioni o funzionalità correlate.
Gli argomenti trattati
Il libro è composto da 11 capitoli per altrettanti argomenti in ambiti piuttosto vari e diversi fra loro; ecco di cosa tratta (cliccando sul link potete vedere come vengono sviscerati i singoli argomenti):
Preface
Chapter 1: Authentication
Chapter 2: Model Bindings
Chapter 3: Pushing the Search
Chapter 4: Validation and Behaviors
Chapter 5: Datasources
Chapter 6: Routing Magic
Chapter 7: Creating and Consuming Web Services
Chapter 8: Working with Shells
Chapter 9: Internationalizing Applications
Chapter 10: Testing
Chapter 11: Utility Classes and Tools
Index
Non male eh?
Personalmente ho trovato incredibilmente interessanti e utili i capitoli su "model bindings", "validazione" e "testing", che poi erano anche i punti su cui avevo più confusione in testa, ma anche il resto è ben scritto e molto chiaro. Mariano ha avuto l'ottima intuizione di scrivere un libro che richiede una discreta esperienza su CakePHP per essere letto e compreso a fondo, raggiungendo il suo scopo in modo chiaro e diretto.
Il verdetto finale
Sarebbe fuorviante dare un voto univoco al libro, in quanto può essere molto utile per chi ha una buona infarinatura generale su CakePHP e vuole migliorarsi, mentre per chi sta iniziando sarebbe probabilmente un libro troppo difficile da comprendere.
Mi piace moltissimo la struttura a "ricettario", mentre ho apprezzato meno la formattazione del codice. D'altra parte un libro non è un monitor, per cui un bellissimo pezzo di codice, che sul computer sarebbe perfettamente leggibile, su carta ha dei ritorni a capo che ne rendono difficoltosa la lettura. Avrei apprezzato anche se gli esempi di codice avessero avuto un po' di colore; il fatto che sia scritto tutto in nero non aiuta molto il "colpo d'occhio". Non so se sia tecnicamente fattibile, ma mi sarebbe piaciuto davvero moltissimo se insieme al libro ci fosse stato un insieme di file con i vari snippet di codice in formato testuale, da aprire con il proprio editor preferito...
Detto questo, rimane un libro perfettamente godibile pur con queste piccole pecche, che immagino siano un limite del formato stesso con cui viene fornito, cartaceo o ebook.
Dimenticavo... il libro è totalmente in inglese! Un inglese perfettamente chiaro e leggibile; non credo che possa creare problemi particolari a qualcuno, visto che nell'informatica l'inglese è un po' ovunque, ma è bene saperlo per evitare sorprese .
Integrazione di YoxView con CakePHP
Quando dico niente di più semplice, credimi, intendo davvero niente di più semplice.
Vuoi implementare una lightbox basata su jquery, che sia veloce, funzionale, semplicissima da installare e che permetta di avere uno slideshow? Beh YoxView è tutto questo e molto altro.
L'installazione è banale: basta scaricare il pacchetto e scompattarlo in ./app/webroot/js, nella directory yoxview.
Poi devi creare un element chiamato yoxview.ctp e mettici dentro questa roba:
<?php echo $this->Html->css('../js/yoxview/yoxview'); echo $this->Html->script('yoxview/jquery.yoxview-2.15.min'); echo $this->Html->script('yoxview/yoxview-init'); $initJs = " $(document).ready(function(){ $('#content').yoxview({ //sostituisci #content con l'id di ciò che contiene le immagini lang: 'it' }); }); "; echo $this->Html->scriptBlock($initJs); ?>
Beh... sei libero di non crederci, ma l'integrazione è già fatta. Semplice vero?
Se vuoi vedere come funziona, dai un'occhiata in qualche pagina nella galleria o in slideshow...
Come integrare Elrte con CakePHP?
Premessa:
Gli editor WYSIWYG sono una figata, e sono anche un ottimo strumento da dare in mano ad un cliente affinchè possa creare una pagina sapendo, almeno per sommi capi, cosa sta facendo.
Il problema sorge quando si inizia a testarli, questi editor, e personalmente mi sono imbattuto in:
TinyMCE: un editor semplice da usare, abbastanza funzionale, ma in generale lo trovo... scomodo. La licenza professionale ha un costo ma non so di quanto sia.
Ckeditor: più carino esteticamente (a mio gusto). Funzionale al punto giusto, ha un solo grande difetto per me: la licenza costa decisamente troppo per un progetto come il mio, dovrei ricaricare troppo sui clienti e questo non mi va.
Recentemente mi sono imbattuto in elRTE, un progetto open source basato su jQuery (il che da solo me lo fa preferire ad altri editor). È anche fornito di un ottimo file manager, molto potente e molto personalizzabile.
Ok, proviamolo
Siccome sono tremendamente curioso e mi piace provare tutto ciò che ha la parvenza di essere usabile, ho deciso subito di provarlo.
L'installazione su CakePHP non è difficile, ma non essendoci ancora documentazione in giro su come ottenerne l'integrazione ho avuto alcune difficoltà. Questi sono i passaggi che devi fare:
- Scarica elRTE e elFinder e scompatta entrambi in .app/webroot/js/elrte/
- Scarica il file .zip che ho allegato in fondo a questa pagina, e poi salva il file elrte.ctp in .app/views/elements/ e il file connector.php in .app/webroot/js/elrte/elfinder-1.1/connectors/php/
- Richiama l'element nel layout o dove preferisci, di default è configurato per trasformare tutte le textbox.
- Modifica secondo le tue necessità il file del connector (io ho impostato il tutto in sola lettura, visto che gli upload li gestisco altrove)
- Et voilà! Les jeux sont fait.
Semplice vero? Io ci ho messo tutta la giornata per riuscire a far funzionare il tutto... per ora però ritengo di poter essere più che soddisfatto!
Utilizzare file .po diversi a seconda del tema con cakephp
Uno dei problemi che si possono presentare a chi lavora su cakephp è quello di avere uno stesso progetto utilizzato da clienti diversi, con esigenze diverse, sia di temi grafici che di formalità nel lessico.
Immagina di avere la stessa piattaforma per due siti, uno molto formale (cliente Pierluigi) e uno giocherellone (cliente Ciccio). È ovvio che se entrambi vogliono una stringa di benvenuto sul sito questa non possa essere la stessa, ma dovrebbe essere personalizzata... Cakephp ci ha fornito uno strumento utilissimo che sono i locales, dei files in cui inserire le stringhe da tradurre, con relativa traduzione
Se ad esempio nella mia view uso qualcosa tipo __('Saluti', true), cakephp si occupa di andare a cercare la relativa stringa nel file app/locale/ita/LC_MESSAGES/default.po
msgid "Saluti" msgstr "Ciao"
oppure, se la lingua è impostata sull'inglese, nel file app/locale/eng/LC_MESSAGES/default.po
msgid "Saluti" msgstr "Hello"
Ma come fare se, tornando al problema iniziale, vogliamo che per il cliente Pierluigi ci sia un saluto formale, e per Ciccio un saluto informale, sempre in italiano? Cakephp ci ha fornito una comodissima soluzione, che se utilizzata insieme alla funzionalità theme fa perfettamente al caso nostro...
__d($this->theme, 'Saluti', true)
Notato la sottile differenza? Con questa sintassi cakephp va a prendere il nome del tema in uso e cercherà il relativo file .po nelle directory che abbiamo nominato sopra.
Se per esempio il cliente Pierluigi usa il tema "pierluigi", basterà avere un file app/locale/ita/LC_MESSAGES/pierluigi.po con questa stringa
msgid "Saluti" msgstr "Buongiorno"
mentre, per il cliente Ciccio con tema "ciccio", il file sarà app/locale/ita/LC_MESSAGES/ciccio.po, e conterrà
msgid "Saluti" msgstr "Ciaooo"
Comodo no?