Exponer un filtro único de combinación de dos campos en vistas

24

Tengo dos campos de perfil de usuario "Apellido" y "Nombre". También tengo una vista de lista de usuarios. Quiero exponer "Nombre" como filtro que puede buscar tanto el Apellido como el Nombre. ¿Cómo puedo hacer un filtro único de combinación de esos dos campos? ¿Puedo crearlo desde la interfaz de usuario de vistas?

Una forma posible es crear otro campo de perfil "Nombre" que se ocultará en el formulario. Al guardar el usuario, combinaría los dos valores de campo en el campo "Nombre" y luego lo expondría como filtro en las vistas. Pero esta solución es una codificación difícil y necesita escribir ganchos.

Sithu
fuente
Eche un vistazo a esta pregunta drupal.stackexchange.com/questions/42366/… Tal vez pueda ayudarlo. Y no, tienes que hacer un módulo. Oskar
Oskar Calvo
Esta característica está integrada en el módulo de vistas. Requiere cero programación. Este video de YouTube muestra un ejemplo completo sobre cómo usarlo.
asiby

Respuestas:

21

Finalmente obtuve una solución de esto . Seguí la segunda solución principal ofrecida, aunque el blogger la usó personalmente hook_views_query_alter().

  1. instaló el módulo Vistas de los filtros de población .
  2. agregó dos filtros "Nombre" y "Apellido" (ambos no deben exponerse) y los agregó a un grupo de filtros OR (Views 3 lo admite). Tuve que usar el operador "Contiene cualquier palabra" para ambos campos, de lo contrario la consulta no me dio el resultado deseado.
  3. creó un filtro "Global: rellenar filtros", agregó los dos campos y lo expuso.

Esto me dio una solución rápida sin codificación rígida.
Aquí hay otra referencia útil.

Sithu
fuente
No creo que necesite usar el paso 2: instalé el módulo y usé un "Global: filtro de campos combinados" que quedó expuesto. Seleccioné los dos campos dentro de la configuración de ese campo combinado.
Laryn - CEDC.org
13

En mi instalación, D7 con Vistas 7.x-3.6, puede agregar un filtro que es "Global: Filtro de campos combinados" que hará exactamente lo que necesita, permitiendo a los usuarios buscar en múltiples campos con un solo filtro.

Mona
fuente
1
Esta debería ser la respuesta aceptada
frazras
5

Es realmente facil.

  1. Haga clic en Agregar un filtro.
  2. seleccione "Global: filtro de campos combinados"
  3. Sigue las instrucciones.

Gracias.

Shitanshu Mishra
fuente
2

Funciona fuera de la caja

La forma más fácil de hacerlo es usar el filtro 'Términos de búsqueda', que es la funcionalidad principal de Vistas . Buscará en todos los campos de la entidad y devolverá el resultado, ¡no es necesario ningún módulo adicional!

  1. Ve a tu vista
  2. Agregar un nuevo filtro para ver
  3. Seleccione 'Buscar: Términos de búsqueda'

Eso es todo, nada más que hacer (es posible que desee exponerlo)

Se desempeña muy bien también.

Larzan
fuente
0

Puede usar hook_views_pre_execute (& $ view) para extender su condición individual a múltiples campos que desee

/**
 * 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
fuente