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.


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.


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.


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.


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.


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);
        }
    }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.