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 == true
et 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é _isScopePrivate
qui 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):
- Aller à
\Magento\Framework\Pricing\Render\Layout::__construct
- 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?