Bu sorun Magento 2.0.0 Kararlı üzerinde hala yeniden üretilebilir.
Magento 2 istisna işlemlerinde, diğer tüm bloklar hala oluşturulmuşken kırık blokların oluşturulmasını önleyen bir özellik vardır. Geliştirici modunda devre dışı bırakılır ve tüm istisnalar doğrudan tarayıcıda görüntülenir. Varsayılan ve üretim modlarında, blok oluşturma sırasında kural dışı durum oluşursa, blok çıktıdan kaldırılır (karşılık gelen istisna hala var / log / system.log dosyasına kaydedilir ). Bakın \Magento\Framework\View\Layout::renderNonCachedElement()
.
Aşağıdaki istisna ürün sayfasında ödeme blok oluşturma sırasında ortaya çıkan ve bu blok eksik yüzden: main.CRITICAL: No such entity with customerId = [] []
.
Bunun istisnasının nedeni, oturum deposundaki customerLoggedIn == true
müşteri verilerinin \Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXml()
yürütmeden sonra tutarsız durumda olması ( ve müşteri verilerinin eksik olması) . Bu eklenti mevcut PHP oturumunu kapatır ve böylece müşteri verilerini oturum depolama alanından kaldırır. Bu yalnızca sayfa tamamen önbelleğe alınabiliyorsa gerçekleşir (ve aslında öyleyse).
Sayfa, sayfa düzeni önbellek modülü tarafından yalnızca düzeninde bloklar yoksa, önbelleklenebilir olarak kabul edilir cacheable="false"
. Bu özelliğin eklenmesi bu bloğu Ajax tarafından yükleyemez (soruda belirtildiği gibi). Ajax tarafından bir bloğun yüklenebilmesi için, bu bloğun , sayfada _isScopePrivate
ayarlanmış true
hiçbir blok bulunmaması gereken bir özellik olduğunu beyan etmesi gerekir cacheable="false"
. Bkz \Magento\PageCache\Observer\ProcessLayoutRenderElement::execute()
ve mage.pageCache._replacePlaceholder()
içinde Magento / PageCache / görünüm / kullanıcı arayüzü / web / js / sayfa cache.js . Ayrıca sayfa önbellek modülü benioku sayfasındaki üst düzey belgeleri kontrol edin
Ürün sayfası, cacheable="false"
ödeme bloğu için ayarlandığından önbelleklenmemelidir , ancak bilinen sorun nedeniyle Önbelleklenebilir olmayan blokların önbelleğe alınması . Bu sorun çözülene kadar , aşağıdaki geçici çözüm kullanılabilir (bana neden işe yaradığını sorma, uzun bir hikaye):
- Git
\Magento\Framework\Pricing\Render\Layout::__construct
- Değişim
['cacheable' => $generalLayout->isCacheable()]
için['cacheable' => false]
Bu zarar vermemelidir, çünkü ürün sayfaları ödeme bloğu ekledikten sonra herhangi bir şekilde önbelleğe alınmaz
Başka bir soru, ürün sayfalarını yerleşik sayfa önbelleği veya Vernik ile önbelleğe alınamaz hale getirmek istiyor musunuz?