Блог Vaden Pro

Все о самостоятельном создании и продвижении сайтов

Смена типа вывода фильтра в Drupal 7

Раздел: 

Смена типа вывода фильтра в Drupal 7

В наших предыдущих статьях мы Вам рассказывали, как с помощью представления сделать фильтр и сортировку на сайте для пользователей, для большего удобства поиска нужной ему информации. Но есть один нюанс — по умолчанию фильтр представлен только в виде выпадающего списка, то есть тип поля 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 и вуаля.