A cláusula LIKE não funciona na alteração de consulta de gancho


9

Estou tentando substituir a pesquisa padrão por uma cláusula LIKE no Drupal 7. Tentei alterar a consulta de acordo com Adicionando uma condição OR a uma consulta existente :

function MYMODULE_query_node_access_alter(QueryAlterableInterface $query) {
  foreach ($query->getTables() as $table) {
    // LIKE for search results.
    if ($table['table'] == 'search_index') {
      // Get the query args and then the search term
      $args =& $query->getArguments();
      $search = $args[':db_condition_placeholder_1'];

      // Get a reference to the existing query conditions.
      $conditions =& $query->conditions();

      // Save the former conditions
      $former_conditions = $conditions;

      // Reset the condition array. It needs a default #conjunction for which AND is fine
      $conditions = array('#conjunction' => array_shift($former_conditions));

      // Replace the search condition in the query
      foreach ($former_conditions as $key => $condition) {
        if ($key != 1) {
          $query->condition($condition['field'], $condition['value'], $condition['operator']);
        }
        else {
          $query->condition('i.word', '%' . db_like($search) . '%', 'LIKE');
        }
      }
    }
  }
}

A pesquisa com a palavra "declaração" exibe os mesmos resultados que a pesquisa drupal padrão, mas a pesquisa com "decl" não encontra nenhum resultado.

Alguma idéia de por que meu código não está funcionando?


11
O módulo drupal.org/project/fuzzysearch deve resolver seu problema. Você pode experimentá-lo ..
Anil Sagar

Obrigado. Eu preferiria uma solução com hook_query_alter (se possível), pois o formulário de pesquisa e a página de resultados já estão configurados. Também gostaria de saber por que meu código não está funcionando para outros casos de uso.
User9932

11
Pode parecer que você está 90% do caminho até lá e só precisa desta peça final para fazê-la funcionar, mas acho que você está fazendo o caminho errado. Existem muitos módulos de pesquisa para lidar com todos os tipos de casos de uso, e tenho certeza que você encontrará um para resolver o seu. O uso desse tipo de intervenção provavelmente levará a confusão e impossibilidade de manutenção.
Alan Dixon

Você já tentou imprimir o que é transportado em $searchvariável? $ search = $ args [': db_condition_placeholder_1']; Se é de vistas ir para hook_views_query_alter()seria simples.

Respostas:


0

Você já tentou mudar o gancho que está usando MYMODULE_query_alter?

Você está implementando hook_query_TAG_alter () e não vejo onde a consulta de pesquisa está marcada como tal.

Pela API do :

Este é o hook_query_alter () para consultas marcadas com 'node_access'. Ele adiciona verificações de acesso ao nó para a conta de usuário fornecida pelos metadados da 'conta' (ou usuário global $, se não fornecido), para uma operação fornecida pelos metadados 'op' (ou 'exibição' se não for fornecida; os valores possíveis são 'update' e 'delete')


0
module_query_tagName_tag_alter(QueryAlterableInterface $query)

Use isso e coloque um nome de tag na view->queryconfiguração. Ao usar isso, você também pode diferenciar visualizações.


0

Para adicionar uma nova condição, você também pode tentar o acima com add_where

$query->add_where(1,'i.word', '%' . db_like($search) . '%', 'LIKE');

Espero que isso dê o resultado que você está procurando.

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.