Думаю многие из вас, на своих проектах, не раз использовали «всемогучий» views. Относительная простота его использования и достаточно легкая темизация сделали его одним из самых скачиваемых модулей на drupal.org, а в 8ю версию Drupal даже включили в ядро. Но иногда и его возможностей нам бывает мало.
Одним из таких не хватающих возможностей, является его невозможность (я имею ввиду из админки) обрабатывать множественные значения.
Давайте все разберем на конкретном примере. Создадим раскрытый фильтр views, который будет принимать NID ноды. Вы можете создать свой фильтр или использовать экспорт представления, который используется в примере:
Экспорт views:
$view = new view(); $view->name = 'filter_nid'; $view->description = ''; $view->tag = 'default'; $view->base_table = 'node'; $view->human_name = 'Filter nid'; $view->core = 7; $view->api_version = '3.0'; $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ /* Display: Master */ $handler = $view->new_display('default', 'Master', 'default'); $handler->display->display_options['title'] = 'Filter nid'; $handler->display->display_options['use_more_always'] = FALSE; $handler->display->display_options['access']['type'] = 'perm'; $handler->display->display_options['cache']['type'] = 'none'; $handler->display->display_options['query']['type'] = 'views_query'; $handler->display->display_options['exposed_form']['type'] = 'basic'; $handler->display->display_options['pager']['type'] = 'full'; $handler->display->display_options['pager']['options']['items_per_page'] = '10'; $handler->display->display_options['style_plugin'] = 'default'; $handler->display->display_options['row_plugin'] = 'node'; /* Field: Content: Title */ $handler->display->display_options['fields']['title']['id'] = 'title'; $handler->display->display_options['fields']['title']['table'] = 'node'; $handler->display->display_options['fields']['title']['field'] = 'title'; $handler->display->display_options['fields']['title']['label'] = ''; $handler->display->display_options['fields']['title']['alter']['word_boundary'] = FALSE; $handler->display->display_options['fields']['title']['alter']['ellipsis'] = FALSE; /* Sort criterion: Content: Nid */ $handler->display->display_options['sorts']['nid']['id'] = 'nid'; $handler->display->display_options['sorts']['nid']['table'] = 'node'; $handler->display->display_options['sorts']['nid']['field'] = 'nid'; /* Filter criterion: Content: Published */ $handler->display->display_options['filters']['status']['id'] = 'status'; $handler->display->display_options['filters']['status']['table'] = 'node'; $handler->display->display_options['filters']['status']['field'] = 'status'; $handler->display->display_options['filters']['status']['value'] = 1; $handler->display->display_options['filters']['status']['group'] = 1; $handler->display->display_options['filters']['status']['expose']['operator'] = FALSE; /* Filter criterion: Content: Nid */ $handler->display->display_options['filters']['nid']['id'] = 'nid'; $handler->display->display_options['filters']['nid']['table'] = 'node'; $handler->display->display_options['filters']['nid']['field'] = 'nid'; $handler->display->display_options['filters']['nid']['exposed'] = TRUE; $handler->display->display_options['filters']['nid']['expose']['operator_id'] = 'nid_op'; $handler->display->display_options['filters']['nid']['expose']['label'] = 'Nid'; $handler->display->display_options['filters']['nid']['expose']['operator'] = 'nid_op'; $handler->display->display_options['filters']['nid']['expose']['identifier'] = 'nid'; $handler->display->display_options['filters']['nid']['expose']['remember_roles'] = array( 2 => '2', 1 => 0, 3 => 0, ); /* Display: Page */ $handler = $view->new_display('page', 'Page', 'page'); $handler->display->display_options['path'] = 'multiple-filter';
Как вы можете видеть, данное представление создает страницу с раскрытым фильтром
Сам фильтр, в качестве значения принимает NID ноды и формирует его тизер.
Как мы видим, все у нас прекрасно работает. Но давайте введем несколько значений в наш фильтр и посмотрим результат:
Видим, что фильтр не обработал множественные значения, а для обработки забрал лишь первый NID ноды.
Давайте исправим это дело. По сути, все, что нам нужно сделать – это изменить запрос views, для этого есть hook_views_query_alter.
Создадим модуль, у меня он будет называться multiple_value
Файл multiple_value.info
name = Multiple value description = Multiple value for exposed filter in views package = Other core = 7.x version = 7.x-1.0
<?php /** * Implements hook_views_query_alter */ function multiple_value_views_query_alter(&$view, &$query) { $query->group_operator = 'OR'; // Изменяем групповой оператор, для получения множественных значений foreach($nids as $nid){ // Формируем запросы 'field' => 'node.status', 'value' => 1, 'operator' => '=', ), 'field' => 'node.nid', 'value' => $nid, 'operator' => '=', ), ), 'args'=>'', 'type' => 'AND', ); } } }
Думаю из кода вам должно быть все ясно. Мы изменили групповой оператор, для возможности получить множественные значения и далее через цикл сформировали запросы для каждого NID, которое было введено в поле.
Активируем модуль и смотрим результат.
Как мы видим, теперь наш фильтр может обрабатывать множественные значения. Скачать сам модуль в примере можно здесь. На этом можно считать, что с задачей справились.