Drupal 8には2つの形式があり、値にifを事前に入力しています。クエリ文字列に値が存在します。
$keywords = Xss::filter($this->requestStack->getCurrentRequest()->get('keywords'));
$form['keywords'] = [
'#type' => 'textfield',
'#maxlength' => 128,
'#size' => 64,
'#default_value' => Unicode::strlen($keywords) ? $keywords : '',
'#prefix' => '<div class="search-box__input js-search-input">',
'#suffix' => '</div>',
'#required' => TRUE,
'#attributes' => [
'placeholder' => Unicode::strlen($keywords) ? $keywords : t('Search Site'),
]
];
認証されたユーザーには効果的ですが、匿名ユーザーの場合、クエリ文字列にURLが含まれていないにもかかわらず、最後に入力された用語が常に表示されます。ブラウザを閉じて戻ってきても、用語は入力フィールドに残っています。キャッシュされると思います。
フォームは、他のコンテンツを含むブロックにtwig変数として添付されています。
/**
* Implements hook_preprocess_block().
* @param $variables
*/
function mytheme_preprocess_block(&$variables) {
if (isset($variables['elements']['content']['#block_content'])) {
$variables['block_content'] = $variables['elements']['content']['#block_content'];
}
// inject main nav search form to block template for main_nav only
if ($variables['elements']['#id'] == 'main_nav') {
$variables['main_nav_search_form'] = \Drupal::formBuilder()->getForm('\Drupal\mymodule_search_forms\Form\MainNavSearchForm');
}
}
これを起こさないように変更する方法はありますか?使用できるキャッシュタグはありますか?
あなたがする必要があるのは、キャッシュタグではなくキャッシュコンテキストを使用することです。特定のシナリオでは、url.query_args:keywords
を使用します。このようなコードで
$form['keywords'] = [
'#cache' => ['contexts' => ['url.query_args:keywords']],
...
];
キャッシュタグは、キャッシュを無効にするために使用されます。キャッシュ要素にnode:1
のタグが付けられ、nid 1のノードが更新される場合と同様に、node:1
キャッシュタグを含むすべてのキャッシュが無効化されます(他のタグも無効化されます)。
キャッシュcontextsは、クエリの引数などに基づいて、キャッシュされた要素が複数のバリエーションで存在する場合に使用されます。何が起こるかというと、複数のキャッシュエントリが作成され、それらはすべて同じロジック(キャッシュタグ)に基づいて無効になります。