Bonjour,

J'ai vu sur le tutoriel de cakePHP et je trouve le système de cache très pratique.
J'ai vu aussi qu'avec un <!-- nocache --> on peut éviter de placer un élément en cache.
Hors mon élément que je ne voudrais pas dans mon cache, a besoin de faire une requête sql.

En gros j'ai :

Page1, affiche toutes mes marques et 5 produits d'occasion parmi toutes les marques
--Page2, affiche tous les produits de la marque et 5 produits d'occasion de cette marque
----Page3, affiche le produit et 5 produits d'occasion similaires.

Il y'a donc toujours un bloc similaire pour les occasions sur chacune des pages, mais comme les occasions sont mises à jour régulièrement alors que mes marques et produits ne changent qu'une à 2 fois par an.

J'aurais aimé sortir ce bloc, en faire une sorte d'include qui échapperait à la mise en cache.

Suis-je clair et si oui, est ce possible ?

Merci

6 réponses


Shadow
Réponse acceptée

Bonjour,

Je viens de tester quelque chose a ce sujet ^ .. tu peux suivre ce qui est dit là je pense :

"You can take full advantage of elements by using requestAction(). The requestAction() function fetches view variables from a controller action and returns them as an array. This enables your elements to perform in true MVC style. Create a controller action that prepares the view variables for your elements, then call requestAction() inside the second parameter of element() to feed the element the view variables from your controller."

Tu peux tenter de la façon suivante (pour une action disponible via tous les controlleurs) :

Dans AppController :

// Un nom d'action spécifique pour ne pas interférer avec le controlleur principal ni tes futurs controlleurs
public function mon_action() {
    $this->uses] = 'monModel';
    // Ne pas déclarer de 'var $uses = array('...') en haut de AppController, il risquerait d'être écrasé par tes controlleurs
    return $this->monModel->find('all'); // Et ici ta requête de retour
}

Dans l'élément commun à toutes les vues :

<?php
$response = $this->requestAction('app/mon_action');
debug($response);
?>
/*
 * le controlleur 'app' étant considéré comme un controlleur commun, vue qu'il est 
 * dans le dossier 'controllers' cela marche (mais pas forcement propre.. à toi de voir)
 * 
 * Autre possibilité : $response = $this->requestAction($this->request->params'controller'].'/mon_action');
 * (Pas très sexy non plus mais marche aussi)
 *
 * Possibilité aussi de passer d'autres paramètres dans l'url du requestAction (cf. exemple dans le cookbook (lien en bas de ma réponse))
 */

Comme je l'ai dit plus haut je viens de tester sur un élément toolbar d'un de mes projets et mon debug est présent partout.

J'espère ne pas t'avoir embrouillé et répondu un peu plus clairement à ta problématique..

NB : plus d'infos sur le requestAction dans le chapitre : http://book.cakephp.org/2.0/en/views.html#passing-variables-into-an-element

Tu n'as pas trop de réponses. Et bien je n'en ai pas pour toi, mais je te tiens compagnie. Il faut que je me penche sur le cache, il y a des trucs qui me chagrinent.

Bonjour,

C'est ma première intervention sur GrafikArt (et premier jour d'inscription) mais je n'ai pas pu résister à l'envie de te venir en aide sur ce point car j'ai eu une problématique assez similaire à la tienne .. mais je n'avais pas besoin de cache comme toi...
j'espère que ma réponse collera à ton besoin (si je l'ai bien compris).

Pour créer un bloc (réutilisable un peu partout dans les vues) il y a la solution des "Elements". http://book.cakephp.org/2.0/en/views.html#elements

En effet, ces éléments, te permettent d'externaliser des 'bouts' de code html et les rappeler aux besoins (Exemple : une toolbar ou un footer).
Ces éléments ont en plus la possibilité de recevoir des paramètres lors de leurs appels et (et c'est là que ça t'intéresse) ils peuvent aussi être mis en cache (de ce que j'y ai compris mais).

Dans mon projet je n'ai testé (et utilisé) que le passage de paramètres mais je ne vois pas pourquoi la cache sur ces éléments ferait des caprices :D

Bon courage,

En espérant t'avoir aidé..

gato
Auteur

Bonjour et merci de vos réponses et/ou soutiens,

Shadow> J'avais pensé aussi aux éléments, mais le bloc à mettre en élément doit exécuter une requête, et je ne sais pas si c'est possible.
Il faudrait alors pouvoir créer une action pour cet élément dans le même controller, ça serait super, mais je ne vois rien la dessus.

gato
Auteur

Grand grand merci à toi shadow, c'est exactement ce que je cherchais.
Je viens de tester brièvement mais cela me donne aussi le debug que je souhaite.

J'ai plus qu'à peaufiner le truc mais ça m'a l'air top.

De rien ;)