web-dev-qa-db-ja.com

Twig / Drupalキャッシングと動的変数

最近の記事のリストと記事自体を含むテンプレートがあります。現在表示されている記事がそこにあるかどうか、最新の記事のリストをチェックインしたい場合は、divにクラスを追加します。これは開発環境ではすべて正常に機能しますが、キャッシュをオンにするとすぐに問題が発生します。クラスは、アクティブなアイテムに切り替えるのではなく、1つのアイテムにスタックしています。

どうすればこれを解決できますか?

私のテンプレート:

<a class="news-block {{ node.id == current_id ? 'news-block--active' : '' }}" href="{{ url }}">
    ...
</a>

私の前処理:

function theme_preprocess_article(array &$variables) {
    $currentNode = \Drupal::routeMatch()->getParameter('node');
    $variables['current_id'] = $currentNode->get('nid')->getValue()[0]['value'];
}
3
Sketchy Coder

私の理解では、これは同じURLで変化しないので、page_cacheとdynamic_page_cacheの両方で問題ないはずです。ただし、各ノードも独自にキャッシュされるため、ここで問題になります。

4k4がコメントで言ったように、これでキャッシュを変更できるはずです:$variables['#cache']['contexts'][] = 'url'

ただし、すべてのノードでページごとに異なる方法でキャッシュする必要があることを意味し、キャッシュテーブルをいっぱいにする非常に多くのバリエーションが発生するため、これはかなり問題です。

特定のノードのノードページにいるかどうかについて、独自のキャッシュコンテキストを定義できます。コアは実際にそのためのキャッシュコンテキストを提供する必要があります。たとえば、 node/Nページ以外の場所でデフォルトの表示モードを使用します。しかし、そうではなく、そのための未解決の問題があります。

前述のように、最も簡単な修正はおそらくこれにJSを使用することです。

4
Berdir