Ten problem jest nadal powtarzalny w Magento 2.0.0 Stabilny.
W obsłudze wyjątków Magento 2 jest funkcja, która zapobiega renderowaniu uszkodzonych bloków, podczas gdy wszystkie inne bloki są nadal renderowane. W trybie programisty jest wyłączony, a wszystkie wyjątki są wyświetlane bezpośrednio w przeglądarce. Jeśli w trybach domyślnym i produkcyjnym wystąpi wyjątek podczas renderowania bloku, blok zostanie po prostu usunięty z wyjścia (odpowiedni wyjątek jest nadal rejestrowany w pliku var / log / system.log ). Zobaczyć \Magento\Framework\View\Layout::renderNonCachedElement().
Następujący wyjątek występuje podczas zamawiania renderowania bloku na stronie produktu i dlatego ten blok brakuje: main.CRITICAL: No such entity with customerId = [] [].
Powodem tego wyjątku jest to, że dane klienta w pamięci sesji są niespójne ( customerLoggedIn == truea danych klienta brakuje) po \Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXml()wykonaniu. Ta wtyczka zamyka bieżącą sesję PHP i tym samym usuwa dane klientów z pamięci sesji. Dzieje się tak tylko wtedy, gdy strona jest w pełni buforowalna (a tak naprawdę jest).
Strona jest uznawana za buforowalną przez moduł pamięci podręcznej strony tylko wtedy, gdy jej układ nie zawiera bloków z cacheable="false". Dodanie tego atrybutu nie spowoduje załadowania tego bloku przez Ajax (zgodnie z założeniem w pytaniu). Aby Ajax ładował jakiś blok, ten blok powinien mieć zadeklarowaną właściwość, _isScopePrivatektóra jest ustawiona na true, ponadto, na stronie nie powinno być żadnych bloków cacheable="false". Zobacz \Magento\PageCache\Observer\ProcessLayoutRenderElement::execute()i mage.pageCache._replacePlaceholder()w Magento / PageCache / view / frontend / web / js / page-cache.js . Sprawdź także dokumenty wysokiego poziomu w pliku Readme modułu pamięci podręcznej strony
Strona produktu nie powinna być buforowalna, ponieważ cacheable="false"jest ustawiona na blok kasy, jednak tak jest ze względu na znany problem . Nie buforowane bloki są buforowane . Do czasu rozwiązania tego problemu można zastosować następujące obejście (nie pytaj mnie, dlaczego to działa, to długa historia):
- Iść do
\Magento\Framework\Pricing\Render\Layout::__construct
- Zmień
['cacheable' => $generalLayout->isCacheable()]na['cacheable' => false]
Nie powinno to zaszkodzić, ponieważ strony produktu i tak nie będą buforowane po dodaniu bloku kasy
Kolejne pytanie brzmi: czy naprawdę chcesz, aby strony produktów nie były buforowane przez wbudowaną pamięć podręczną stron lub Lakier?