Masalah ini masih dapat direproduksi di Magento 2.0.0 Stable.
Ada fitur dalam penanganan perkecualian Magento 2, yang mencegah rendering dari blok yang rusak sementara semua blok lainnya masih dirender. Dalam mode pengembang itu dinonaktifkan dan semua pengecualian ditampilkan langsung di browser. Dalam mode default dan produksi, jika pengecualian terjadi selama rendering blok, blok hanya akan dihapus dari output (pengecualian yang sesuai masih masuk ke var / log / system.log ). Lihat \Magento\Framework\View\Layout::renderNonCachedElement()
.
Berikut pengecualian terjadi selama checkout blok render pada halaman produk dan itulah sebabnya blok ini hilang: main.CRITICAL: No such entity with customerId = [] []
.
Alasan pengecualian ini adalah bahwa data pelanggan dalam penyimpanan sesi dalam keadaan tidak konsisten ( customerLoggedIn == true
dan data pelanggan tidak ada) setelah \Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXml()
eksekusi. Plugin ini menutup sesi PHP saat ini dan dengan demikian menghapus data pelanggan dari penyimpanan sesi. Ini terjadi hanya jika halaman sepenuhnya dapat di-cache (dan memang benar).
Halaman dianggap dapat disimpan oleh modul cache halaman hanya jika tata letaknya tidak berisi blok cacheable="false"
. Menambahkan atribut ini tidak akan membuat blok ini dimuat oleh Ajax (seperti yang diasumsikan dalam pertanyaan). Untuk memiliki beberapa blok yang dimuat oleh Ajax, blok ini seharusnya memiliki properti _isScopePrivate
yang ditetapkan true
, apalagi, seharusnya tidak ada blok dengan cacheable="false"
di halaman. Lihat \Magento\PageCache\Observer\ProcessLayoutRenderElement::execute()
dan mage.pageCache._replacePlaceholder()
di Magento / PageCache / view / frontend / web / js / page-cache.js . Juga periksa dokumen tingkat tinggi dalam readme modul cache halaman
Halaman produk tidak boleh di-cache karena cacheable="false"
diatur untuk blok checkout, namun hal itu, karena masalah yang diketahui Blok yang tidak dapat di-cache sedang di-cache . Sampai masalah ini teratasi, solusi berikut dapat digunakan (jangan tanya saya mengapa ini berhasil, ini adalah cerita yang panjang):
- Pergi ke
\Magento\Framework\Pricing\Render\Layout::__construct
- Ubah
['cacheable' => $generalLayout->isCacheable()]
ke['cacheable' => false]
Ini seharusnya tidak merugikan karena halaman produk tidak akan di-cache setelah menambahkan blok checkout
Pertanyaan lain adalah, apakah Anda benar-benar ingin membuat halaman produk tidak dapat di-cache dengan cache halaman bawaan atau Varnish?