Предложение LIKE не работает при изменении запроса хука


9

Я пытаюсь заменить поиск по умолчанию предложением LIKE в Drupal 7. Я пытался изменить запрос в соответствии с добавлением условия OR к существующему запросу :

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

Поиск со словом «объявление» отображает те же результаты, что и поиск по умолчанию в друпе, но поиск с помощью «decl» не находит никаких результатов.

Есть идеи, почему мой код не работает?


1
Модуль drupal.org/project/fuzzysearch должен решить вашу проблему. Вы можете попробовать ...
Анил Сагар

Спасибо. Я бы предпочел решение с hook_query_alter (если возможно), так как форма поиска и страница результатов уже настроены. Я также хотел бы знать, почему мой код не работает для других случаев использования.
user9932

1
Может показаться, что вы находитесь на 90% пути и вам просто нужна эта последняя часть, чтобы заставить ее работать, но я думаю, что вы делаете это неправильно. Существует множество поисковых модулей, предназначенных для всех видов использования, и я уверен, что вы найдете тот, который решит ваш. Использование такого рода вмешательства, вероятно, приведет к путанице и невозможности обслуживания.
Алан Диксон

Вы когда-нибудь пробовали печатать то, что передается в $searchпеременной? $ search = $ args [': db_condition_placeholder_1']; Если бы это было из представлений, пойти hook_views_query_alter()было бы просто.

Ответы:


0

Вы пытались сменить используемый крючок MYMODULE_query_alter?

Вы реализуете hook_query_TAG_alter (), и я не вижу, где поисковый запрос помечен как таковой.

Согласно Node API :

Это hook_query_alter () для запросов, помеченных как 'node_access'. Он добавляет проверки доступа к узлу для учетной записи пользователя, заданной метаданными «account» (или глобальным $ user, если не указан), для операции, заданной метаданными «op» (или «view», если не предоставлено; Возможные значения: «обновить» и «удалить»)


0
module_query_tagName_tag_alter(QueryAlterableInterface $query)

Используйте это и введите имя тега в view->queryнастройках. Используя это, вы также можете различать виды.


0

Чтобы добавить новое условие, вы также можете попробовать выше с add_where

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

Я надеюсь, что это даст результат, который вы ищете.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.