Выставить единый фильтр комбинации двух полей в представлениях

24

У меня есть два поля профиля пользователя: «Фамилия» и «Имя». У меня также есть представления списка пользователей. Я хочу выставить «Имя» в качестве фильтра, который может искать как Фамилия, так и Имя. Как я могу сделать один фильтр комбинации этих двух полей? Могу ли я создать его из пользовательского интерфейса представлений?

Один из возможных способов - создать еще одно поле профиля «Имя», которое будет скрыто в форме. При сохранении пользователя я бы объединил два значения поля в поле «Имя», а затем выставил его как фильтр в представлениях. Но это решение - жесткое кодирование, и оно требует написания хуков.

Ситху
источник
Взгляните на этот вопрос drupal.stackexchange.com/questions/42366/… Возможно, он вам поможет. И нет, вы должны сделать модуль. Оскар
Оскар Кальво
Эта функция встроена в модуль представлений. Это требует нулевого программирования. Это видео на YouTube показывает полный пример того, как его использовать.
asiby

Ответы:

21

В конце концов я получил решение от этого . Я следовал второму предложенному первичному решению, хотя блоггер использовал его лично hook_views_query_alter().

  1. Установлен модуль Представления фильтров заполнения .
  2. добавили два фильтра «Имя» и «Фамилия» (оба не должны быть доступны) и добавили их в группу фильтров «ИЛИ» (представления 3 поддерживают это). Мне пришлось использовать оператор «Содержит любое слово» для обоих полей, иначе запрос не дал мне желаемого результата.
  3. создал фильтр «Глобальный: заполнить фильтры», добавил в него два поля и открыл его.

Это дало мне быстрое решение без жесткого кодирования.
Вот другая полезная ссылка.

Ситху
источник
Я не думаю, что вам нужно использовать шаг 2 - я установил модуль и использовал «Global: объединить фильтр полей», который был выставлен. Я выбрал два поля в настройках этого объединенного поля.
Ларин - CEDC.org
13

На моей установке, D7 с Views 7.x-3.6, вы можете добавить фильтр «Global: объединить поля фильтра», который будет делать именно то, что вам нужно, позволяя пользователям выполнять поиск по нескольким полям с помощью одного фильтра.

Mona
источник
1
Это должно быть принято отвечать
frazras
5

Это действительно легко.

  1. Нажмите на Добавить фильтр.
  2. выберите «Global: объединить поля фильтра»
  3. Следуй инструкциям.

Спасибо.

Ситаншу Мишра
источник
2

Работает из коробки

Самый простой способ - использовать фильтр « Условия поиска», который является основной функцией Views . Он будет искать во всех полях объекта и возвращать результат, дополнительный модуль не требуется!

  1. Перейти к вашему виду
  2. Добавить новый фильтр для просмотра
  3. Выберите «Поиск: условия поиска»

Вот и все, ничего не поделать (хотя, возможно, вы захотите разоблачить это)

Это тоже очень хорошо работает.

Larzan
источник
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);
        }
    }
}
Николай Николаевич Долинский
источник