Esporre il filtro singolo della combinazione di due campi nelle viste


24

Ho due campi del profilo utente "Cognome" e "Nome". Ho anche una vista elenco utenti. Voglio esporre "Nome" come filtro in grado di cercare sia il cognome che il nome. Come posso fare un singolo filtro di combinazione di questi due campi? Posso crearlo dall'interfaccia utente delle viste?

Un modo possibile è creare un altro campo del profilo "Nome" che verrà nascosto nel modulo. Al salvataggio dell'utente, vorrei combinare i due valori di campo nel campo "Nome" e quindi esporlo come filtro nelle viste. Ma questa soluzione è una codifica rigida e deve scrivere hook.


Dai un'occhiata a questa domanda drupal.stackexchange.com/questions/42366/… Forse ti può aiutare. E no, devi creare un modulo. Oskar
Oskar Calvo,


Questa funzione è integrata nel modulo viste. Richiede programmazione zero. Questo video di YouTube mostra un esempio completo su come usarlo.
asiby,

Risposte:


21

Alla fine ho ottenuto una soluzione da questo . Ho seguito la seconda soluzione principale offerta sebbene il blogger lo usasse personalmente hook_views_query_alter().

  1. installato il modulo Visualizzazioni popolate dai filtri .
  2. aggiunto due filtri "Nome" e "Cognome" (entrambi non devono essere esposti) e aggiunti a un gruppo di filtri OR (Views 3 supporta questo). Ho dovuto usare l'operatore "Contiene qualsiasi parola" per entrambi i campi, altrimenti la query non mi ha dato il risultato desiderato.
  3. ha creato un filtro "Globale: popolare i filtri", ha aggiunto i due campi in questo ed esposto.

Questo mi ha dato una soluzione rapida senza codifica rigida.
Ecco altri riferimenti utili.


Non credo sia necessario utilizzare il passaggio 2: ho installato il modulo e utilizzato un "Filtro campi combinati globale" che è stato esposto. Ho selezionato i due campi all'interno delle impostazioni di quel campo combinato.
Laryn - CEDC.org il

13

Nella mia installazione, D7 con Views 7.x-3.6, puoi aggiungere un filtro che è "Globale: combina filtro campi" che farà esattamente ciò di cui hai bisogno, consentendo agli utenti di cercare su più campi con un singolo filtro.


1
Questa dovrebbe essere la risposta accettata
frazras

5

È davvero facile.

  1. Fai clic su Aggiungi un filtro.
  2. seleziona "Globale: combina filtro campi"
  3. Seguire le istruzioni.

Grazie.


2

Funziona fuori dalla scatola

Il modo più semplice per procedere è utilizzare il filtro "Termini di ricerca" che è la funzionalità principale di Views . Ricerca in tutti i campi dell'entità e restituisce il risultato, non è necessario alcun modulo aggiuntivo!

  1. Vai alla tua vista
  2. Aggiungi un nuovo filtro per visualizzare
  3. Seleziona "Cerca: Termini di ricerca"

Questo è tutto, nient'altro da fare (potresti voler esporlo però)

Funziona molto bene anche.


0

Puoi usare hook_views_pre_execute (& $ view) per estendere la tua singola condizione a più campi che desideri

/**
 * 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);
        }
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.