Bloco com Cachable = false não processado na página de visualização do produto

21

Estou usando o magento2-1.0.0-beta4

Copiei o checkout.rootbloco app/code/Magento/Checkout/view/frontend/layout/checkout_index_index.xmlpara a página do produto.

Tudo está funcionando bem, até eu ativar o page_cache. Esse bloco está tendo cacheable="false"no XML do layout.

Agora, quando abro a página do meu produto, o bloco não é renderizado.

Se eu entendi o cache da página corretamente, ele deve carregar esses blocos por meio de uma chamada AJAX. Mas parece não ocorrer uma chamada AJAX, pois meu ponto de interrupção \Magento\PageCache\Controller\Block\Render::executenunca é atingido.

Ao abrir /checkout/ou /checkout/cart/tudo funciona. Mas também parece não ocorrer uma chamada AJAX. Em vez disso, a página inteira não parece ser renderizada no cache, o que faz sentido para o carrinho.

Então, devo simplesmente excluir a página de visualização do produto da page_cache? Mas não encontrei uma maneira de fazer isso?

Alex
fonte

Respostas:

15

Este problema ainda é reproduzível no Magento 2.0.0 Stable.

Há um recurso no tratamento de exceção do Magento 2, que impede a renderização de blocos quebrados enquanto todos os outros blocos ainda são renderizados. No modo de desenvolvedor, ele está desativado e todas as exceções são exibidas diretamente no navegador. Nos modos padrão e de produção, se ocorrer uma exceção durante a renderização do bloco, o bloco será removido da saída (a exceção correspondente ainda será registrada em var / log / system.log ). Veja \Magento\Framework\View\Layout::renderNonCachedElement().

Seguinte exceção ocorre durante o processamento do bloco de pagamento na página do produto e é por isso que este bloco está faltando: main.CRITICAL: No such entity with customerId = [] [].

O motivo dessa exceção é que os dados do cliente no armazenamento da sessão estão em estado inconsistente ( customerLoggedIn == truee faltam dados do cliente) após a \Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXml()execução. Este plug-in fecha a sessão atual do PHP e, assim, remove os dados do cliente do armazenamento da sessão. Isso acontece apenas se a página for totalmente armazenável em cache (e é realmente).

A página é considerada armazenável em cache pelo módulo de cache da página apenas se seu layout não contiver blocos cacheable="false". A adição desse atributo não fará com que esse bloco seja carregado pelo Ajax (conforme assumido na pergunta). Para ter algum bloco sendo carregado pelo Ajax, esse bloco deve ter declarado a propriedade _isScopePrivateque está definida como true, além disso, não deve haver nenhum bloco cacheable="false"na página. Veja \Magento\PageCache\Observer\ProcessLayoutRenderElement::execute()e mage.pageCache._replacePlaceholder()em Magento / PageCache / view / frontend / web / js / page-cache.js . Verifique também documentos de alto nível no leia-me do módulo de cache da página

A página do produto não deve ser armazenada em cache, pois cacheable="false"está configurada para o bloco de checkout; no entanto, é devido ao problema conhecido Blocos não acopláveis ​​sendo armazenados em cache . Até que esse problema seja resolvido, a seguinte solução alternativa pode ser usada (não me pergunte por que funciona, é uma longa história):

  1. Vamos para \Magento\Framework\Pricing\Render\Layout::__construct
  2. Mude ['cacheable' => $generalLayout->isCacheable()]para['cacheable' => false]

Isso não deve prejudicar, porque as páginas dos produtos não serão armazenadas em cache de qualquer maneira após a adição do bloco de pagamento

Outra pergunta é: você realmente deseja tornar as páginas de produtos não armazenáveis ​​em cache pelo cache de páginas interno ou pelo Verniz?

Alex Paliarush
fonte
1
Alguma atualização para esta edição na versão mais recente do magento2? @Alex
Keyur Shah
Alex, só quero remover um phtml do cache. e esse arquivo html chama no contêiner de cabeçalho. alguma idéia por favor me avise
Camit1dk