Рейтинг:2

Кэширование идентификатора узла на hook_form_alter()

флаг in

У меня есть веб-форма с полем электронной почты. Я встраиваю веб-форму в каждый узел с полем на узле для адреса электронной почты.

я реализовал крючок_form_alter() в моем файле .theme, который загружает узел, используя $node = \Drupal::routeMatch()->getParameter('node');.

Затем я могу загрузить узел, получить правильный адрес электронной почты и установить его в веб-форме. Проблема в том, что узел кэшируется для анонимных пользователей. Неважно, на каком узле я нахожусь, $узел->идентификатор() всегда возвращает один и тот же кэшированный идентификатор узла.

Я пробовал обе эти строки, но идентификатор узла все тот же.

\Drupal::service('page_cache_kill_switch')->trigger();
$vars['#cache']['max-age'] = 0;

Я понимаю, что мне нужно очистить теги кеша и контекст кеша, но ни один из примеров не показывает, как именно это сделать в крючок_form_alter().

Как правильно очистить кеш?

Рейтинг:5
флаг cn

Когда вы получаете параметры маршрута, вам нужен этот контекст кеша:

$form['#cache']['contexts'][] = 'route';

Вы также можете добавить данные кэша узла, чтобы форма становилась недействительной при сохранении узла с другим значением поля:

$renderer = \Drupal::service('renderer');
$renderer->addCacheableDependency($form, $node);

Контекст кеша применяется к форме и всем элементам страницы, в которые помещена форма. Таким образом, это работает независимо от того, куда вы встраиваете форму.

Если форма встроена в узел, получение узла из совпадения маршрута, вероятно, не лучшая идея. Вы должны использовать узел или идентификатор узла в качестве параметра при вызове формы. Затем вы можете попробовать ответ @sonfd, потому что вам не нужны отдельные ключи кеша для узла и веб-формы.

флаг in
Вот что сделал. Спасибо большое!! $form['#cache']['contexts'][] = 'route';
Рейтинг:3
флаг in

Проблема в том, что веб-форма кэшируется с данными $node с первого посещенного узла, но вам нужно, чтобы веб-форма была уникальной для каждого узла.

Вы можете отключить ключи кеша для своей веб-формы — это предотвратит кеширование веб-формы само по себе, но по-прежнему позволит кэшировать веб-форму с ее родителем (узлом), при этом все метаданные кеша веб-формы всплывают.

В вашей hook_form_FORM_ID_alter() (тот, который вы используете для установки адреса электронной почты), вы можете отключить ключи кеша, например:

если (isset($form['#cache']['keys']) {
  unset($form['#cache']['keys']);
}

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.