Expor um filtro único de combinação de dois campos nas visualizações

24

Eu tenho dois campos de perfil de usuário "Sobrenome" e "Nome". Eu também tenho uma lista de usuários. Desejo expor "Nome" como filtro, que pode pesquisar por Sobrenome e Nome. Como posso fazer um filtro único de combinação desses dois campos? Posso criá-lo a partir da interface do usuário do views?

Uma maneira possível é criar outro campo de perfil "Nome", que ficará oculto no formulário. No salvamento do usuário, eu combinaria os dois valores do campo no campo "Nome" e os exporia como filtro nas visualizações. Mas esta solução é codificada e precisa escrever ganchos.

Sithu
fonte
Dê uma olhada nesta pergunta drupal.stackexchange.com/questions/42366/… Talvez possa ajudá-lo. E não, você tem que fazer um módulo. Oskar
Oskar Calvo
Esse recurso foi criado no módulo de visualizações. Não requer programação. Este vídeo do youtube mostra um exemplo completo de como usá-lo.
asiby

Respostas:

21

Acabei conseguindo uma solução disso . Eu segui a segunda solução primária oferecida, embora o blogueiro tenha usado pessoalmente hook_views_query_alter().

  1. instalou o módulo Visualizações filtros preenchidos .
  2. adicionou dois filtros "Primeiro nome" e "Sobrenome" (ambos não devem ser expostos) e os adicionou a um grupo de filtros OR (as visualizações 3 suportam isso). Eu tive que usar o operador "Contém qualquer palavra" para ambos os campos, caso contrário, a consulta não me deu o resultado desejado.
  3. criou um filtro "Global: preencher filtros", adicionou os dois campos a ele e o expôs.

Isso me deu uma solução rápida sem codificação.
Aqui está outra referência útil.

Sithu
fonte
Eu não acho que você precise usar a etapa 2 - instalei o módulo e usei um "Global: combinar campos de filtro" que foi exposto. Selecionei os dois campos nas configurações desse campo combinado.
Laryn - CEDC.org
13

Na minha instalação, o D7 com Views 7.x-3.6, você pode adicionar um filtro "Global: Combine Field Filter" que fará exatamente o que você precisa, permitindo que os usuários pesquisem em vários campos com um único filtro.

Mona
fonte
11
Esta deve ser a resposta aceita
frazras
5

É realmente fácil.

  1. Clique em Adicionar um filtro.
  2. selecione "Global: combinar campos de filtro"
  3. Siga as instruções.

Obrigado.

Shitanshu Mishra
fonte
2

Trabalha fora da caixa

O caminho mais fácil é usar o filtro "Termos de pesquisa", que é a funcionalidade principal do Views . Ele pesquisará todos os campos da entidade e retornará o resultado, sem necessidade de módulo extra!

  1. Vá para o seu modo de exibição
  2. Adicione um novo filtro para visualizar
  3. Selecione "Pesquisar: termos de pesquisa"

É isso, nada mais a fazer (você pode querer expô-lo)

Ele executa muito bem também.

Larzan
fonte
0

Você pode usar hook_views_pre_execute (& $ view) para estender sua única condição a vários campos que você deseja

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