Розкрийте єдиний фільтр комбінації двох полів у видах


24

У мене є два поля профілю користувача "Прізвище" та "Ім'я". У мене також перегляди списків користувачів. Я хочу виставити "Ім'я" як фільтр, який може шукати і прізвище, і ім'я. Як я можу зробити один фільтр комбінації цих двох полів? Чи можна створити його з інтерфейсу перегляду?

Один з можливих способів - створити інше поле профілю "Ім'я", яке буде приховано у формі. За збереженням користувача, я поєднав би два значення поля у полі "Ім'я", а потім виставив би його як фільтр у поданнях. Але це рішення є жорстким кодуванням і йому потрібно писати гачки.


Погляньте на це питання drupal.stackexchange.com/questions/42366/… Можливо, воно може вам допомогти. І ні, ви повинні зробити модуль. Оскар
Оскар Кальво


Ця функція вбудована в модуль перегляду. Це вимагає нульового програмування. Це відео на YouTube показує повний приклад того, як ним користуватися.
asiby

Відповіді:


21

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

  1. встановлений модуль Завантаження фільтрів переглядів .
  2. додано два фільтри "Ім'я" та "Прізвище" (обидва не повинні піддаватися впливу) та додав їх до групи АБО фільтрів (Перегляди 3 це підтримують). Мені довелося використовувати оператор "Містить будь-яке слово" для обох полів, інакше запит не дав бажаного результату.
  3. створив фільтр "Глобальний: заповнити фільтри", додав до цього два поля і викрив його.

Це дало мені швидке рішення без жорсткого кодування.
Ось інша корисна довідка.


Я не думаю, що вам не потрібно використовувати крок 2 - я встановив модуль і застосував "Глобальний: комбінувати фільтри полів", який був викритий. Я вибрав два поля в налаштуваннях цього комбінованого поля.
Ларин - CEDC.org

13

У моїй установці D7 з видами 7.x-3.6 ви можете додати фільтр, який є "Глобальний: Фільтр полів поєднати", який буде робити саме те, що вам потрібно, і дозволяє користувачам здійснювати пошук у кількох полях за допомогою одного фільтра.


1
Це має бути прийнята відповідь
frazras

5

Це дуже просто.

  1. Клацніть на Додати фільтр.
  2. виберіть "Глобальний: Фільтр полів поєднання"
  3. Дотримуйтесь інструкцій.

Спасибі.


2

Працює поза коробкою

Найпростіший спосіб - скористатися фільтром "Пошукові терміни", який є основним функціоналом перегляду . Він здійснить пошук у всіх полях сутності та поверне результат, не потрібен додатковий модуль!

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

Ось це, нічого іншого робити (можливо, ви хочете викрити це)

Це також дуже добре.


0

Ви можете використовувати kuk_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);
        }
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.