La clause LIKE ne fonctionne pas dans la requête de hook


9

J'essaie de remplacer la recherche par défaut par une clause LIKE dans Drupal 7. J'ai essayé de modifier la requête en fonction de l' ajout d'une condition OU à une requête existante :

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 recherche avec le mot "déclaration" affiche les mêmes résultats que la recherche drupal par défaut, mais la recherche avec "décl" ne trouve aucun résultat.

Des idées pourquoi mon code ne fonctionne pas?


1
Le module drupal.org/project/fuzzysearch devrait résoudre votre problème. Vous pouvez l'essayer ..
Anil Sagar

Je vous remercie. Je préférerais une solution avec hook_query_alter (si possible) car le formulaire de recherche et la page de résultats sont déjà configurés. Je voudrais aussi savoir pourquoi mon code ne fonctionne pas pour d'autres cas d'utilisation.
user9932

1
Il peut sembler que vous êtes à 90% du chemin et que vous avez juste besoin de cette dernière pièce pour le faire fonctionner, mais je pense que vous allez dans le mauvais sens. Il existe de nombreux modules de recherche pour traiter toutes sortes de cas d'utilisation, et je suis sûr que vous en trouverez un pour résoudre le vôtre. L'utilisation de ce type d'intervention conduira probablement à la confusion et à la non-maintenance.
Alan Dixon

Avez-vous déjà essayé d'imprimer ce qui est transporté en $searchvariable? $ search = $ args [': db_condition_placeholder_1']; Si c'est du point de vue, hook_views_query_alter()ce serait simple.

Réponses:


0

Avez-vous essayé de changer le crochet que vous utilisez MYMODULE_query_alter?

Vous implémentez hook_query_TAG_alter (), et je ne vois pas où la requête de recherche est balisée en tant que telle.

Selon l' API Node :

Il s'agit du hook_query_alter () pour les requêtes marquées avec 'node_access'. Il ajoute des vérifications d'accès aux nœuds pour le compte d'utilisateur fourni par les métadonnées `` compte '' (ou global $ user s'il n'est pas fourni), pour une opération donnée par les métadonnées `` op '' (ou `` voir '' s'il n'est pas fourni; autre les valeurs possibles sont «mettre à jour» et «supprimer»)


0
module_query_tagName_tag_alter(QueryAlterableInterface $query)

Utilisez-le et mettez un nom de balise dans le view->queryparamètre. En l'utilisant, vous pouvez également différencier les vues.


0

Pour ajouter une nouvelle condition, vous pouvez également essayer ce qui précède avec add_where

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

J'espère que cela donnera le résultat que vous recherchez.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.