Exposed-фильтры и hook_form_alter

Рассмотрим такой юз-кейс. Есть вью с картой, есть экспозид-фильтр над ним, в который можно ввести адрес для фильтрации карты, и маркеры обновятся по 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']

Говорят, этому нюансу сто лет в обед. Но сколько работаю — а вляпался в первый раз.

Комментарии