web-dev-qa-db-ja.com

twigテンプレートでの変数のキャッシュを防止します

私のカスタムpage.html.twigには、ユーザーの有効期限が切れた場合にページにアラートバーを追加する変数があります。これは、カスタムユーザーフィールドに基づいています。

このように、custom_theme.themeファイルに生成されます。

function custom_theme_preprocess_page(&$variables){
    $uid = \Drupal::currentUser()->id();
    $current_user = \Drupal\user\Entity\User::load($uid);
    $now =strtotime('now');
    $paidThrough = strtotime($current_user->field_expiration_date->value);
    if($paidThrough < $now){
         $variables['alert'] = 'Your account has expired';
    }
    $variables['#cache'] = [
        'max-age'  => 0,
        'contexts' => ['url.path']
    ];

}

そして、私のpage.html.twigファイル内にあります

<div class="alert">{{ alert }}</div>
<div class="main">{{ page.content }}</div>

一部のユーザーはアラートを表示しないように更新されていますが、ホームページには引き続き表示されます。別のページに移動すると、レポートは表示されなくなりますが、ホームページには常に表示されます。他のページにはキャッシュされていなかったため、他のページには表示されなくなったと思います。また、ホームページを含むこれらのページの多くに、ページマネージャとパネルプラグインを使用しています。

twig変数が認証されたユーザーのためにキャッシュされるのはなぜですか?twig変数がキャッシュされるのを防ぐ方法はありますか?

私はここで同様の投稿を見ました Twig/Drupalキャッシングと動的変数 しかし、それがどのように機能するか、またはそれを実装する方法はわかりません。

更新:$ variables ['#cache'] ['contexts'] [] = 'url';問題がありますが、これがすべてのページに表示される動的な警告ボックスである場合、それは必要ではないでしょうか?

更新2:実際に私がすでに使用していることが起こりました

$variables['#cache']['contexts'][] = 'url'; 

私のやり方でここに

$variables['#cache'] = [
    'max-age'  => 0,
    'contexts' => ['url.path']
];

しかし、それは問題を解決していないようです。 'url'と 'url.path'が異なる場合を除きます。

2
Matt

これは少し混乱しているようです。これはすでに設定されているため、ページにURLコンテキストは必要ありません。 max-age = 0の場合、他のキャッシュデータは必要ありません。メッセージが現在のユーザーに依存している場合は、ユーザーコンテキストが必要です。また、常にキャッシュデータを追加し、置換しないでください。

メッセージのブロックを使用します。現在のユーザーに依存している場合は、自動プレースホルダーにできます。次に、ページキャッシングを無効にする必要はありません。これはパフォーマンスが向上します。 https://www.drupal.org/docs/8/api/render-api/auto-placeholdering を参照してください。

1
4k4