如何在drupal 7视图中的两个字段(相同的列表)中创建一个下拉式公开过滤器(约束列表,例如选项)进行搜索



帮助!我在这里和其他地方做了很多研究并寻找答案,但到目前为止,我还没有找到解决我特定问题的方法

我正在drupal视图中构建一个搜索,以返回符合某些标准的用户。我的搜索目前正在做我需要的大部分工作(邻近搜索、组合名称搜索等(,但我正在寻找最后一件事:

每个用户都有一个他们可以做的、经认证可以做的活动列表,以及一个单独的、他们可以做但未经认证可以进行的活动列表。

两个列表都是受约束的列表(例如选项列表(,并且两个列表是相同的。

例如,列表A[驾驶,滑雪,滑冰,飞行],列表B[驾驶,雪,滑冰,飞]。

通常情况下,搜索者只对在列表A中搜索用户感兴趣。我目前的搜索做得很好。

我想要的是一个"包括未经认证的"复选框,选中该复选框时,将使用列表A的暴露下拉筛选器,并返回在列表A或列表B中具有所选项目的用户。

我发现了很多从一个公开的过滤器中搜索多个字段的方法,但它们都适用于字符串/文本条目搜索,而不是选项类型过滤器的下拉列表。

我看过这样的东西:"全局:合并字段过滤器(公开(",或者"更好的公开过滤器Drupal模块"one_answers"视图过滤器填充Drupal模块",但我看不到让他们做我想做的事情的方法。

任何帮助都将不胜感激。我知道这似乎是一个相当不寻常的要求。我也希望以上的解释是清楚的。

我不知道有哪个模块能做到这一点,但是,您可以创建自己的模块,并在执行查询之前实现hook_views_query_alter来更改查询。

希望它能帮助其他人解决类似的问题,我将使用上面2pha的建议勾勒出我必须做些什么来解决这个问题:

  1. 制作一个自定义模块(MODULENAME(,安装并启用它
  2. 在模块目录中创建一个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,
  );
}

--

  1. 制作一个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(;它列出了整个查询结构,因此您可以对其进行探索,并帮助找出问题所在以及调用了什么。

  1. 最后,您需要一个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);
}

--

祝你好运!

最新更新