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?

użytkownik9932
źródło
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”)

Nels
źródło
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.

Bhupendraosd
źródło
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.

Manish Jain
źródło