私のノードの前処理関数で、クエリパラメータの値を確認します...
$variables['exclude_urls'] = \Drupal::request()->get('exclude_urls');
そして、私のテンプレートには...
{% if not exclude_urls %}
<div class="gr-url">{{ url }}</div>
{% endif %}
ただし、「exclude_urls」パラメーターの値以外にURLで何も変更されない場合、ノードの前処理関数が起動しないため、このアプローチは機能しません。
ページのキャッシュを無効にするさまざまな方法を試しました。これをルートに追加しても機能しません...
options:
no_cache: 'TRUE'
私はコントローラーでpage_cache_kill_switchも使用しようとしましたが、機能しません...
\Drupal::service("page_cache_kill_switch")->trigger();
キャッシュコンテキストにクエリパラメータを追加することもしません...
$element['#cache']['contexts'][] = 'url.query_args:exclude_urls';
Hook_preprocess_nodeを使用する代わりに、$ _ GET ['exclude_urls']の値を確認し、それをテンプレートに渡す方法は他にありますか? twigテンプレート自体にコードを追加して、 'exclude_urls'の値を確認しますか?毎回hook_preprocess_nodeを強制的に実行する確実な方法はありますか?コンテンツの表示を調整する通常のアプローチは何ですか?キャッシュが干渉しないように、URLクエリパラメータに基づいていますか?
更新:明確にするために、私は上記のアプローチを組み合わせて試みましたが、成功しませんでした。たとえば、コントローラーのページ機能の最後は次のようになります...
\Drupal::service("page_cache_kill_switch")->trigger();
$element['#cache']['contexts'][] = 'url.query_args:exclude_urls';
return $element;
pdate 2:私のローカル開発サイトでは、この問題は発生していません。ローカル設定のこの行が原因で、hook_preprocess_nodeが毎回起動することがわかりました...
$settings['cache']['bins']['render'] = 'cache.backend.null';
ただし、一般的にレンダーキャッシュを無効にしたくないので、本番サイトでこれを利用する方法がわかりません。私はsettings.phpでこのようなことをすることができますが、それはハックです:
$parts = explode('?', $_SERVER['REQUEST_URI'], 2);
if ('/disable/cache/at/this/path' == $parts[0]) {
$settings['cache']['bins']['render'] = 'cache.backend.null';
}
レンダリングされたコンテンツをキャッシュできる3つのレイヤーがあります。
それぞれに対応するキャッシュビンがあり、開発中にsettings.php
で無効にすることができます。
hook_preprocess
に追加のキャッシュコンテキストを設定して、ダイナミックページキャッシュがそのフラグメントを再レンダリングし、必要に応じてレンダーキャッシュにバリアントを保存できるようにするには、#cache
変数を更新します。
function hook_preprocess_HOOK(&$variables) {
$variables['#cache']['contexts'][] = 'url.query_args:exclude_urls';
}