Questo problema è ancora riproducibile su Magento 2.0.0 Stable.
C'è una funzione nella gestione delle eccezioni di Magento 2, che impedisce il rendering di blocchi rotti mentre tutti gli altri blocchi sono ancora resi. In modalità sviluppatore è disabilitato e tutte le eccezioni vengono visualizzate direttamente nel browser. In modalità predefinita e di produzione, se si verifica un'eccezione durante il rendering del blocco, il blocco verrà rimosso dall'output (l'eccezione corrispondente viene comunque registrata in var / log / system.log ). Vedere \Magento\Framework\View\Layout::renderNonCachedElement()
.
A seguito di eccezione si verifica durante il controllo il rendering blocco sulla pagina del prodotto ed è per questo che questo blocco non è presente: main.CRITICAL: No such entity with customerId = [] []
.
Il motivo di questa eccezione è che i dati dei clienti nella memoria di sessione sono incoerenti ( customerLoggedIn == true
e mancano i dati dei clienti) dopo l' \Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXml()
esecuzione. Questo plugin chiude la sessione PHP corrente e quindi rimuove i dati dei clienti dalla memoria della sessione. Ciò accade solo se la pagina è completamente memorizzabile nella cache (e in realtà lo è).
La pagina è considerata memorizzabile nella cache dal modulo cache della pagina solo se il suo layout non contiene blocchi con cacheable="false"
. L'aggiunta di questo attributo non renderà questo blocco caricato da Ajax (come presupposto nella domanda). Affinché alcuni blocchi vengano caricati da Ajax, questo blocco dovrebbe aver dichiarato la proprietà _isScopePrivate
che è impostata su true
, inoltre, non dovrebbero esserci blocchi con cacheable="false"
sulla pagina. Vedi \Magento\PageCache\Observer\ProcessLayoutRenderElement::execute()
e mage.pageCache._replacePlaceholder()
in Magento / PageCache / view / frontend / web / js / page-cache.js . Controlla anche i documenti di alto livello nel file Leggimi del modulo cache di pagina
La pagina del prodotto non deve essere memorizzabile nella cache poiché cacheable="false"
è impostata per il blocco di checkout, tuttavia lo è, a causa del problema noto . Blocchi non memorizzabili nella cache . Fino a quando questo problema non viene risolto, è possibile utilizzare la seguente soluzione alternativa (non chiedermi perché funziona, è una lunga storia):
- Vai a
\Magento\Framework\Pricing\Render\Layout::__construct
- Cambia
['cacheable' => $generalLayout->isCacheable()]
in['cacheable' => false]
Ciò non dovrebbe nuocere perché le pagine dei prodotti non verranno comunque memorizzate nella cache dopo l'aggiunta del blocco di checkout
Un'altra domanda è: vuoi davvero rendere le pagine dei prodotti non memorizzabili nella cache tramite la cache delle pagine integrata o Varnish?