如何在视图中更改以编程方式公开的过滤器


10

我有一个带有暴露过滤器的页面视图。过滤器之一是术语词汇,这是一个下拉列表,用户只能选择一个类别(术语)。

当我来自特定网址时,我想通过编程方式从下拉列表中设置一个术语。我试图与views_query_alter其中$categorytid

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

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


Answers:


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);

其他方法是使用视图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
您将其放置在哪里,在视图中执行或类似操作?
Mika A.

在意见TPL!完整的示例无论在何处都具有加载视图功能
rafinskipg

1
您也可以将其添加到hook_views_pre_view
Quentin Campbell

5
tpl文件应用于显示渲染的内容,而不是用于设置业务逻辑。请尝试其他无数个视图挂钩之一:api.drupal.org/api/views/views.api.php/7
aaronbauman 2013年

不暴露的滤光片怎么办?我有非常罕见的用例,我需要通过自定义代码设置过滤器值。
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();

您可以从任何地方执行此操作。最好来自模块文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.