产品视图页面上未呈现Cachable = false阻止


21

我正在使用magento2-1.0.0-beta4

我已将代码checkout.root块从复制app/code/Magento/Checkout/view/frontend/layout/checkout_index_index.xml到产品页面。

一切正常,直到启用page_cache。该块包含cacheable="false"在布局XML中。

现在,当我打开我的产品页面时,该块完全无法渲染。

如果我正确理解页面缓存,它应该通过AJAX调用加载此类块。但是似乎没有发生这样的AJAX调用,因为我的中断点\Magento\PageCache\Controller\Block\Render::execute从未被击中。

当打开/checkout//checkout/cart/一切正常。但是似乎也没有发生AJAX调用。相反,整个页面似乎都不是从缓存呈现的,这对于购物车来说是有意义的。

因此,我应该简单地从中排除产品视图页面page_cache吗?但是我没有找到方法吗?

Answers:


15

这个问题在Magento 2.0.0稳定版上仍然可以重现。

Magento 2异常处理中有一个功能,可以防止在仍然渲染所有其他块的情况下渲染损坏的块。在开发人员模式下,它被禁用,所有异常都直接显示在浏览器中。在默认模式和生产模式下,如果在块渲染期间发生异常,则将从输出中删除该块(相应的异常仍记录到var / log / system.log)。请参阅\Magento\Framework\View\Layout::renderNonCachedElement()

在产品页面上检出块呈现期间发生以下异常,这就是缺少此块的原因:main.CRITICAL: No such entity with customerId = [] []

发生此异常的原因是,会话存储中的customerLoggedIn == true客户数据在\Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXml()执行后处于不一致状态(并且客户数据丢失)。该插件关闭当前的PHP会话,从而从会话存储中删除客户数据。仅当页面是完全可缓存的(实际上是)时,才会发生这种情况。

仅当页面布局中不包含带有的块时,页面才被页面缓存模块视为可缓存cacheable="false"。添加此属性将不会使Ajax加载此块(如问题中所假定的)。要让Ajax加载某些块,该块应具有声明的属性,该属性_isScopePrivate设置为true,而且cacheable="false"页面上不应有带的块。请参阅\Magento\PageCache\Observer\ProcessLayoutRenderElement::execute()mage.pageCache._replacePlaceholder()Magento / PageCache / view / frontend / web / js / page-cache.js中。还要检查页面缓存模块自述文件中的高级文档

由于cacheable="false"已为checkout块设置了产品页面,因此该页面不可缓存,但是由于已知问题,无法缓存不可缓存的块。在解决此问题之前,可以使用以下变通办法(不要问我为什么起作用,这是一个很长的故事):

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

这不会造成危害,因为添加检出代码块后无论如何都不会缓存产品页面

另一个问题是,您是否真的要通过内置页面缓存或Varnish使产品页面不可缓存?


1
在最新的magento2版本上此问题是否有任何更新?@Alex
Keyur沙阿

亚历克斯,我只想从缓存中删除一个phtml。然后将此html文件调用到标头容器中。任何想法请告诉我
Camit1dk '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.