Ujawnij pojedynczy filtr kombinacji dwóch pól w widokach

24

Mam dwa pola profilu użytkownika „Nazwisko” i „Imię”. Mam również widoki listy użytkowników. Chcę udostępnić „Imię” jako filtr, który może wyszukiwać zarówno Nazwisko, jak i Imię. Jak mogę zrobić pojedynczy filtr kombinacji tych dwóch pól? Czy mogę go utworzyć z interfejsu użytkownika widoków?

Jednym z możliwych sposobów jest utworzenie kolejnego pola profilu „Nazwa”, które będzie ukryte w formularzu. Podczas zapisywania przez użytkownika połączę dwie wartości pól w pole „Nazwa”, a następnie pokażę je jako filtr w widokach. Ale to rozwiązanie jest mocno kodowane i musi pisać haczyki.

Sithu
źródło
Spójrz na to pytanie drupal.stackexchange.com/questions/42366/… Może to może ci pomóc. I nie, musisz zrobić moduł. Oskar
Oskar Calvo
Ta funkcja jest wbudowana w moduł widoków. Wymaga zerowego programowania. Ten film na YouTube pokazuje kompletny przykład, jak go używać.
asiby

Odpowiedzi:

21

I w końcu dostałem rozwiązanie od tego . Postanowiłem zastosować drugie podstawowe rozwiązanie, chociaż bloger osobiście go używał hook_views_query_alter().

  1. zainstalowany moduł Widoki wypełniają się .
  2. dodał dwa filtry „Imię” i „Nazwisko” (oba nie mogą być ujawnione) i dodał je do grupy filtrów LUB (obsługuje to Widok 3). Musiałem użyć operatora „Zawiera dowolne słowo” dla obu pól, w przeciwnym razie zapytanie nie dało pożądanego rezultatu.
  3. utworzył filtr „Globalny: wypełnia filtry”, dodał do niego dwa pola i odsłonił go.

To dało mi szybkie rozwiązanie bez twardego kodowania.
Oto inne pomocne informacje.

Sithu
źródło
Nie sądzę, że musisz użyć kroku 2 - zainstalowałem moduł i użyłem ujawnionego „Globalnego: filtru pól połączonych”. Wybrałem dwa pola w ustawieniach tego połączonego pola.
Laryn - CEDC.org
13

W mojej instalacji, D7 z widokami 7.x-3.6, możesz dodać filtr „Globalny: Połącz filtr pól”, który zrobi dokładnie to, czego potrzebujesz, umożliwiając użytkownikom wyszukiwanie na wielu polach za pomocą jednego filtra.

Mona
źródło
1
To powinna być zaakceptowana odpowiedź
frazras
5

To naprawdę proste.

  1. Kliknij Dodaj filtr.
  2. wybierz „Globalny: Połącz filtr pól”
  3. Postępuj zgodnie z instrukcją.

Dzięki.

Shitanshu Mishra
źródło
2

Działa po wyjęciu z pudełka

Najprościej jest użyć filtru „Wyszukiwane hasła”, który jest podstawową funkcją Widoku . Przeszuka wszystkie pola encji i zwróci wynik, nie jest wymagany żaden dodatkowy moduł!

  1. Idź do swojego widoku
  2. Dodaj nowy filtr do wyświetlenia
  3. Wybierz „Szukaj: Wyszukiwane hasła”

To wszystko, nic więcej do zrobienia (choć możesz chcieć to ujawnić)

Działa również bardzo dobrze.

Larzan
źródło
0

Możesz użyć hook_views_pre_execute (& $ view), aby rozszerzyć swój pojedynczy warunek na wiele pól, które chcesz

/**
 * 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);
        }
    }
}
Mykoła Mikołajowicz Dolynskyi
źródło