Вы здесь

Views: Подменять значение фильтра на этапе подготовки

1

Что имеется:

  • Views, в котором создан вывод пользователей сайта.
  • В этом views есть связь пользователя с profile2.
  • В profile2 имеется поле entityreference которое позволяет указать связь с сущность node типа компании.
  • В views стоит exposed filter по этому полю.

Проблема: Поле фильтрует по ID сущности (обычное поведение для entityreference). Но юзеры не знают ID компаний, и следовательно, я написал autocomplete, который при выборе компании вставляет её id в поле - но это не очень удобно и понятно для юзеров. Следовательно, есть цель сделать чтобы автокомплит вставлял "Название компании (id)" (по аналогии с автокомплитом entityreference). Сделать то не проблема, проблема ждет в views, который ждет id. Вопрос: Если я буду слать "Название компании (id)", на каком хуке вьюсов я могу внедриться и заменить эту строку на просто id?

Я пробовал хуки hook_views_pre_view, hook_views_pre_build, hook_views_post_build, hook_views_pre_execute - не очень то и помогло. Значение имеется, но замена ничего не делает. Отрабатывает с оригинальным, тем что ушло из формы.

Пробовал и следующее:

$filters = $view->display_handler->get_option('filters');
$filters['field_profile_company_target_id']['value']['value'] = 8667;
$view->display_handler->set_option('filters', $filters);

Оно отрабатывает, но заменяет в раскрытом фильтре "Название компании (id)" на id. Т.е. получается id вставляется в поле не после выбора автокомплита, а уже после самой генерации новой выдачи. Что не особо то и меняет положение дел.

По факту же нужно чтобы views в запросе в condition вставлял не "Название (id)" а просто "id". Где мне можно так запрос грамотно подкорректировать?

Или я занимаюсь извращением каким-то и проще вообще Search API включить и не мучиться? А там просто также автокомплит к полю подцепить делов не долго.

Версия Drupal: 
7.x
Категория: 
Database APIForm API
Связанные проекты: 
Views
Вопрос задан 05.09.2015 - 17:15
Аватар пользователя Niklan
Niklan
424

Ответы

5
function modulename_form_views_exposed_form_alter(&$form, &$form_state) {
  array_unshift($form['#submit'], 'modulename_mysubmit');
}
function modulename_mysubmit($form, &$form_state) {
  $form_state['values']['имя фильтра'] = новое_значение;
}
Ответ дан 06.09.2015 - 00:38
Аватар пользователя xandeadx
xandeadx
1351

То что нужно! Спасибо, сработало. Я так понимаю тут вся хитрость в array_unshift. Ибо то же самое без него не работало.

Комментарий оставлен 06.09.2015 - 04:18
1

Надо добавить relationship на связанную ноду и сделать exposed фильтр с помощью Views Autocomplete Filters .
В этом видео как раз есть пример с entityreference.

Ответ дан 05.09.2015 - 19:34
Аватар пользователя Chi
Chi
54