В наших предыдущих статьях мы Вам рассказывали, как с помощью представления сделать фильтр и сортировку на сайте для пользователей, для большего удобства поиска нужной ему информации. Но есть один нюанс — по умолчанию фильтр представлен только в виде выпадающего списка, то есть тип поля select. Но как быть если нужно вывести фильтр в виде чекбокса или радио кнопки в зависимости от нужд сайта. В этой статье мы рассмотрим как представить фильтр в удобном нам виде с помощью небольшого хука.
Допустим нам нужно сделать фильтр на странице блога по типу/категориям/рубрикам статьей.
О том, как сделать фильтр вы можете прочитать в нашей статье посвященной этому.
Имеем следующее
Далее необходимо создать кастомный модуль, который будет преобразовывать тип вывода фильтр в нужной нам форме. Если вы хотите сделать возможным множественный выбор, то нам необходимо сменит тип поля на checkbox. Если возможен только один выбор — radio.
Мы рассмотрим ситуацию, когда необходим множественный выбор.
Во-первых, и очень важно, заходим в настройки нашего представления, находим нужный нам критерий фильтрации, и ставим галочку «Разрешить множественный выбор»
Применяем и сохраняем.
Стоит отметить, если Вы вдруг забудете разрешить множественный выбор в критерии фильтрации при использовании типа поля 'checkboxes' - то на экране Вы увидите подобную ошибку:
Затем вставляем следующий код в наш модуль непосредственно для смены типа поля для фильтра
/** * Implements hook_form_FORM_ID_alter(): views_exposed_form. */ function NAMEYOUMODUL_form_views_exposed_form_alter(&$form, &$form_state) { if ($form['#id'] == 'views-exposed-form-news-page') { //условие для выполнения замены для определенной формы $form['field_category_tid']['#type'] = 'checkboxes'; //присвоение полю нового типа $form['field_category_tid']['#element_validate'][] = 'NAMEYOUMODUL_func_validate'; //валидация } }
Не забудьте поменять «NAMEYOUMODUL» - на имя своего модуля.
Обратите внимание на следующие строки:
if ($form['#id'] == 'views-exposed-form-news-page') { $form['field_category_tid']['#type'] = 'checkboxes';
В первой Вам необходимо правильно указать id вашей формы с фильтром, где должна произойти замена типа поля.
Во второй строке 'field_category_tid' - это 'name' вашего поля, тип которого Вы меняете. И мы ставим тип именно 'checkboxes', а не 'checkbox'. Что значит их множественное значение. Для единичного выбора нужно ставит 'radios' а не 'radio'.
Последняя строка вызывает функцию для валидации нашей первой функции. Для этого далее в модуле вставим сам код этой функции проверки
/** * Checkboxes validate. */ function NAMEYOUMODUL_func_validate($element, &$form_state, $form) { $values = drupal_array_get_nested_value($form_state['values'], $element['#parents']); // получает значение из вложенного массива с переменной глубиной $values = array_diff($values, array(0)); // вычисляет разницу в массивах form_set_value($element, $values, $form_state); }
Эта функция необходима для корректной работы фильтра при выборе пользователя конкретного значения.
В первой строке мы получаем массив вариантов для фильтра. По умолчанию значение каждого чекбокса равно 0. Во второй строке этот массив сравнивается с массивом, состоящим из нулей и отличные от нуля элементы возвращаются, и в третей строке передаются в форму.
То есть, когда Вы ставите галочку на странице напротив нужного значения и нажимаете применить, то чекбокс принимает значение, отличное от нуля (равно порядковому номеру чекбокса). И предаются в форму.
В результате получаем
Теперь остается лишь привести в порядок внешний вид фильтра с помощью css и вуаля.