この問題は、Magento 2.0.0 Stableでも再現可能です。
Magento 2の例外処理には、他のすべてのブロックがまだレンダリングされている間に破損したブロックのレンダリングを防ぐ機能があります。開発者モードでは無効になり、すべての例外がブラウザーに直接表示されます。デフォルトおよび本番モードでは、ブロックのレンダリング中に例外が発生した場合、ブロックは出力から削除されます(対応する例外はvar / log / system.logに引き続き記録されます)。をご覧ください\Magento\Framework\View\Layout::renderNonCachedElement()
。
製品ページでのチェックアウトブロックのレンダリング中に次の例外が発生するため、このブロックがありません:main.CRITICAL: No such entity with customerId = [] []
。
この例外の理由は、実行customerLoggedIn == true
後にセッションストレージ内の顧客データが一貫性のない状態になっている(および顧客データが欠落している)ため\Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXml()
です。このプラグインは現在のPHPセッションを閉じ、セッションストレージから顧客データを削除します。これは、ページが完全にキャッシュ可能である場合にのみ発生します(実際にキャッシュ可能です)。
ページは、レイアウトにのブロックが含まれていない場合にのみ、ページキャッシュモジュールによってキャッシュ可能と見なされますcacheable="false"
。この属性を追加しても、このブロックはAjaxによって読み込まれません(質問で想定されているとおり)。Ajaxによってブロックがロードされるようにするには、このブロックにに_isScopePrivate
設定されたプロパティを宣言true
する必要がcacheable="false"
あります。さらに、ページ上にブロックが存在しないようにする必要があります。参照してください\Magento\PageCache\Observer\ProcessLayoutRenderElement::execute()
とmage.pageCache._replacePlaceholder()
でMagentoの/ページキャッシュ/ビュー/フロントエンド/ウェブ/ JS /ページ-cache.js。ページキャッシュモジュールのreadmeで高レベルのドキュメントも確認してください。
製品ページはcacheable="false"
チェックアウトブロックに設定されているためキャッシュ可能にすべきではありませんが、既知の問題であるキャッシュ不可ブロックがキャッシュされるためです。この問題が解決するまで、次の回避策を使用できます(なぜ機能するのか聞かないでください。長い話です)。
- に行く
\Magento\Framework\Pricing\Render\Layout::__construct
- 変更
['cacheable' => $generalLayout->isCacheable()]
へ['cacheable' => false]
チェックアウトブロックの追加後も製品ページはキャッシュされないため、これは害になりません。
もう1つの質問は、組み込みのページキャッシュまたはVarnishによって、製品ページをキャッシュ不可にしたいのですか?