Die LIKE-Klausel funktioniert nicht in der Änderung der Hook-Abfrage


9

Ich versuche, die Standardsuche in Drupal 7 durch eine LIKE-Klausel zu ersetzen. Ich habe versucht, die Abfrage gemäß Hinzufügen einer ODER-Bedingung zu einer vorhandenen Abfrage zu ändern :

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');
        }
      }
    }
  }
}

Bei der Suche mit dem Wort "Deklaration" werden dieselben Ergebnisse wie bei der Standard-Drupal-Suche angezeigt, bei der Suche mit "Deklaration" werden jedoch keine Ergebnisse gefunden.

Irgendwelche Ideen, warum mein Code nicht funktioniert?


1
Das Modul drupal.org/project/fuzzysearch sollte Ihr Problem lösen. Sie können es versuchen ..
Anil Sagar

Danke. Ich würde eine Lösung mit hook_query_alter (wenn möglich) bevorzugen, da das Suchformular und die Ergebnisseite bereits eingerichtet sind. Ich möchte auch wissen, warum mein Code für andere Anwendungsfälle nicht funktioniert.
user9932

1
Es mag so aussehen, als wären Sie zu 90% auf dem Weg dorthin und brauchen nur dieses letzte Stück, damit es funktioniert, aber ich denke, Sie gehen es falsch an. Es gibt viele Suchmodule für alle Arten von Anwendungsfällen, und ich bin sicher, Sie werden eines finden, um Ihre zu lösen. Die Verwendung dieser Art von Intervention wird wahrscheinlich zu Verwirrung und Unwartbarkeit führen.
Alan Dixon

Haben Sie jemals versucht, durch Drucken der $searchVariablen zu drucken ? $ search = $ args [': db_condition_placeholder_1']; Wenn es aus Sicht ist, hook_views_query_alter()wäre es einfach.

Antworten:


0

Haben Sie versucht, den verwendeten Haken zu wechseln MYMODULE_query_alter?

Sie implementieren hook_query_TAG_alter (), und ich sehe nicht, wo die Suchabfrage als solche gekennzeichnet ist.

Gemäß der Knoten-API :

Dies ist der hook_query_alter () für Abfragen, die mit 'node_access' gekennzeichnet sind. Es werden Knotenzugriffsprüfungen für das Benutzerkonto hinzugefügt, das von den Metadaten "Konto" angegeben wird (oder für den globalen Benutzer $, falls nicht angegeben), für eine Operation, die von den Metadaten "op" angegeben wird (oder "Ansicht", falls nicht angegeben; andere mögliche Werte sind 'update' und 'delete')


0
module_query_tagName_tag_alter(QueryAlterableInterface $query)

Verwenden Sie diese Option und geben Sie einen Tag-Namen in die view->queryEinstellung ein. Auf diese Weise können Sie auch Ansichten unterscheiden.


0

Um eine neue Bedingung hinzuzufügen, können Sie dies auch mit add_where versuchen

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

Ich hoffe, dass dies das gewünschte Ergebnis liefert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.