私は DataObjectsAsPage モジュールを使用しています。各 $Item をループするホルダー ページに Datalist ($Items) を返します。また、ページの部分的なキャッシュ戦略を開発しようとしています。ループ内にキャッシュ ブロックを配置できないというドキュメントを読んだので、DataObjectsAsPageHolder ページに次のように記述しました。
<% cached 'items', LastEdited, CacheSegment %>
<% loop $Items %>
$Me
<% end_loop %>
<% end_cached %>
silverstripe-cache/cache ディレクトリを確認したところ、これは $Items リストをキャッシュしているようです。
問題は、CurrentMember のグループに基づいて $Item が表示可能かどうかを管理者が設定できるように、各 $Item に DataExtension を追加したことです。したがって、各 $Me テンプレート内には次のものがあります。
<% if HasAccess %>
<% end_if %>
2 つの問題があります。
上記のキャッシュ キーが与えられた場合、許可されたメンバーが最初にページを表示した場合、そのページはキャッシュされ、後続のページ ビューで非メンバーに排他的なコンテンツが表示されます。
キャッシュキーを次のように調整すると:
<% cached 'items', Items.max(Created), CacheSegment unless CurrentMember %> <% loop $Items %> $Me <% end_loop %> <% end_cached %>
次に、各 $Me テンプレートのコンテンツがメンバー用にキャッシュされることはありません。これは、私のサイトの閲覧者の最大の部分です。
メンバーと非メンバーの $Items リストをキャッシュし、ループ内で $Item の HasAccess チェックを使用できる方法はありますか?