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.