In CakePHP ist es möglich, Bereich anzugeben, welche bei einem View-Caching der Seite nicht mit “gechached” werden sollen. Dies geht sehr komfortabel mit den Kommentar-Tags <!--nocache-->
und <!--/nocache-->
. Damit wird beliebiger PHP-Code zwischen dieses beiden Tags auch bei einer Cache-Seite weiterhin ausgeführt und die Ausgaben nicht in statischen Text umgewandelt.
Bei einem Projekt kam es allerdings vor, dass sich die Inhalte mehrerer nocache-Tags nicht ganz nachvollziehbar vermischten und so an einer anderer Cache-Stelle wieder auftauchten. Nach längerem Suchen hier der Grund:
In der Dokumentation von CakePHP gibt es bei der Beschreibung des CacheHelper’s einen kleinen, aber feinen Hinweis:
Kurz gesagt: nocache-Tags können nicht in Elementen verwendet werden!
Das war auch der Grund, warum die Inhalte der verschiedenen nocache-Tags vertauscht wurden oder gar nicht auftauchten.
Lösung
Die Lösung ist simpel: einfach alle nocache-Tags aus den Elementen entfernen! Um aber dennoch Teile der Webseite nicht im Cache zu speichern, kann man weiter vorn ansetzen und gleich den Aufruf eines Elements in nocache-Tags packen.
Beispiel
Anstatt also einen nocache-Bereich innerhalb eines Elements festzulegen, sollte man das gesamte Element direkt beim Aufruf in nocache-Tags einschließen:
1 2 | // app/View/Elements/loginform.ctp <?php echo AuthComponent::user() ? 'Angemeldet.' : 'Nicht angemeldet.' ; ?> |
1 2 3 4 | // app/View/Layouts/default.ctp <!--nocache--> <?php echo $this ->element( 'loginform' ); ?> <!--/nocache--> |
Update:
Ab Version 2.1 von CakePHP funktionieren NoCache-Tags auch in Elementen, d.h. die beschriebene Lösung sollte dann nicht mehr notwendig sein.