Рассмотрим такой юз-кейс. Есть вью с картой, есть экспозид-фильтр над ним, в который можно ввести адрес для фильтрации карты, и маркеры обновятся по ajax. Обычное дело.
И есть сторонняя форма на других страницах сайта, в которую тоже можно ввести адрес — и она тогда положит его в query
и редиректнет на страницу с фильтром. А вьюшка значение для фильтрации — если его нет в exposed-форме — подхватит из query. И вот хочется, чтобы в exposed-фильтре тогда тоже значение из query появилось. Ну просто, для порядку.
Так-то экспозид-фильтры свои значения тоже в query кладут, но я ajax включил сразу и об этом забыл. Поэтому полез в hook_form_alter()
. В голову приходит конечно, что #default_value
у элемента надо поменять — и всё. Но оказывается, для экспозид-форм это не работает. Оказывается, у них дефолтные значения живут в другом месте и надо делать вот так:
function mymodule_form_alter(
&$form,
\Drupal\Core\Form\FormStateInterface $form_state,
$form_id
) {
// ...
$form_state->setUserInput(['field_zip_postal_code_value' => $value_from_query]);
// ...
}
Здесь field_zip_postal_code_value
— это id фильтра.
А чтобы проверить, есть ли там уже какое-нибудь дефолтное значение:
$form_state->getUserInput()['field_zip_postal_code_value']
Говорят, этому нюансу сто лет в обед. Но сколько работаю — а вляпался в первый раз.