1

Je construis un site de commerce électronique utilisant D7, principalement avec Commerce et DS. Pour obtenir une meilleure performance, j'ai installé Display Cache qui est un module qui met en cache le rendu HTML d'une entité pour les utilisateurs anonymes et authentifiés. Dans mon cas particulier, je cache l'affichage du produit (un nœud qui référence un produit et ses variations s'il y en a).Mise en cache des produits avec Display Cache et possibilité d'ajouter des produits

Après quelques heures de configuration je finis avec un "bon résultat" en performance. Toutes mes entités ont été mises en cache par rol, en mode teaser et full ... mais le problème survient lorsque l'utilisateur clique sur le bouton "Ajouter au panier" car il n'ajoute pas de produits au panier ... ni qu'il montre une erreur.

Une raison possible est le jeton de formulaire ou une fonction de traitement de formulaire qui invalide l'action car le formulaire n'est pas généré à chaque fois comme prévu. J'ai lu comment désactiver le jeton de formulaire dans le "formulaire Ajouter au panier" (ou n'importe quel formulaire), mais cela ne fonctionne pas. Je mets $ form ['# token'] à false, mais n'ajoute toujours pas de produits au panier.

Probablement la solution n'est pas facile, mais j'ai besoin d'indices de ce que je pourrais faire ou d'où je pourrais commencer à résoudre le problème.

Alors, merci pour votre expertise.

Répondre

1

Une solution à cette combinaison de modules, afin d'avoir caché l'affichage pour les utilisateurs authentifiés & anonymes et ajouter aux formulaires de panier est de désactiver la mémoire par programme du produit demandé dans tous ses affichages ... et désactiver le jeton de la "Ajouter au panier"

Voici le code pour désactiver le jeton:

function YOUR_MODULE_form_alter(&$form, &$form_state, $form_id) { 
    if (strstr($form_id, 'commerce_cart_add_to_cart_form') || strstr($form_id, 'views_form_commerce_cart_form_default')) { 
     unset($form['#token']); 
    } 
} 

Et voici le code pour supprimer la mise en cache lorsqu'un un bouton Ajouter au panier est pressé:

function YOUR_MODULE_init() { 
    if (isset($_POST['product_id'])) { 
     $id_product = intval($_POST['product_id']); 
     $res = views_get_view_result('sys_search_product_display', 'default', $id_product); 
     foreach ($res as $nid) { 
      display_cache_flush_cache('node', $nid); 
     } 
    } 
} 

Notez que « sys_search_product_display » est juste une vue qui reçoit l'identifiant du produit et renvoie l'identifiant de l'affichage du produit. Cela peut être fait d'autres façons.