Bloquer avec Cachable = false non rendu sur la page de visualisation du produit

21

J'utilise magento2-1.0.0-beta4

J'ai copié le checkout.rootbloc depuis app/code/Magento/Checkout/view/frontend/layout/checkout_index_index.xmlsur la page du produit.

Tout fonctionne bien, jusqu'à ce que j'active le page_cache. Ce bloc a cacheable="false"dans le XML de mise en page.

Maintenant, lorsque j'ouvre ma page de produit, le bloc n'est pas rendu du tout.

Si j'ai bien compris le cache de pages, il devrait charger ces blocs via un appel AJAX. Mais il ne semble pas se produire un tel appel AJAX car mon point de rupture \Magento\PageCache\Controller\Block\Render::executen'est jamais atteint.

Lors de l'ouverture /checkout/ou /checkout/cart/tout fonctionne. Mais il ne semble pas non plus se produire un appel AJAX. Au lieu de cela, la page entière ne semble pas être rendue à partir du cache, ce qui est logique pour le panier.

Dois-je simplement exclure la page de visualisation du produit de la page page_cache? Mais je n'ai pas trouvé de moyen de le faire?

Alex
la source

Réponses:

15

Ce problème est toujours reproductible sur Magento 2.0.0 Stable.

Il existe une fonctionnalité dans la gestion des exceptions de Magento 2, qui empêche le rendu des blocs cassés tandis que tous les autres blocs sont toujours rendus. En mode développeur, il est désactivé et toutes les exceptions sont affichées directement dans le navigateur. Dans les modes par défaut et de production, si une exception se produit pendant le rendu de bloc, le bloc sera simplement supprimé de la sortie (l'exception correspondante est toujours enregistrée dans var / log / system.log ). Tu vois \Magento\Framework\View\Layout::renderNonCachedElement().

A la suite exception se produit lors du rendu de bloc de commande sur la page du produit et qui est la raison pour laquelle ce bloc manque: main.CRITICAL: No such entity with customerId = [] [].

La raison de cette exception est que les données client dans le stockage de session sont dans un état incohérent ( customerLoggedIn == trueet que les données client sont manquantes) après l' \Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXml()exécution. Ce plugin ferme la session PHP en cours et supprime ainsi les données client du stockage de session. Cela se produit uniquement si la page est entièrement en cache (et c'est effectivement le cas).

La page est considérée comme pouvant être mise en cache par le module de cache de page uniquement si sa mise en page ne contient pas de blocs avec cacheable="false". L'ajout de cet attribut ne rendra pas ce bloc chargé par Ajax (comme supposé dans la question). Pour que certains blocs soient chargés par Ajax, ce bloc doit avoir déclaré une propriété _isScopePrivatequi est définie sur true, en outre, il ne devrait pas y avoir de blocs cacheable="false"sur la page. Voir \Magento\PageCache\Observer\ProcessLayoutRenderElement::execute()et mage.pageCache._replacePlaceholder()dans Magento / PageCache / view / frontend / web / js / page-cache.js . Vérifiez également les documents de haut niveau dans le fichier lisez-moi du module de cache de pages

Page du produit ne doit pas être cacheable depuis cacheable="false"est défini pour le bloc de commande, mais il est, en raison de problèmes connus blocs UnCacheable étant mis en mémoire cache . Jusqu'à ce que ce problème soit résolu, la solution de contournement suivante peut être utilisée (ne me demandez pas pourquoi cela fonctionne, c'est une longue histoire):

  1. Aller à \Magento\Framework\Pricing\Render\Layout::__construct
  2. Remplacer ['cacheable' => $generalLayout->isCacheable()]par['cacheable' => false]

Cela ne devrait pas nuire car les pages de produits ne seront pas mises en cache de toute façon après l'ajout d'un bloc de paiement

Une autre question est, voulez-vous vraiment rendre les pages produits non cachables par cache de page intégré ou vernis?

Alex Paliarush
la source
1
Des mises à jour pour ce problème sur la dernière version de magento2? @Alex
Keyur Shah
Alex, je veux juste supprimer un phtml du cache. et cet appel de fichier html dans le conteneur d'en-tête. une idée s'il vous plaît faites le moi savoir
Camit1dk