Bloquear con Cachable = false no representado en la página de vista del producto

21

Estoy usando magento2-1.0.0-beta4

Copié el checkout.rootbloque de app/code/Magento/Checkout/view/frontend/layout/checkout_index_index.xmlla página del producto.

Todo funciona bien, hasta que habilite el page_cache. Ese bloque está teniendo cacheable="false"en el diseño XML.

Ahora, cuando abro la página de mi producto, el bloque no se representa en absoluto.

Si entendí correctamente el caché de la página, debería cargar dichos bloques a través de una llamada AJAX. Pero no parece suceder una llamada AJAX como mi punto de interrupción \Magento\PageCache\Controller\Block\Render::executenunca se alcanza.

Al abrir /checkout/o /checkout/cart/todo funciona. Pero tampoco parece ocurrir una llamada AJAX. En cambio, toda la página no parece representarse desde el caché, lo que tiene sentido para el carrito.

Entonces, ¿debería simplemente excluir la página de vista del producto de page_cache? ¿Pero no encontré una manera de hacerlo?

Alex
fuente

Respuestas:

15

Este problema aún es reproducible en Magento 2.0.0 Estable.

Hay una característica en el manejo de excepciones de Magento 2, que evita la representación de bloques rotos mientras que todos los demás bloques aún se representan. En modo desarrollador está deshabilitado y todas las excepciones se muestran directamente en el navegador. En los modos predeterminado y de producción, si se produce una excepción durante la representación del bloque, el bloque simplemente se eliminará de la salida (la excepción correspondiente todavía se registra en var / log / system.log ). Ver \Magento\Framework\View\Layout::renderNonCachedElement().

Después de excepción se produce durante el pago bloque de renderizado en la página del producto y es por eso que este bloque es que falta: main.CRITICAL: No such entity with customerId = [] [].

La razón de esta excepción es que los datos del cliente en el almacenamiento de la sesión están en un estado inconsistente ( customerLoggedIn == truey faltan datos del cliente) después de la \Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXml()ejecución. Este complemento cierra la sesión PHP actual y, por lo tanto, elimina los datos del cliente del almacenamiento de la sesión. Esto sucede solo si la página es completamente almacenable en caché (y en realidad lo es).

El módulo de caché de página considera que la página se puede almacenar en caché solo si su diseño no contiene bloques con cacheable="false". Agregar este atributo no hará que este bloque sea cargado por Ajax (como se supone en la pregunta). Para que Ajax cargue algún bloque, este bloque debe haber declarado la propiedad _isScopePrivateque se establece en true, además, no debe haber bloques con cacheable="false"en la página. Ver \Magento\PageCache\Observer\ProcessLayoutRenderElement::execute()y mage.pageCache._replacePlaceholder()en Magento / PageCache / view / frontend / web / js / page-cache.js . También verifique documentos de alto nivel en el archivo Léame del módulo de caché de página

La página del producto no debe ser almacenable en caché, ya que cacheable="false"está configurada para el bloque de pago, sin embargo, lo es, debido a un problema conocido . Hasta que se resuelva este problema, se puede utilizar la siguiente solución alternativa (no me pregunte por qué funciona, es una larga historia):

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

Esto no debería dañar porque las páginas del producto no se almacenarán en caché de todos modos después de agregar el bloque de pago

Otra pregunta es, ¿realmente desea que las páginas de productos no se puedan almacenar en caché mediante el caché de páginas incorporado o el barniz?

Alex Paliarush
fuente
1
¿Alguna actualización para este problema en la última versión de magento2? @Alex
Keyur Shah
Alex, solo quiero eliminar un phtml del caché. y este archivo html llama al contenedor de encabezado. alguna idea por favor hágamelo saber
Camit1dk