it-swarm.it

Esporre il filtro singolo della combinazione di due campi nelle viste

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.

24
Sithu

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

  1. installato il modulo popolano i filtri Views .
  2. aggiunto due filtri "Nome" e "Cognome" (entrambi non devono essere esposti) e aggiunti a un OR gruppo di filtri (Views 3 supporta questo). Ho dovuto usare l'operatore " Contiene una 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.
Qui è un altro riferimento utile.

21
Sithu

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.

13
Mona

È davvero facile.

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

Grazie.

5
Shitanshu Mishra

Funziona fuori dalla scatola

Il modo più semplice per procedere è utilizzare il filtro "Termini di ricerca" che è Views funzionalità di base . Cercherà in tutti i campi dell'entità e restituirà 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.

2
Larzan

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);
        }
    }
}