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

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

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

24 голоса | спросил Sithu 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 15 Sep 2012 09:43:41 +0400 2012, 09:43:41

5 ответов


21

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

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

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

ответил Sithu 16 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 16 Sep 2012 08:08:25 +0400 2012, 08:08:25
13

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

ответил Mona 29 AMpMon, 29 Apr 2013 01:28:41 +040028Monday 2013, 01:28:41
5

Это очень просто.

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

Спасибо.

ответил Shitanshu Mishra 15 PM00000080000001731 2015, 20:06:17
2

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

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

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

Это то, что вам больше не нужно делать (вы можете его разоблачить)

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

ответил Larzan 8 Maypm15 2015, 17:01:50
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);
        }
    }
}
ответил Mykola Mykolayovich Dolynskyi 7 PMpSat, 07 Apr 2018 22:28:10 +030028Saturday 2018, 22:28:10

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132