itaeng

tags search: php

Pubblicato in:php script segnalazioni

LogHappens - come tenere d'occhio i log files, senza impazzire

01APR2017

Qualche tempo fa ho scoperto un tool dal nome divertente e con uno scopo è utilissimo: poter tenere d'occhio log files, a piacimento, senza diventare matti interpretando file di testo da centinaia di righe, solitamente formattati in modo non troppo chiaro.

Tutto molto bello, peccato che creare dei nuovi parser è un delirio di regex, regole e requisiti non proprio chiarissimi... così ho iniziato a fare un mio parser.

LogHappened

Così è lato LogHappens. La grafica è minimale e molto semplice: un menu laterale in cui scegliere il log che si vuole visualizzare, un contatore per avere sempre un'idea di quante entries sono presenti per ogni log file... ed i log. Suddivisi come preferisci, anche se probabilmente farlo per data e ora è il modo più semplice. Quando succede qualcosa di nuovo, per esempio viene rilevato una nuova entry in uno dei file, LogHappens mostra un popup del browser (mostrato quindi dal sistema operativo, anche quando l'app non è in primo piano).

Sì, ma come funziona?

Il funzionamento, come dicevo, doveva essere molto semplice: In una cartella `logics` sono presenti tanti files quanti sono i log che vuoi tenere sotto controllo. Nella cartella `logics_templates` sono presenti invece, come puoi immaginare, alcuni esempi di file logics. Uno di questi serve per interpretare i log files di apache, e contiene questo codice:

<?php
$menu = [
    "icon" => "build",
    "color" => "red",
    "title" => "Apache error.log"
];
$content = file("/var/log/apache2/error.log");
 
$group = "";
$log = [];
foreach ($content as $line) {
    // Grab the log's time and group logs by time
    $time = substr($line, 119);
    if ($time != "") {
        // Remove date-time and other useless informations from the log details
        $line = substr($line, 34);
        if (substr($line, 013== "[:error] [pid") {
            $line = substr($line, 45);
        }
        $line = str_replace("PHP""", $line);
        $line = trim($line);
 
        // Add vertical spacing for warnings and notices
        if (substr($line, 09== "Warning: ") {
            $line = "<br>" . $line;
        }
        if (substr($line, 08== "Notice: ") {
            $line = "<br>" . $line;
        }
 
        // Save the log entry
        $log[$time][] = $line;
    }
}
 
// Reverse the logs, so that we can see last errors first
$logs = array_reverse($log);

 

Piuttosto semplice, non è vero? Modificando un po' questo file, è possibile creare un parser per virtualmente qualunque tipo di log file.

Semplice, no? 

Pubblicato in:segnalazioni php

Alcuni siti si vedono male su chrome 44

24LUG2015

Da quando Google Chrome 44 è stato rilasciato sono fioccati problemi di compatibilità con alcuni siti che non si vedono più correttamente, sembrano essersi persi dei pezzi o in generale si comportano in modo strano.

Beh, è un bug di questa versione di Chrome, che dovrebbe venire aggiornata a breve (il 27 luglio). Ad esserne affetti sono potenzialmente un po' tutti i siti. Personalmente ho riscontrato un problema su un sito PHP "fatto a mano" ed uno in Wordpress.

Nel frattempo, è possibile risolvere il problema "eliminando" due variabili di sessione che "confondono" questa versione di Chrome:

# Fix for CHROME 44 https bug
unset($_SERVER['HTTP_HTTPS']);
unset($_SERVER['HTTPS']);

Tutto lì. A saperlo prima, mi sarei evitato qualche ora di debug... :)

Pubblicato in:cakephp

CakePHP Supercache plugin 0.2

17GIU2014

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 :)

Link: https://github.com/ToX82/cakephp-supercache

Pubblicato in:php cakephp

CakePHP Supercache plugin

26MAR2014

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?

Pubblicato in:segnalazioni cakephp

Libro "Instant CakePHP Starter", di Mark Robert Henderson

22LUG2013

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.

Instant CakePHP Starter

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 ;)

Pubblicato in:cakephp

Twitter bootstrap su CakePHP... senza sforzo

11GIU2013

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");
/**/
});
Pubblicato in:php trucchi

Visualizzare il testo di una pagina durante il caricamento

18APR2013

Perdona il titolo  nebuloso, ma non so come riassumere meglio questa piccola ma utie pillola di codice.

Come al solito parto dalla necessità: ho creato una piccola applicazione che per via dei lunghi tempi di esecuzione rende difficile capire cosa sta facendo, fino a quando non ha terminato l'ultimo script. Il che può essere ragionevole fino a quando lo script richiede pochi secondi, ma quando ne richiede alcune decine... è decisamente troppo.

Da qui la necessità di stampare sullo schermo un resoconto per ogni operazione completata, per poi fare il resoconto finale al termine del tutto. Più facile a dirsi che a farsi, probabilmente. Per me di sicuro lo era finché non mi sono imbattuto in questa piccola chicca

function echo_live($txt) {
    // inizializzazione del buffer per l'output
    if (ob_get_level() == 0) ob_start();
    echo $txt;
    // per Chrome e Safari si deve aggiungere questa istruzione
    print str_pad('',4096)."\n";
    // invia il contenuto al buffer
    ob_flush();
    flush();
}

Queste poche righe di codice fanno proprio ciò che mi serve: stampano una stringa a video immediatamente, senza aspettare il "termine dei lavori". Figata. Quello che è più importante è che, in sostanza, invece di fare un "echo" dell'informazione che voglio mostrare a video, basta utilizzare la nuova funzione "echo_live", senza dover riscrivere pressoché nulla nel codice.

Comodo vero?

Pubblicato in:php trucchi segnalazioni

Effettuare il dump di una tabella MySQL da php

15MAR2013

Recentemente mi è capitato di dover creare uno script PHP che effettuasse il dump di una tabella di un database MySQL e la salvasse in un file, magari con compressione gzip.

Su internet ci sono decine di risorse, qualcuna fatta a mano, qualcuna che sfrutta il (comodissimo) programma mysqldump, ma nessuno propriamente personalizzabile: a me serviva qualcosa che tirasse giù i dati, magari in una sola insert e non in duecentomila, ma che all'occorrenza mi permettesse anche di inserire le istruzioni di DROP TABLE e la seguente CREATE.

Così, sfruttando parte di script scritti da qualcun altro, me ne sono creato uno da me. Lo riporto qua, sperando che possa essere utile a qualcuno.

Clicca per vedere lo script!

http://pastebin.com/ujLYxAWW

Pubblicato in:php trucchi

Disabilitare gli errori "deprecated" delle vecchie versioni di cake su php 5.3

28FEB2012

A volte capita di dover mettere mano a vecchi siti sviluppati su cakephp 1.2, e spesso ci si inciampa in noiosi errori "deprecated" dovuti alla differenza di versione di PHP (cakephp 1.2 era scritto per php4, pur girando anche su php5, mentre cakephp 2.0 gira solo su php5.3).

Dopo essere diventato matto per capire come nascondere quei messaggi ho trovato una soluzione che credo sia la migliore, se non altro per la comodità: aggiungere una piccola istruzione in cima al file ./index.php che spieghi a php che gli errori di quel genere deve ignorarli:

if(defined('E_DEPRECATED')) {
	error_reporting(E_ALL & ~E_DEPRECATED);
}
Beh... funziona!
Pubblicato in:cakephp trucchi

Preparare i file .po per tradurre un sito fatto in cakephp

15FEB2012

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?

Pubblicato in:php trucchi

Che noia aggiungere il file di configurazione in ogni file php...

05OTT2011

... per fortuna che esiste l'.htaccess :)

Se si vuole includere un file (ad esempio un file di configurazione) in ogni singolo file php, può non essere necessario fare l'include tutte le volte; si può infatti fare in automatico con una semplice istruzione da mettere nell'.htaccess, così:

php_value auto_prepend_file "/percorso/del/file/config.php"

Allo stesso modo, se si vuole fare la stessa cosa ma al fondo dei propri file, si può utilizzare un'altra istruzione:

php_value auto_append_file "/percorso/del/file/stats.php"

Comodo, vero? :)

Pubblicato in:cakephp segnalazioni

[Recensione] CakePHP 1.3 Application Development Cookbook

23AGO2011

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 smiley.

Pubblicato in:trucchi cakephp

Integrazione di YoxView con CakePHP

09NOV2010

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...

Pubblicato in:cakephp

Come integrare Elrte con CakePHP?

26OTT2010

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:

  1. Scarica elRTE e elFinder e scompatta entrambi in .app/webroot/js/elrte/
  2. 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/
  3. Richiama l'element nel layout o dove preferisci, di default è configurato per trasformare tutte le textbox.
  4. Modifica secondo le tue necessità il file del connector (io ho impostato il tutto in sola lettura, visto che gli upload li gestisco altrove)
  5. 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! smile

Pubblicato in:cakephp

Utilizzare file .po diversi a seconda del tema con cakephp

06DIC2009

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?