如何以编程方式从Views 3中删除字段?

时间:2012-01-31 16:39:44

标签: drupal-7 drupal-views

您好我正在使用Drupal 7和Views 3.我有一个视图(名为'export'),它生成所选节点实体的csv导出。但是,我已经放置了一些自定义代码,显示所选节点实体中包含的所有字段,并允许用户选择他们不希望包含在导出中的字段(通过复选框)。

我尝试在hook_views_query_alter中取消设置所选字段,如下所示:

function mymodule_views_query_alter (&$view, &$query) {
  if ($view->name == "export") {
    unset($query->fields['field_data_field_description_node_entity_type']);
  }
}

虽然这确实取消了那个字段数组的部分,但我仍然在csv导出中填充了描述字段。我对视图对象结构不够熟悉,无法完全理解如何从视图中删除给定的字段。我在网上搜索了几个小时试图找到一个帖子来阐明这一点。虽然我发现了大量使用hook_views_query_alter添加过滤器或更改查询对象的WHERE语句的示例,但我没有发现任何与删除视图查询返回的列有关的内容。对此有任何建议将非常感谢!

谢谢, AXL

2 个答案:

答案 0 :(得分:8)

我可以通过取消设置自定义模块中hook_views_pre_build()中的字段来删除CSV导出的视图字段。

function mymodule_views_pre_build(&$view) {
  if ($view->name == 'campaign_report'
      && $view->current_display == 'views_data_export_1') {

    // You'll have your own list of fields to remove that you create somehow...
    $fields_to_remove = array('field_name_to_remove_1','field_name_to_remove_2');

    foreach ($fields_to_remove as $field_name) {
      unset($view->field[$field_name]);            
      unset($view->display_handler->handlers['field'][$field_name]);  
    }
  }
}

这似乎对我很有用,并且在构建查询之前在视图生命周期的早期执行。事实上,我开始将它用于我的表格显示视图以及我的CSV导出,因为它似乎比使用Views表设置上的“hide if empty”列复选框更高效(它必须迭代结果集中的每一行)看它是否为空以隐藏列标题)。如果您也希望这样做,则需要更改顶部的if()语句,以便仅检查$ view-> name。然后,将从该视图中的所有显示中删除这些字段(不仅仅是views_data_export_1显示)。

答案 1 :(得分:0)

尝试从$view对象中删除该列。

unset($view->field['field_name'];