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