製品ビューページにレンダリングされないCachable = falseのブロック


21

magento2-1.0.0-beta4を使用しています

checkout.rootブロックをapp/code/Magento/Checkout/view/frontend/layout/checkout_index_index.xml製品ページにコピーしました。

を有効にするまで、すべて正常に動作していpage_cacheます。そのブロックはcacheable="false"、レイアウトXMLに含まれています。

製品ページを開くと、ブロックはまったくレンダリングされません。

ページキャッシュを正しく理解していれば、AJAX呼び出しを介してそのようなブロックをロードするはずです。しかし、私のブレークポイントに到達することはないので、このようなAJAX呼び出しは発生しないようです\Magento\PageCache\Controller\Block\Render::execute

開くとき、/checkout/または/checkout/cart/すべてが機能するとき。しかし、AJAX呼び出しも発生していないようです。代わりに、ページ全体がキャッシュからレンダリングされていないように見えるため、カートにとって意味があります。

だから、単に製品ビューページを除外する必要がありpage_cacheますか?しかし、私はそうする方法を見つけませんでしたか?

回答:


15

この問題は、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"チェックアウトブロックに設定されているためキャッシュ可能にすべきではありませんが、既知の問題であるキャッシュ不可ブロックがキャッシュされるためです。この問題が解決するまで、次の回避策を使用できます(なぜ機能するのか聞かないでください。長い話です)。

  1. に行く \Magento\Framework\Pricing\Render\Layout::__construct
  2. 変更['cacheable' => $generalLayout->isCacheable()]['cacheable' => false]

チェックアウトブロックの追加後も製品ページはキャッシュされないため、これは害になりません。

もう1つの質問は、組み込みのページキャッシュまたはVarnishによって、製品ページをキャッシュ不可にしたいのですか?


1
最新のmagento2バージョンでのこの問題の更新はありますか?@アレックス
・シャー

アレックス、私は1つのphtmlをキャッシュから削除したいだけです。このhtmlファイルはヘッダーコンテナーを呼び出します。任意のアイデアを教えてください
Camit1dk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.