2012-02-24 63 views
2

我希望这不是我一天中大部分时间都在寻找的一个愚蠢的问题!Drupal - 意见。以编程方式设置过滤器

我有一个简单包含标题,文件和类别的内容类型(文档)。分类值是必需的,并且由分类法“供电”。

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

使用我有限的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'))的值时,返回空值。

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

我使用Drupal的7

任何帮助非常感谢,我运行的想法(和时间)。

+0

那么,“文件”视图是否真的存在?即您是从Views UI创建它的? – 2012-02-26 05:46:58

+0

是阿马尔的观点确实存在。 – 2012-02-27 12:40:34

回答

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

在我的情况下,装饰($内容)返回'无数据视图模板已经被编辑,这可能不适用于所有的情况。

我是一个非常新的Drupal开发人员,所以我确信有很多更好的方法来做到这一点,如果是的话请张贴。

0

我打算继续,并假设您要使用视图显示文档节点的列表,这些节点按其已标记的类别分组。

有(的也许更多)两种方式,通过它可以在3次做到这一点:

(a)选择的显示风格,让您选择一个分组字段。 (您可以尝试默认情况下随视图一起提供的表格样式)。假设您已通过视图关系将node表正确关联到taxonomy_term_data表,您可以选择taxonomy_term_data.name作为分组字段。

请注意,此分组在视图刚刚呈现之前完成。所以,你的查询只需要选择一个(内容,标签)对的平面列表。 (b)您也可以使用附件显示类型来实现类似的功能。在列表视图中首先显示已使用类别,点击该图标将显示包含所选文档中标记的所有文档的页面(附件)。

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

对于(一),请阅读风格即views/help/style-grouping.html
对于(B),阅读附件显示在部分上分组的部分views/help/display-attachment.html

一对夫妇的有关做法事: (a)它将显示该词汇表中的所有术语,而不管它们是否用于标记至少一个文档。

(b)即使当前正在查看的用户无权访问视图,views_embed_view()也会返回NULL。所以,确保你抓住这种情况。

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

我知道你大概可以设置此使用一些令人费解的方法,显然会更好。但是,如果你只是想要一个快速和肮脏的直接访问而没有搞乱这个,会让你在那里。

相关问题