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

24

J'ai deux champs de profil utilisateur "Nom" et "Prénom". J'ai également une 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 la sauvegarde 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.

Sithu
la source
Jetez un œil à cette question drupal.stackexchange.com/questions/42366/… Peut-être que cela peut vous aider. Et non, vous devez faire un module. Oskar
Oskar Calvo
Cette fonctionnalité est intégrée dans le module de vues. Il ne nécessite aucune programmation. Cette vidéo youtube montre un exemple complet sur la façon de l'utiliser.
asiby

Réponses:

21

J'ai finalement trouvé une solution à cela . J'ai suivi la deuxième solution principale proposée bien que le blogueur l'ait personnellement utilisée hook_views_query_alter().

  1. installé le module Les filtres de vues se remplissent .
  2. a ajouté deux filtres "Prénom" et "Nom" (les deux ne doivent pas être exposés) et les a ajoutés à un groupe de filtres OU (Views 3 le prend en charge). 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 en dur.
Voici une autre référence utile.

Sithu
la source
Je ne pense pas que vous ayez besoin d'utiliser l'étape 2 - J'ai installé le module et utilisé un "Global: combine champs filter" qui a été exposé. J'ai sélectionné les deux champs dans les paramètres de ce champ combiné.
Laryn - CEDC.org
13

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.

Mona
la source
1
Cela devrait être la réponse acceptée
frazras
5

C'est vraiment facile.

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

Merci.

Shitanshu Mishra
la source
2

Fonctionne hors de la boîte

La méthode la plus simple consiste à utiliser le filtre «Termes de recherche», qui est la fonctionnalité principale de Views . 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.

Larzan
la source
0

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);
        }
    }
}
Mykola Mykolayovich Dolynskyi
la source