Как изменить программно выставленные фильтры в представлениях


10

У меня есть просмотр страницы с открытыми фильтрами. Один из фильтров - это словарь терминов, и из раскрывающегося списка пользователь может выбрать только одну категорию (термин).

Я хочу, чтобы программно установить один термин из выпадающего списка, когда я пришел с определенного URL. Я пробовал с views_query_alterгде $categoryесть tid.

 $set_exposed_input  = array();
 $set_exposed_input['field_category_tid'] = $category;

 if ($set_exposed_input) {
    $view->set_exposed_input($set_exposed_input);
 }


Ответы:


14

Для Drupal 7 вы можете использовать

$view->exposed_input[$key] = $value;

Это

$view->exposed_input['title'] = 'My title is a cat';

Для полного примера вы можете попробовать это:

$name = 'name_of_view';
$display = 'page_1';
$alter = array('exposed' =>array('title' => 'title_value'));

$view = views_get_view($name);
$view->init_display($display);
$view->preview=TRUE;
$view->is_cacheable = FALSE;


if(isset($alter['exposed'])){
  foreach($alter['exposed'] as $key => $valor){

     $view->exposed_input[$key] = $valor;

  }
}

$view->pre_execute();
$output = $view->display_handler->preview();
$view->post_execute();

print_r($view->result);

Другой способ - использовать функцию view set_option

$filters = $view->display_handler->get_option('filters');

foreach($alter['exposed'] as $key => $valor){
   $filters[$key]['value'] = $valor;
   $view->display_handler->set_option('filters', $filters);
}

1
где вы размещаете это в виде предварительного исполнения или что-то подобное?
Мика А.

Во взглядах тпл! И полный пример, где бы он ни находился, он имеет функцию просмотра загрузки
rafinskipg

1
Вы также можете добавить его в hook_views_pre_view
Квентин Кэмпбелл

5
Файл tpl должен использоваться для отображения отрендеренного контента, а не для установки бизнес-логики. Пожалуйста, попробуйте один из множества других видов хуков: api.drupal.org/api/views/views.api.php/7
aaronbauman

Что насчет незащищенного фильтра? У меня очень редкий случай использования, и мне нужно установить значение фильтра с помощью пользовательского кода.
Codium

1

Установите выставленное значение фильтра как это:

$view->exposed_input['field_category_tid'] = $category;

1

с Drupal 7.54, когда вы хотите обработать открытый фильтр программным способом, это то, как вы делаете это, когда у вас есть многозначное поле. Решение о том, как пропустить открытый фильтр, состоит в том, чтобы следить за тем, как создается URL.

Здесь: view_name? Alias ​​[1] = 1

$view = views_get_view('view_name');
$view->init_display('display_id');

$filters = array('alias' => array('1'));
$view->set_exposed_input($filters);

$view->execute();

Вы можете выполнить это где угодно. Желательно из файла модуля.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.