帮助!我在这里和其他地方做了很多研究并寻找答案,但到目前为止,我还没有找到解决我特定问题的方法
我正在drupal视图中构建一个搜索,以返回符合某些标准的用户。我的搜索目前正在做我需要的大部分工作(邻近搜索、组合名称搜索等(,但我正在寻找最后一件事:
每个用户都有一个他们可以做的、经认证可以做的活动列表,以及一个单独的、他们可以做但未经认证可以进行的活动列表。
两个列表都是受约束的列表(例如选项列表(,并且两个列表是相同的。
例如,列表A[驾驶,滑雪,滑冰,飞行],列表B[驾驶,雪,滑冰,飞]。
通常情况下,搜索者只对在列表A中搜索用户感兴趣。我目前的搜索做得很好。
我想要的是一个"包括未经认证的"复选框,选中该复选框时,将使用列表A的暴露下拉筛选器,并返回在列表A或列表B中具有所选项目的用户。
我发现了很多从一个公开的过滤器中搜索多个字段的方法,但它们都适用于字符串/文本条目搜索,而不是选项类型过滤器的下拉列表。
我看过这样的东西:"全局:合并字段过滤器(公开(",或者"更好的公开过滤器Drupal模块"one_answers"视图过滤器填充Drupal模块",但我看不到让他们做我想做的事情的方法。
任何帮助都将不胜感激。我知道这似乎是一个相当不寻常的要求。我也希望以上的解释是清楚的。
我不知道有哪个模块能做到这一点,但是,您可以创建自己的模块,并在执行查询之前实现hook_views_query_alter来更改查询。
希望它能帮助其他人解决类似的问题,我将使用上面2pha的建议勾勒出我必须做些什么来解决这个问题:
- 制作一个自定义模块(MODULENAME(,安装并启用它
- 在模块目录中创建一个MODULENAME.form.inc文件,使用它将复选框添加到表单中。如果我们只搜索列表a,或同时搜索列表a&列表B
--MODULENAME.form.inc:模块
<?php
function MODULENAME_form_alter(&$form, &$form_state, $form_id) {
}
function MODULENAME_form_views_exposed_form_alter(&$form, &$form_state, $form_id) {
// Add a checkbox to search form.
$form['togglecheckbox'] = array(
'#type' => 'checkbox',
'#title' => t("Include List B"),
'#required' => FALSE,
);
}
--
- 制作一个MODULENAME.views.inc文件。这将检查复选框的状态,并根据需要将搜索查询更改为包括列表B
因为我的搜索不仅仅是列表A(或列表A或列表B(,所以我还为新查询添加了一些额外的过滤器。
--模块化视图.inc:
<?php
function MODULENAME_views_query_alter(&$view, &$query) {
// Uncomment the below line to get the query object via devel module debug
// dpm($query);
// If the checkbox is checked, then we want to use the exposed primary key also as the secondary key
if ($view->name == 'VIEWNAME' && ($view->exposed_raw_input['togglecheckbox'] == '1')) {
// Set variable to primary key
$primary_key = ($view->exposed_raw_input['field_LIST_A']);
// Add table to query, since it doesn't seem to automatically be done to exposed filters unless their value has been changed from the default (ALL for selection lists etc.)
$query->add_table('field_data_field_LIST_B', 'users');
$view->query->set_group_operator('OR'); // Show results that match group 1 (normal) or group 2 (added)
// Add secondary filter to search query
$query->add_where(2,'field_data_field_LIST_B.field_LIST_B_value',$primary_key,'=');
// Fill in other filters, e.g. Must be valid member, must be ok for directory
// User must be valid
$query->add_where(2,'users.status',0,'<>');
// The below key name is mine, you'll need to change to yours or delete this line.
$query->add_where(2,'field_data_field_list_in_directory.field_list_in_directory_value',1,'=');
}
我在命名约定方面有点困难,使用了很多dpm((;调试调用(通过devel模块(以不断检查变量。
我也调用dpm($query(;它列出了整个查询结构,因此您可以对其进行探索,并帮助找出问题所在以及调用了什么。
- 最后,您需要一个MODULENAME.module来初始化上述两个模块
--MODULENAME.module:
<?php
function MODULENAME_hook_info_alter(&$hooks) {
$hooks['form_alter']['group'] = 'form';
}
function MODULENAME_views_api() {
return array('api' => 2.0);
}
--
祝你好运!