Необычный фильтр во views

Главные вкладки

Аватар пользователя abutan abutan 15 июня 2015 в 21:38

Здравствуйте всем.
Мне нужно сделать фильтр во views для фильтрации содержимого по нескольким текстовым полям с авто дополняемой строкой.
Само по себе ничего особенного. Но заказчик хочет что бы перед полем ввода был селект, в котором можно выбрать по какому именно полю будет идти фильтрация. То есть, например, фильтрация идет по полям 1, 2, 3 . В селекте выбирается поле 2 и в авто дополняемой строке выбор значений должен идти только по полю 2. Ну и, соответственно, по другим полям такой же замысел.

Подскажите пожалуйста как можно реализовать такой фильтр или по какому принципу это все делать.
Буду рад любой помощи.

Комментарии

Аватар пользователя sasha_gar sasha_gar 15 июня 2015 в 21:47

три текстовых поля. в template.php подхватываете форму. добавлЕте селект. и тут дописываете js. в зависимости от селекта показываете соответствующее поле. первый способ которфй пришел в голову. без jsвроде никак.

Аватар пользователя Orion76 Orion76 15 июня 2015 в 22:10

"sasha_gar" wrote:
три текстовых поля.

Согласен.

"sasha_gar" wrote:
template.php подхватываете форму

лучше HOOK_form_FORM_ID_alter
FORM_ID можно подсмотреть в html в браузере, что-то типа такого
<input type="hidden" name="form_id" value="field_ui_field_overview_form">

"sasha_gar" wrote:
без jsвроде никак

как (#states):

http://xandeadx.ru/blog/drupal/319

Аватар пользователя Orion76 Orion76 15 июня 2015 в 22:16

"sasha_gar" wrote:
без jsвроде никак.

Хотя на самом деле есть один нюанс..
Перед фильтрацией, скрытые поля надо очищать, если пользователь уже фильтровал выборку по ним.
Тут js понадобиться..

Аватар пользователя Orion76 Orion76 15 июня 2015 в 22:22

"orion76" wrote:
Тут js понадобиться..

А может и не понадобиться, если на validate формы повесить свой обработчик, и очищать скрытые поля(которые не выбраны в селекте) в нем.

Аватар пользователя abutan abutan 17 июня 2015 в 18:44

Здравствуйте всем.
Попытался сделать как посоветовали.
Селект со значениями из которых надо выбирать добавил без проблем. Прикрутил свою функцию валидации прямо в hook_form_alter через $form['#validate'][] = 'название моей функции'.
Проблема в том что не могу понять, что значит очистить значение поля(ну тех полей которые не выбраны).
Ну например я пишу if($form_state['values']['select_field'] == 'значение 1'){
и вот здесь у меня наступает ступор
}
Не могу понять что нужно сделать.
И еще возникает другая проблема. При подключении функции валидации ломается работа авто дополняемого поля. Поле как бы работает, вводишь букву значения выбираются, выпадает поле с этими значениями и тут же закрывается вместо того чтобы стоять и ждать когда я выберу что мне нужно.

Подскажите пожалуйста что значит очистить поля. И почему перестали работать автодополнения.

Аватар пользователя Orion76 Orion76 17 июня 2015 в 20:28

"abutan" wrote:
Подскажите пожалуйста что значит очистить поля.

Все очень просто.
Есть 3 поля, фильтрацию по которым надо производить раздельно:
или по полю 1
или по полю 2
или по полю 3

селектом пользователь выбирает, по какому полю ему надо отфильтровать выборку.
Если он сначала ввел значение в поле 1, а потом переключился на поле 2 и снова ввел значение фильтрации, то в сабмит формы придут значения всех полей и фильтрация будет производиться по всем полям, а это, как я понимаю не нужно и даже вредно-).

Поэтому при валидации формы необходимо проверить по значению селекта, какое поле выбрал для фильтрации пользователь, а значения остальных полей "очистить".
скорее всего как-то так:

<?php
// Имя поля, выбранного в селекте пользователем.
// Естественно, #options селекта должен содержать список имен полей фильтрации
// array('имя поля 1'=>t('тайтл поля 1'),'имя поля 2'=>t('тайтл поля 2')...);
$needed_field=$form_state['values']['имя поля селекта'];
$filter_fields=array('имя поля 1','имя поля 2','имя поля 3');
foreach(
$filter_fields as $name){
// Если это имя ненужного поля
if($name !== $needed_field){
// Очищаем его значение, чтобы выборка по нему не фильтровалась
// Для пустого текстового поля это скорее всего должна быть "пустая строка" - ''
$form_state['values'][$name]='';
}
}

?>

"abutan" wrote:
И почему перестали работать автодополнения.

На прямую, дополнительная валидация формы на автокомплит влиять не должна.
проверте ошибки-предупреждения в функции валидации (в логах php или/и журнале Drupal)

Аватар пользователя abutan abutan 17 июня 2015 в 21:16

Прошу простить мою непонятливость.
Получается что в options в имя поля ('имя поля 1'=>t('тайтл поля 1') надо писать машинное имя нужного поля?
и тогда в $form_state['values']['имя поля'] = '' мы обнуляем значения поля.
Или я опять не так понимаю?
С авто дополнением разобрался. Я включил автоматическую отправку и форма пыталась отправиться по первой букве.

И еще вопрос. Дело в ом что в этой же вьюхе мне надо сделать еще один фильтр.
Он становиться почему то в ту же форму как элемент формы и фильтры косят работу друг друга. А можно ли сделать что бы эти фильтры работали независимо друг от друга?

Аватар пользователя Orion76 Orion76 18 июня 2015 в 6:23

"abutan" wrote:
Получается что в options в имя поля ('имя поля 1'=>t('тайтл поля 1') надо писать машинное имя нужного поля?

Да.. так же проще.. в функции обработчике Вы сразу знаете, какое поле для фильтра пользователь выбрал.

"abutan" wrote:
и тогда в $form_state['values']['имя поля'] = '' мы обнуляем значения поля.

Обнуляем значения ДРУГИХ полей, смотрите внимательнее пример выше..
<?phpif($name !== $needed_field){?>

Аватар пользователя abutan abutan 18 июня 2015 в 9:09

Ну да, правильно, это я описался.
Но тогда встает другая проблема. Получается, что нужно что бы результаты выборки по select уходили сразу же после того как пользователь сделает свой выбор. Иначе же выборка в авто дополняемом поле все равно идет по всем значениям (неочищенным). А как это можно организовать?

А как сделать в одной вьюхе два раскрытых фильтра, работающих независимо друг от друга?

Аватар пользователя Orion76 Orion76 18 июня 2015 в 9:37

"abutan" wrote:
Иначе же выборка в авто дополняемом поле все равно идет по всем значениям

Нет.. У каждого поля автокомплит свой.. И работает только автокомплит "активного" поля.

"abutan" wrote:
А как сделать в одной вьюхе два раскрытых фильтра,

Вариант не проверен, но работать должно:
Делается еще одно отображение вьюса тип "Страница"(Page).
Путь устанавливается тот же что и у нужного вьюса.
Переопределяются фильтры, какие необходимо.
В разделе "РАСКРЫТАЯ ФОРМА"
устанавливаем параметр "Раскрытая форма в блоке:" >> ДА <<
Сохраняем вьюс.

В блоках появляется блок с раскрытыми фильтрами.
Выводим его на нужной странице.
Готово.

ЗЫ.. Вообще, параметры раскрытых фильтров отправляются из браузера на сервер методом GET (параметры в url-страницы),что-то типа урл_страницы?имя_поля_1=значение&имя_поля=значение
если только ajax в вьюсе не включен.
Т.е. можно просто сделать свою блок-форму с правильными названиями полей и параметром 'action' и методом GET.
Можно просто блок специальных ссылок( с параметрами фильтров) сделать, и тоже будет работать.

Аватар пользователя abutan abutan 18 июня 2015 в 20:26

Спасибо за подсказки.
Я имел в виду когда говорил результат селекта надо сразу отправлять другое.
Вот форма, в ней три элемента: select, поле с авто дополнением, и кнопка сабмита.
Вот выбрал я что то в селекте, поле с авто дополнением то об этом не знает и продолжает выбирать данные из всех полей. Функция валидации отработает же только по сабмиту. Вот я решил, что результат селекта надо отправить сразу же каким то образом , отработает валидация и поле с авто дополнением начнет получать данные из нужного поля.
Или я опять что то путаю?

Аватар пользователя xakd xakd 19 июня 2015 в 1:14

"abutan" wrote:
Вот выбрал я что то в селекте, поле с авто дополнением то об этом не знает и продолжает выбирать данные из всех полей. Функция валидации отработает же только по сабмиту. Вот я решил, что результат селекта надо отправить сразу же каким то образом , отработает валидация и поле с авто дополнением начнет получать данные из нужного поля.
Или я опять что то путаю?

Тогда поле валидации надо обрабатывать самому. И добавлять туда селект при выборе - невидимый к примеру. И отправлять например "выбор селекта: выбор поля", где уже писать выборку. Примеров, как добавлять выбранное значение селекта в другое поле несложно найти в сети

Аватар пользователя Orion76 Orion76 19 июня 2015 в 8:24

"abutan" wrote:
Вот форма, в ней три элемента: select, поле с авто дополнением,

Вы с самого начала все неправильно поняли-))

"sasha_gar" wrote:
три текстовых поля.

!!!

т.е. добавляете 3 экспозед фильтра (текстовые поля с автодополнением)
в form_alter добавляете селект с наименованием полей-фильтров.
А также устанавливаете для полей-фильтров параметр '#states'(как это- ссылку выше я давал), чтобы видимым становилось то поле, которое выбрано в селекте.
т.е. получается - на форме видимое только одно поле-фильтр, а остальные 2 скрыты.
Визуально это выглядит как 1 поле-фильтр с автодополнением и селект с выбором "параметра" фильтра.