web-dev-qa-db-fra.com

Exposer un seul filtre de combinaison de deux champs dans les vues

J'ai deux champs de profil utilisateur "Nom" et "Prénom". J'ai également une vue de liste d'utilisateurs. Je veux exposer "Nom" comme filtre qui peut rechercher à la fois le nom et le prénom. Comment puis-je faire un seul filtre de combinaison de ces deux champs? Puis-je le créer à partir de l'interface utilisateur des vues?

Une façon possible consiste à créer un autre champ de profil "Nom" qui sera masqué dans le formulaire. Lors de l'enregistrement de l'utilisateur, je combinerais les deux valeurs de champ dans le champ "Nom", puis je l'exposerais comme filtre dans les vues. Mais cette solution est codée en dur et elle doit écrire des crochets.

24
Sithu

J'ai finalement obtenu une solution de this . J'ai suivi la deuxième solution principale proposée bien que le blogueur ait personnellement utilisé hook_views_query_alter().

  1. installé le module Les filtres de vues remplissent .
  2. ajouté deux filtres "Prénom" et "Nom" (les deux ne doivent pas être exposés) et les a ajoutés à un groupe de filtres OR (Views 3 le supporte). J'ai dû utiliser l'opérateur " Contient n'importe quel mot "pour les deux champs, sinon la requête ne m'a donné aucun résultat souhaité.
  3. a créé un filtre "Global: remplir les filtres", a ajouté les deux champs dans celui-ci et l'a exposé.

Cela m'a donné une solution rapide sans codage dur.
Ici est une autre référence utile.

21
Sithu

Sur mon installation, D7 avec vues 7.x-3.6, vous pouvez ajouter un filtre qui est "Global: Combiner les filtres de champs" qui fera exactement ce dont vous avez besoin, permettra aux utilisateurs de rechercher sur plusieurs champs avec un seul filtre.

13
Mona

C'est vraiment facile.

  1. Cliquez sur Ajouter un filtre.
  2. sélectionnez "Global: filtre de champs combinés"
  3. Suivez les instructions.

Merci.

5
Shitanshu Mishra

Fonctionne hors de la boîte

La façon la plus simple de procéder consiste à utiliser le filtre 'Termes de recherche' qui est Vues fonctionnalité de base . Il va chercher dans tous les champs de l'entité et retourner le résultat, aucun module supplémentaire nécessaire!

  1. Accédez à votre vue
  2. Ajouter un nouveau filtre à afficher
  3. Sélectionnez 'Rechercher: Termes de recherche'

C'est tout, rien d'autre à faire (vous voudrez peut-être l'exposer cependant)

Il fonctionne très bien aussi.

2
Larzan

Vous pouvez utiliser hook_views_pre_execute (& $ view) pour étendre votre condition unique à plusieurs champs que vous souhaitez

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