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.
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()
.
Cela m'a donné une solution rapide sans codage dur.
Ici est une autre référence utile.
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.
C'est vraiment facile.
Merci.
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!
C'est tout, rien d'autre à faire (vous voudrez peut-être l'exposer cependant)
Il fonctionne très bien aussi.
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);
}
}
}