Drupal - 视图。以编程方式设置过滤器

时间:2012-02-24 15:44:10

标签: drupal drupal-views

我希望这不是我一直在寻找的一个愚蠢的问题!

我有一个内容类型(文档),它只包含标题,文件和类别。类别值是必需的,并且由Taxonomy“提供”。

我现在希望创建一个视图,该视图将显示按分类术语分组和标题的这些文档。

使用我有限的Drupal知识,我打算迭代相关的术语ID(使用taxonomy_get_tree($vid)),然后相应地渲染每个视图。

要做到这一点,我一直希望使用这个片段。

view = views_get_view('documents');

$view->set_display($display_id);

$filter = $view->get_item($display_id, 'filter', 'field_dl_category');

$filter['value']['value'] = $filter_value;

$view->set_item($display_id, 'filter', 'field_dl_category', $filter);

$viewsoutput = $view->render();

但这不起作用;当我查询$filter ($view->get_item($display_id, 'filter', 'field_dl_category'))的值时,我会返回null。

这可能是我的过滤器名称与CCK字段名称不同吗?

我正在使用Drupal 7.

任何帮助都非常感激,我的想法(和时间)已经不多了。

3 个答案:

答案 0 :(得分:0)

我终于设法让这个工作,但我采取了一个稍微不同的方法。

我更改了视图并添加了相关的上下文过滤器,然后使用此函数views_embed_view来获取我所需的结果。

如果这有帮助!这是我的解决方案:

$display_id = 'default';
$vid = 7; 
$terms = taxonomy_get_tree($vid);

foreach($terms As $term){    
    $content = views_embed_view('documents', $display_id, $term->tid);

    //now we see if any content has been provided
    if(trim($content) != ''){
        print "<h3>" . $term->name . "</h3>";
        print $content;        
    }
}

在我的情况下,修剪($ content)在没有数据的情况下返回'',因为视图模板已被编辑,所有情况可能并非如此。

我是一个非常新的Drupal开发人员,所以我确信有更好的方法可以做到这一点,如果是这样,请发帖。

答案 1 :(得分:0)

我将继续并假设您希望使用“视图”显示按其标记的类别分组的文档节点列表。

在视图3中有两种(可能更多)方法可以做到这一点:

(a)选择允许您选择分组字段的显示样式。 (您可以尝试默认情况下附带View的表格样式)。假设您已通过“视图”关系将node表与taxonomy_term_data表正确关联,您可以选择taxonomy_term_data.name作为分组字段。

请注意,此分组是在呈现视图之前完成的。因此,您的查询只需选择(内容,标记)对的平面列表。

(b)您还可以使用附件显示类型来实现类似的功能。在列表视图中首先显示使用过的类别,单击该列表将显示一个页面(附件),其中包含所选类别中标记的所有文档。

要了解如何执行(a)或(b),请先启用advanced_help模块(不是视图必备但建议使用)。

对于(a),请阅读样式分组部分,即views/help/style-grouping.html
对于(b),请阅读附件显示部分,即views/help/display-attachment.html

关于你的方法的一些事情:

(a)它将显示该词汇表中的所有术语,无论它们是否用于标记至少一个文档。

(b)即使当前查看的用户无权访问该视图,views_embed_view()也将返回NULL。所以,确保你抓住那个案子。

答案 2 :(得分:0)

这是另一种选择:

$view = views_get_view('view_machine_name');
$view->init_display('default');
$view->display_handler->display->display_options['filters']['your_filter_name']['default_value'] = 'your_value';
$view->is_cacheable = FALSE;  
$view->execute();
print $view->render();

我知道你可以用一些复杂的方法设置它,显然会更好。但是如果你只是想要一个快速而又脏的直接访问而不会搞乱,那么就会让你在那里。