Jump to content

Peut-on désactiver le cache smarty pour un module particulier ?


Recommended Posts

Bonjour

Je m'occupe de la boutique https://www.naycia.com sous PrestaShop 1.7.6.3, avec un thème enfant du thème Cosmetics acheté sur addons.prestashop.com

J'ai créé un module qui permet d'afficher, sur la boutique, le nombre de commandes passées pour le mois en cours (voir en bas de page "La cagnotte du mois"). C'est un peu plus élaboré mais ça se résume à ça, si besoin bien entendu je mettrai ici le code du module. Le module a été conçu en suivant la documentation officielle.

Lorsque le cache smarty est désactivé, le compte est bien implémenté à chaque commande. En revanche, lorsque le cache est activé, ce compte n'est pas mis à jour, il ne l'est que si je vide le cache dans le back-office ou si je modifie le code du module.

Côté paramètres avancés > performances, voir la capture d'écran ci-jointe pour les réglages

Ma question est : est-il possible de désactiver ce cache uniquement pour ce module particulier, ou à tout le moins réduire le temps de mise en cache ?

Et si ce n'est pas possible, la désactivation du cache risque-t-elle de beaucoup ralentir la boutique (côté admin, dans le tableau de bord, j'ai entre 150 et 250 visites dans les dernières 30 minutes) ?

Merci d'avance pour toute suggestion me permettant de corriger mon problème :)

 

Performances.png

Link to comment
Share on other sites

Oui, merci Eolia, c'est bien ce que je veux réaliser.

Mais je ne sais pas comment le faire automatiquement, je suppose que tu ne me conseilles quand même pas de le faire par FTP ?

La documentation ne dit rien à ce sujet, et mes recherches n'ont pour l'instant rien donné. Un petit coup de main serait le bienvenu :)

Link to comment
Share on other sites

Je reformule ma question.

En cherchant dans le cache /var/cache/prod/smarty/cache/ je trouve bien le fichierx xx.php correspondant à la vue de mon module

Je découvre la valeur cache_lifetime dans le tableau $_smarty_tpl->_decodeProperties($_smarty_tpl, array

'cache_lifetime' => 31536000,

Ce qui correspond à 1 an et semble être la valeur par défaut... Puis-je définir la valeur à 1 heure seulement, ce qui serait largement suffisant pour mon usage ? Et bien sûr comment ? ;)

Link to comment
Share on other sites

Merci Mediacom87, votre réponse est similaire à celle de Eolia : je vois bien ce qu'il faudrait faire, mais je n'ai pour l'instant pas de piste sur la manière de le réaliser. Le "code qui va bien" est la bonne réponse, mais un peu vague (ce n'est pas un reproche).

Mille excuses, je ne connais pas assez PrestaShop. Je continue à chercher de mon côté, bien évidemment

Link to comment
Share on other sites

Désolé encore, je ne comprends pas : mon code est appelé sur chaque page.

Du coup si je comprends bien, cela reviendrait à vider tout le cache. À ce compte là, autant ne pas l'utiliser du tout...

Edit : y aurait-il une utilité à vous donner un lien vers le dépôt Github où je garde le code du module, ou est-ce trop demander ?

Edited by Dissitou
Précision (see edit history)
Link to comment
Share on other sites

pourquoi dites vous cela ??????

Vos données sont les commandes réalisées dans le mois, donc on ne va générer un nouveau cache que lorsqu'il y a une nouvelle commande, donc vous devez vider le cache à chaque nouvelle commande.
Analysez les codes des modules existant vous appréhenderez mieux nos propos.

Link to comment
Share on other sites

Je disais cela parce que si je pose une question et qu'elle m'est retournée sous forme d'une évidence je n'avance pas beaucoup.
 

Quote

 

Question : comment vider le cache à chaque commande ?

Réponse : il suffit de vider le cache à chaque fois qu'une commande est passée

 

Comprenez moi bien, je ne cherche pas à polémiquer, et je comprends que je dois faire mes devoirs avant de solliciter l'aide de bénévoles. Je cherche beaucoup de mon côté, et n'ai sollicité aucune aide avant d'être coincé

De plus j'ai déjà bénéficié de votre aide sur d'autres sujets, et vous remercie encore pour votre implication à aider des débutants. Je retourne donc à mes études :)

 

Link to comment
Share on other sites

je vous ai donné le code pour vider le cache après comme expliqué vous devez appeler ce code dans un hook qui est appelé à chaque validation d'une nouvelle commande, et comme je n'ai dit plusieurs modules utilisent ce système donc pour que vous compreniez il faut que vous allez regarder des exemples.

Donc oui je m'étonne que vous puissiez imaginer que l'on va vider le cache à chaque affichage, je vous le concède, cela serait contre productif.

Link to comment
Share on other sites

Bonjour

J'ai fait mes devoirs.

Si j'ai bien compris vos indications et la doc, dans la classe de mon module, j'ajoute dans la fonction  install()

$this->registerHook('actionValidateOrder');

Puis, toujours dans la classe de mon module, j'ajoute une fonction publique non-statique

public function hookActionValidateOrder(array $params)
{
    $this->_clearCache('*');
}

Est-ce que j'ai bon, ou suis-je passé à côté d'une étape essentielle (ça me semble trop simple...) ?

Note : dans mes tests en local, et sans ces modifications, je réalise que les commandes effectuées ne provoquent pas de mise à jour du compteur, ce qui me semble cohérent avec le comportement en production. Mais si l'on change l'état de la commande, en la passant par exemple du statut "En attente du paiement par chèque" au statut "En cours de préparation", le compteur est bien mis à jour. De même, si j'annule une commande après coup, alors qu'elle avait déjà été prise en compte par mon compteur, celui-ci est bien décrémenté.

Est-ce à dire que le changement d'état d'une commande appelle la fonction validateOrder() dans classes/PaymentModule.php ? Si oui, il me semble que je n'ai pas forcément besoin de modifier quoi que ce soit à mon module, ce qui là aussi serait trop beau... En effet, mon compteur se mettrait à jour lors du traitement des commandes, tout simplement. Je testerai ça sur les jours qui viennent et reviendrai confirmer ou infirmer.

Merci encore pour vos conseils et votre patience.

 

Edited by Dissitou
Formulation (see edit history)
Link to comment
Share on other sites

Bonsoir

Merci Eolia et Mediacom87 pour les conseils qui m'ont permis de comprendre un peu plus comment PrestaShop fonctionne

Mais j'ai finalement résolu mon problème avec un bricolage  ^^

Dans /classes/Tools.php j'ai simplement modifié la durée de vie du cache Smarty dans la fonction enableCache(), par défaut fixée à un an, pour la réduire à un délai plus court. En test actuellement 1 heure, ça marche bien

Je n'ai pas vraiment besoin d'une actualisation précise et en temps réel, je pense même passer à 3 ou 4 heures par la suite.

Oui, je sais que toucher aux fichiers originaux c'est le mal (faudrait que je fasse un module pour ça, avec un réglage pour la durée, mais ça doit exister en beaucoup mieux). Mais j'y gagne par rapport au vidage du cache après chaque commande : s'il y en a beaucoup en même temps, le cache n'a pas à être recompilé trop souvent.

Je ne sais pas si je dois mettre ce sujet en résolu, parce que ma solution ne correspond pas vraiment à la question initiale (?)

Bonne soirée

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...