在视图中公开两个字段组合的单个过滤器


24

我有两个用户个人资料字段“姓氏”和“名字”。我也有一个用户列表视图。我想将“名称”公开为可以同时搜索“姓氏”和“名字”的过滤器。如何对这两个字段进行组合的单个过滤器?我可以从Views UI创建它吗?

一种可能的方法是创建另一个配置文件字段“名称”,该字段将隐藏在表单中。在用户保存时,我将把两个字段值组合到“名称”字段中,然后在视图中将其公开为过滤器。但是此解决方案是硬编码,需要编写钩子。


看看这个问题drupal.stackexchange.com/questions/42366/…也许它可以为您提供帮助。不,您必须制作一个模块。Oskar
Oskar Calvo 2012年


此功能内置在视图模块中。它要求零编程。该youtube视频显示了有关如何使用它的完整示例。
asiby

Answers:


21

我终于从溶液中这个。我遵循了提供的第二个主要解决方案,尽管该博客是个人使用的hook_views_query_alter()

  1. 安装了Views过滤器填充模块。
  2. 添加了两个过滤器“名字”和“姓氏”(都不得公开),并将它们添加到“或”过滤器组中(Views 3支持此功能)。我必须在两个字段中都使用运算符“包含任何单词”,否则查询没有给我想要的结果。
  3. 创建了一个过滤器“全局:填充过滤器”,在其中添加了两个字段并将其公开。

这为我提供了无需硬编码的快速解决方案。
是其他有用的参考。


我认为您不需要使用步骤2 -我安装了模块并使用了公开的“全局:合并字段过滤器”。我在该组合字段的设置中选择了两个字段。
Laryn-CEDC.org

13

在安装的D7 with Views 7.x-3.6上,您可以添加一个过滤器,它是“全局:合并字段过滤器”,它将完全满足您的需求,允许用户使用单个过滤器搜索多个字段。


1
这应该是公认的答案
frazras

5

真的很简单。

  1. 单击添加过滤器。
  2. 选择“全局:合并字段过滤器”
  3. 按照说明进行操作。

谢谢。


2

开箱即用

最简单的方法是使用“搜索字词”过滤器,它是Views的核心功能。它将搜索实体的所有字段并返回结果,无需额外的模块!

  1. 转到您的视图
  2. 添加新的过滤器以查看
  3. 选择“搜索:搜索字词”

就是这样,没有其他事情要做(尽管您可能想要公开它)

它的表现也很好。


0

您可以使用hook_views_pre_execute(&$ view)将您的单个条件扩展到您希望的多个字段

/**
 * Recursive looks for mentioning of $fname as field of in query QueryConditionInterface::conditions()
 * 
 * @param array $cond result of QueryConditionInterface::conditions to search in
 * @param string $fname a name oof field we are looking for
 * @param array $res result array containing a references of conditions having $fname
 * @param integer $rec_lvl level of recursion
 * 
 * @return array an array containing $fname mentioned in condition $res[]['field'] == $fname
 */
function dolynskyi_help_func_find_field_condition(&$cond, $fname, &$res = array(), &$rec_lvl = 0) {
    $numeric_keys = array_filter(array_keys($cond), function($k) {return is_int($k) || (substr($k, 0, 1) !== '#');});
    $rec_lvl++;
    foreach($numeric_keys as $numkey) {
        $t = gettype($cond[$numkey]['field']);
        if($t == 'string') {
            if($cond[$numkey]['field'] == $fname) {
                $res[] = &$cond[$numkey];
            }
        } elseif($t == 'object') {
            dolynskyi_help_func_find_field_condition($cond[$numkey]['field']->conditions(), $fname, $res, $rec_lvl);
        }
    }
    $rec_lvl--;
    return $res;
}

function dolynskyi_help_func_views_pre_execute(&$view) {
    if($view->name == 'appraisals_special_global_access') { // view name we wanna extend
        $fname = 'field_data_field_ap2_employee.field_ap2_employee_target_id'; // field we look for to use as source of extending
        $search = &dolynskyi_help_func_find_field_condition($view->build_info['query']->conditions(), $fname);
        foreach($search as &$v) { // looping found field references
            $or = db_or(); 
            $or->condition($v['field'], $v['value'], $v['operator']); //repeating existing field condition
            $or->condition('field_data_field_ap2_employee.field_ap2_employee_target_id', array('711'), 'IN'); //adding any extra condition
            $v = array('value'=>null, 'operator'=>'IS NULL', 'field'=>$or); // wrapping up simple condition for $fname to multiple with $fname + our extra field via OR logic
            unset($v);
        }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.