私のカスタム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'が異なる場合を除きます。
これは少し混乱しているようです。これはすでに設定されているため、ページにURLコンテキストは必要ありません。 max-age = 0の場合、他のキャッシュデータは必要ありません。メッセージが現在のユーザーに依存している場合は、ユーザーコンテキストが必要です。また、常にキャッシュデータを追加し、置換しないでください。
メッセージのブロックを使用します。現在のユーザーに依存している場合は、自動プレースホルダーにできます。次に、ページキャッシングを無効にする必要はありません。これはパフォーマンスが向上します。 https://www.drupal.org/docs/8/api/render-api/auto-placeholdering を参照してください。