Block with Cachable = false non visualizzato nella pagina di visualizzazione del prodotto


21

Sto usando magento2-1.0.0-beta4

Ho copiato il checkout.rootblocco dalla app/code/Magento/Checkout/view/frontend/layout/checkout_index_index.xmlpagina del prodotto.

Tutto funziona bene, fino a quando abilito il page_cache. Quel blocco si trova cacheable="false"nel layout XML.

Ora, quando apro la pagina del mio prodotto, il blocco non viene reso affatto.

Se ho compreso correttamente la cache della pagina, dovrebbe caricare tali blocchi tramite una chiamata AJAX. Ma non sembra accadere una chiamata AJAX in quanto il mio punto di interruzione \Magento\PageCache\Controller\Block\Render::executenon viene mai raggiunto.

All'apertura /checkout/o /checkout/cart/tutto funziona. Ma sembra anche che non accada una chiamata AJAX. Invece l'intera pagina non sembra essere resa dalla cache, il che ha senso per il carrello.

Quindi dovrei semplicemente escludere la pagina di visualizzazione del prodotto dal page_cache? Ma non ho trovato il modo di farlo?

Risposte:


15

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 == truee 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à _isScopePrivateche è 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):

  1. Vai a \Magento\Framework\Pricing\Render\Layout::__construct
  2. 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?


1
Eventuali aggiornamenti per questo problema sull'ultima versione di magento2? @Alex
Keyur Shah,

Alex, voglio solo rimuovere un phtml dalla cache. e questo file html chiama nel contenitore dell'intestazione. qualsiasi idea per favore fatemelo sapere
Camit1dk,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.