Здравствуйте всем.
Мне нужно сделать фильтр во views для фильтрации содержимого по нескольким текстовым полям с авто дополняемой строкой.
Само по себе ничего особенного. Но заказчик хочет что бы перед полем ввода был селект, в котором можно выбрать по какому именно полю будет идти фильтрация. То есть, например, фильтрация идет по полям 1, 2, 3 . В селекте выбирается поле 2 и в авто дополняемой строке выбор значений должен идти только по полю 2. Ну и, соответственно, по другим полям такой же замысел.
Подскажите пожалуйста как можно реализовать такой фильтр или по какому принципу это все делать.
Буду рад любой помощи.
Комментарии
три текстовых поля. в template.php подхватываете форму. добавлЕте селект. и тут дописываете js. в зависимости от селекта показываете соответствующее поле. первый способ которфй пришел в голову. без jsвроде никак.
Согласен.
лучше HOOK_form_FORM_ID_alter
FORM_ID можно подсмотреть в html в браузере, что-то типа такого
<input type="hidden" name="form_id" value="field_ui_field_overview_form">
как (#states):
http://xandeadx.ru/blog/drupal/319
Хотя на самом деле есть один нюанс..
Перед фильтрацией, скрытые поля надо очищать, если пользователь уже фильтровал выборку по ним.
Тут js понадобиться..
А может и не понадобиться, если на validate формы повесить свой обработчик, и очищать скрытые поля(которые не выбраны в селекте) в нем.
Огромное спасибо. Буду пробовать. По результату, или если появятся очередные проблемы, отпишусь.
Здравствуйте всем.
Попытался сделать как посоветовали.
Селект со значениями из которых надо выбирать добавил без проблем. Прикрутил свою функцию валидации прямо в hook_form_alter через $form['#validate'][] = 'название моей функции'.
Проблема в том что не могу понять, что значит очистить значение поля(ну тех полей которые не выбраны).
Ну например я пишу if($form_state['values']['select_field'] == 'значение 1'){
и вот здесь у меня наступает ступор
}
Не могу понять что нужно сделать.
И еще возникает другая проблема. При подключении функции валидации ломается работа авто дополняемого поля. Поле как бы работает, вводишь букву значения выбираются, выпадает поле с этими значениями и тут же закрывается вместо того чтобы стоять и ждать когда я выберу что мне нужно.
Подскажите пожалуйста что значит очистить поля. И почему перестали работать автодополнения.
Все очень просто.
Есть 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]='';
}
} ?>
На прямую, дополнительная валидация формы на автокомплит влиять не должна.
проверте ошибки-предупреждения в функции валидации (в логах php или/и журнале Drupal)
Прошу простить мою непонятливость.
Получается что в options в имя поля ('имя поля 1'=>t('тайтл поля 1') надо писать машинное имя нужного поля?
и тогда в $form_state['values']['имя поля'] = '' мы обнуляем значения поля.
Или я опять не так понимаю?
С авто дополнением разобрался. Я включил автоматическую отправку и форма пыталась отправиться по первой букве.
И еще вопрос. Дело в ом что в этой же вьюхе мне надо сделать еще один фильтр.
Он становиться почему то в ту же форму как элемент формы и фильтры косят работу друг друга. А можно ли сделать что бы эти фильтры работали независимо друг от друга?
Да.. так же проще.. в функции обработчике Вы сразу знаете, какое поле для фильтра пользователь выбрал.
Обнуляем значения ДРУГИХ полей, смотрите внимательнее пример выше..
<?phpif($name !== $needed_field){?>
Ну да, правильно, это я описался.
Но тогда встает другая проблема. Получается, что нужно что бы результаты выборки по select уходили сразу же после того как пользователь сделает свой выбор. Иначе же выборка в авто дополняемом поле все равно идет по всем значениям (неочищенным). А как это можно организовать?
А как сделать в одной вьюхе два раскрытых фильтра, работающих независимо друг от друга?
Нет.. У каждого поля автокомплит свой.. И работает только автокомплит "активного" поля.
Вариант не проверен, но работать должно:
Делается еще одно отображение вьюса тип "Страница"(Page).
Путь устанавливается тот же что и у нужного вьюса.
Переопределяются фильтры, какие необходимо.
В разделе "РАСКРЫТАЯ ФОРМА"
устанавливаем параметр "Раскрытая форма в блоке:" >> ДА <<
Сохраняем вьюс.
В блоках появляется блок с раскрытыми фильтрами.
Выводим его на нужной странице.
Готово.
ЗЫ.. Вообще, параметры раскрытых фильтров отправляются из браузера на сервер методом GET (параметры в url-страницы),что-то типа урл_страницы?имя_поля_1=значение&имя_поля=значение
если только ajax в вьюсе не включен.
Т.е. можно просто сделать свою блок-форму с правильными названиями полей и параметром 'action' и методом GET.
Можно просто блок специальных ссылок( с параметрами фильтров) сделать, и тоже будет работать.
Спасибо за подсказки.
Я имел в виду когда говорил результат селекта надо сразу отправлять другое.
Вот форма, в ней три элемента: select, поле с авто дополнением, и кнопка сабмита.
Вот выбрал я что то в селекте, поле с авто дополнением то об этом не знает и продолжает выбирать данные из всех полей. Функция валидации отработает же только по сабмиту. Вот я решил, что результат селекта надо отправить сразу же каким то образом , отработает валидация и поле с авто дополнением начнет получать данные из нужного поля.
Или я опять что то путаю?
Тогда поле валидации надо обрабатывать самому. И добавлять туда селект при выборе - невидимый к примеру. И отправлять например "выбор селекта: выбор поля", где уже писать выборку. Примеров, как добавлять выбранное значение селекта в другое поле несложно найти в сети
Вы с самого начала все неправильно поняли-))
!!!
т.е. добавляете 3 экспозед фильтра (текстовые поля с автодополнением)
в form_alter добавляете селект с наименованием полей-фильтров.
А также устанавливаете для полей-фильтров параметр '#states'(как это- ссылку выше я давал), чтобы видимым становилось то поле, которое выбрано в селекте.
т.е. получается - на форме видимое только одно поле-фильтр, а остальные 2 скрыты.
Визуально это выглядит как 1 поле-фильтр с автодополнением и селект с выбором "параметра" фильтра.