Klauzula LIKE nie działa w zapytaniu przechwytującym alter


9

Próbuję zastąpić domyślne wyszukiwanie klauzulą ​​LIKE w Drupal 7. Próbowałem zmienić zapytanie zgodnie z dodaniem warunku OR do istniejącego zapytania :

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

Wyszukiwanie za pomocą słowa „deklaracja” wyświetla te same wyniki, co domyślne wyszukiwanie drupal, ale wyszukiwanie za pomocą „decl” nie powoduje żadnych wyników.

Wszelkie pomysły, dlaczego mój kod nie działa?


1
moduł drupal.org/project/fuzzysearch powinien rozwiązać Twój problem. Możesz spróbować ...
Anil Sagar,

Dziękuję Ci. Wolę rozwiązanie z hook_query_alter (jeśli to możliwe), ponieważ formularz wyszukiwania i strona wyników są już skonfigurowane. Chciałbym również wiedzieć, dlaczego mój kod nie działa w innych przypadkach użycia.
user9932

1
Może się wydawać, że jesteś na 90% drogi i potrzebujesz tylko tego ostatniego kawałka, aby działał, ale myślę, że podchodzisz do tego niewłaściwie. Istnieje wiele modułów wyszukiwania do obsługi wszelkiego rodzaju przypadków użycia i jestem pewien, że znajdziesz taki, który rozwiąże twój. Korzystanie z tego rodzaju interwencji prawdopodobnie doprowadzi do zamieszania i niemożności utrzymania.
Alan Dixon

Czy kiedykolwiek próbowałeś, drukując to, co jest przechowywane w $searchzmiennej? $ search = $ args [': db_condition_placeholder_1']; Gdyby pochodziło z widoków, hook_views_query_alter()to byłoby proste.

Odpowiedzi:


0

Czy próbowałeś zmienić hak, którego używasz MYMODULE_query_alter?

Wdrażasz hook_query_TAG_alter () i nie widzę, gdzie zapytanie wyszukiwania jest oznaczone jako takie.

Zgodnie z interfejsem API Node :

To jest hook_query_alter () dla zapytań oznaczonych „node_access”. Dodaje sprawdzanie dostępu do węzła dla konta użytkownika podanego przez meta-dane „konta” (lub globalnego użytkownika $, jeśli nie podano), dla operacji podanej przez meta-dane „op” (lub „widok”, jeśli nie podano; inne możliwe wartości to „aktualizacja” i „usunięcie”)


0
module_query_tagName_tag_alter(QueryAlterableInterface $query)

Użyj tego i ustaw nazwę tagu w view->queryustawieniu. Korzystając z tego, możesz również różnicować widoki.


0

Aby dodać nowy warunek, możesz również wypróbować powyższe za pomocą add_where

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

Mam nadzieję, że da to wynik, którego szukasz.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.