2012-01-31 125 views
4

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

我已经试过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

回答

0

尝试从$view对象去除柱。

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

这个方法在hook_views_pre_build()中为我工作。你是从hook_views_query_alter()使用它吗? – 2012-03-27 19:09:31

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导出,因为它似乎比在视图表设置上使用“隐藏如果为空”列复选框效果更好(它必须迭代结果集中的每一行到看看它是否为空以便隐藏列标题)。如果您也希望这样做,则需要更改顶部的if()语句,以便仅检查$ view-> name。然后这些字段将从该视图中的所有显示中删除(而不仅仅是views_data_export_1显示)。

相关问题