La cláusula LIKE no funciona en la consulta de enlace alter


9

Estoy tratando de reemplazar la búsqueda predeterminada con una cláusula LIKE en Drupal 7. Intenté alterar la consulta de acuerdo con Agregar una condición OR a una 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');
        }
      }
    }
  }
}

La búsqueda con la palabra "declaración" muestra los mismos resultados que la búsqueda predeterminada de drupal, pero la búsqueda con "rechazo" no encuentra ningún resultado.

¿Alguna idea de por qué mi código no funciona?


1
El módulo drupal.org/project/fuzzysearch debería resolver su problema. Puedes intentarlo ..
Anil Sagar

Gracias. Preferiría una solución con hook_query_alter (si es posible) ya que el formulario de búsqueda y la página de resultados ya están configurados. También me gustaría saber por qué mi código no funciona para otros casos de uso.
user9932

1
Puede parecer que estás al 90% del camino y solo necesitas esta pieza final para que funcione, pero creo que estás yendo por el camino equivocado. Hay muchos módulos de búsqueda para tratar todo tipo de casos de uso, y estoy seguro de que encontrará uno para resolver el suyo. El uso de este tipo de intervención probablemente generará confusión y falta de mantenimiento.
Alan Dixon

¿Alguna vez has intentado imprimir lo que se lleva en $searchvariable? $ search = $ args [': db_condition_placeholder_1']; Si es de vistas, vaya hook_views_query_alter(), sería simple.

Respuestas:


0

¿Has intentado cambiar el gancho que estás utilizando MYMODULE_query_alter?

Está implementando hook_query_TAG_alter (), y no veo dónde se etiqueta la consulta de búsqueda como tal.

Por la API del nodo :

Este es el hook_query_alter () para consultas etiquetadas con 'node_access'. Agrega comprobaciones de acceso a los nodos para la cuenta de usuario proporcionada por los metadatos 'cuenta' (o $ usuario global si no se proporciona), para una operación dada por los metadatos 'op' (o 'vista' si no se proporciona; otro los valores posibles son 'actualizar' y 'eliminar')


0
module_query_tagName_tag_alter(QueryAlterableInterface $query)

Use esto y ponga un nombre de etiqueta en la view->queryconfiguración. Al usar esto, también puede diferenciar las vistas.


0

Para agregar una nueva condición, también puede probar lo anterior con add_where

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

Espero que esto le dé el resultado que está buscando.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.