Un problemino insidioso con CacheHelper e tags [cake:nocache] multipli

Se usi la cache delle viste in una applicazione cakephp, è possibile che tu abbia già incontrato questo problema.

Premessa: cakephp offre diversi struemtni e livelli di automatismo per la cache. C’è la classe Cache che permette di salvare in cache qualsiasi cosa, in modo molto flessibile e configurabile, e c’è il CacheHelper che, con 2 righe di configurazione, permette di creare la cache delle viste di determinate azioni o di un intero controller (“saltando” gran parte dell’elaborazione di cake ad ogni chiamata), con simpatici automatismi, come la cancellazione automatica dei file di cache salvati per quel controller quando viene modificato / aggiunto o cancellato un record.
Attenzione: non genera html statico, ma una versione precompilata della pagina – ma sempre interpretata da cackephp, risparmiando però gran parte del lavoro (boostrap completo, caricamento dinamico delle classi ed in particolare dei modelli, accessi al database..), risultando quindi più veloce. Un po’ meno di una pagina “statica”, ma che mantiene dei vantaggi notevoli: una parziale “dinamicità”.
Cake permette infatti anche di specificare nelle viste dei “buchi” che devono rimanere dinamici (tipicamente, dipendenti da variabili in sessione, spesso specifiche per l’utente autenticato), es.:

<cake:nocache><?php echo “Benvenuto ” .  $this->Session->read(‘Auth.User.username’);  ?></cake:nocache>

Il problema può manifestarsi quando, tra layout, vista ed elementi, abbiamo più volte il suddetto tag che specifica i pezzi dinamici della pagina (soprattutto se usi i temi).
Cosa probabile, considerando che almeno uno serve per il solito spazio in cui stampare i messaggi flash, es.

<cake:nocache><?php echo $this->Session->flash(); ?></cake:nocache>

Sintomi: Il contenuto di uno spazio dinamico appare più volte anche dove non dovrebbe (o non appare). Spesso il contenuto di un elemento o di altro spazio dinamico nella pagina appare al posto del suddetto spazio per i messaggi flash. Che dovrebbe essere vuoto. (e magari rischi di ritrovarti salvato in cache, quindi letto da tutti, qualcosa tipo: “Ciao utente Pincopallo, clicca qui per modificare le tue cose”.. anche se Pincopallo s’è scollegato da ieri..)

Soluzione: si, c’è una soluzione! Sembra funzionare (l’ho provata velocemente in un contesto abbastanza complesso, quindi non mi sbilancio), solo che non è ancora inclusa nel branch master di cake.

Il problema è stato sollevato più volte e con diverse condizioni, ma questo ticket presenta la spiegazione più chiara.
E c’è anche una patch di Mark Story che, appunto, dovrebbe correggere il problema. Dovrebbe essere inclusa nel branch master di cakephp 1.3 dopo la versione 1.3.11.

Ma se riscontri il problema è semplice applicarla a mano.

Update: questo articolo è rimasto in bozza per troppi giorni. Nel frattempo è uscita la versione 1.3.12 che apparentemente corregge i problemi (ma forse non con i temi, verificherò)

Un altro escamotage da provare può essere il far si che il contenuto della parte nocache non sia vuoto, e diverso tra i vari pezzi nocache.

Aggiornerò nei commenti in caso di risposte “definitive”.

nel frattepo ricordo che in cakephp