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 == true
e 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 _isScopePrivate
que 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):
- Vamos para
\Magento\Framework\Pricing\Render\Layout::__construct
- 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?