【问题标题】:Drupal - Views. Setting a filter programmaticallyDrupal - 视图。以编程方式设置过滤器
【发布时间】:2012-03-15 01:41:11
【问题描述】:

我希望这不是我一天中大部分时间都在寻找的愚蠢问题!

我有一个内容类型(文档),它只包含标题、文件和类别。类别值是必需的,由分类法“支持”。

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

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

为此,我一直希望使用这个 sn-p。

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。

非常感谢任何帮助,我的想法(和时间)已经用完了。

【问题讨论】:

  • 那么,“文档”视图真的存在吗?即你是从 Views UI 创建的?
  • 是的,Amar 视图确实存在。

标签: drupal drupal-views


【解决方案1】:

这里有一个替代方案:

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

我知道您可以使用一些复杂的方法来设置它,显然这样会更好。但是,如果您只是想要一个快速而肮脏的直接访问而不搞乱,这会让您到达那里。

【讨论】:

    【解决方案2】:

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

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

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

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

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

    要了解如何执行 (a) 或 (b),请先打开 advanced_help 模块(这不是 Views 必需的,但建议使用)。

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

    关于您的方法的几点说明:

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

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

    【讨论】:

      【解决方案3】:

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

      我更改了视图并添加了相关的上下文过滤器,然后使用该函数 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;        
          }
      }
      

      在我的例子中,trim($content) 返回 '' 没有数据,因为视图模板已经被编辑,这可能不是所有的情况。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-18
        相关资源
        最近更新 更多