【发布时间】:2011-01-18 17:48:22
【问题描述】:
我对 Views 相当陌生,想以编程方式修改现有视图。这篇文章对 programmatically-set-a-views-filter-in-drupal-6-and-views-2 有帮助,但我不知道如何根据自己的需要自定义它。
我需要修改视图并添加内容类型过滤器。有人可以帮忙吗?
【问题讨论】:
标签: drupal drupal-6 drupal-views drupal-modules
我对 Views 相当陌生,想以编程方式修改现有视图。这篇文章对 programmatically-set-a-views-filter-in-drupal-6-and-views-2 有帮助,但我不知道如何根据自己的需要自定义它。
我需要修改视图并添加内容类型过滤器。有人可以帮忙吗?
【问题讨论】:
标签: drupal drupal-6 drupal-views drupal-modules
我只是这样做了,以编程方式将语言过滤器添加到现有视图中。以下是我的处理方法。
在 views_ui 界面(admin/build/views)中,选择您的视图并通过 Web 界面添加过滤器。正确设置后,导出视图。您将在 php 代码中获得一个大数组。在数组中找到您的过滤器并将其复制粘贴到临时文本文件中以供将来参考。
现在,在代码中,这样做:
// Load the view by specifying its name (as displayed at admin/build/views
$view = views_get_view('name_of_view');
// Specify the display you are editing - you can see this at admin/build/views/edit/name_of_view.
// Usually it's something like 'page' or 'block' or 'default'
$display = 'default';
$view->view_set_display($display);
// Now load up an available filter. You must do this step - it's the equivalent of
// clicking 'add' in the interface.
// filter_name is the same as what is specified in your export from before.
$filter_name = 'language';
$filter = $view->get_item($display, 'filter', $filter_name);
// Now set the arguments. This will need to match what is in your export from before...
$filter['value']['***CURRENT_LANGUAGE***'] = '***CURRENT_LANGUAGE***';
// ...and save the filter.
$view->set_item('default', 'filter', 'language', $filter);
这对我来说效果很好。作为参考,这是我的意见导出的相关摘录:
'language' => array(
'operator' => 'in',
'value' => array(
'***CURRENT_LANGUAGE***' => '***CURRENT_LANGUAGE***',
),
'group' => '0',
'exposed' => FALSE,
'expose' => array(
'operator' => FALSE,
'label' => '',
),
'id' => 'language',
'table' => 'node',
'field' => 'language',
'override' => array(
'button' => 'Override',
),
'relationship' => 'none',
),
【讨论】:
我怀疑您最好的选择是使用hook_views_query_alter 添加WHERE 以限制特定的node.type。您可以检查$view 以确定是否正在调用您的相关视图,然后使用$query 对象添加约束。不幸的是,视图挂钩的文档很少,您经常需要查看实际的模块源代码才能了解实际情况。
【讨论】: