---
title: 'Exposed-фильтры и hook_form_alter'
url: 'https://graker.ru/news/2018/06/02/exposed-filters-hook-form-alter'
language: ru
type: post
author: 'Роман Грачев'
published: '2018-06-02T16:10:00+03:00'
updated: '2018-06-02T16:16:30+03:00'
categories:
  - Программирование
  - Друпальчики
---

# 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']
```

Говорят, этому нюансу [сто лет в обед](https://www.drupal.org/project/views/issues/635242). Но сколько работаю — а вляпался в первый раз.
