Поиск только по текущему активному языку

23

Как я могу ограничить результаты поиска по умолчанию в Drupal 7, чтобы выводить только узлы на текущем языке?

На моем сайте есть три языковых переключателя; Пользователь выбирает, какой язык он хочет использовать при просмотре сайта. Если он что-то ищет, страница результатов принесет результаты с других языков. Сегодня у меня есть только 3 включенных языка, но мы планируем расширить это до 6 или более.

Израиль Родригес
источник

Ответы:

2

Вы можете использовать глобальный, $languageчтобы узнать, на каком языке вы находитесь. В представлениях вы можете фильтровать, используя «контент: язык -> текущий язык пользователя».

Ahmed
источник
3
как это поможет? Вы могли бы заменить страницу поиска на узел? есть ли у этого недостатки?
перемычка
25

Есть действительно элегантный способ сделать это, используя явно недокументированное hook_query_node_access_alter():

function yourmodule_query_node_access_alter(QueryAlterableInterface $query) {
  $search = FALSE;
  $node = FALSE;

  // Even though we know the node alias is going to be "n", by checking for the
  // search_index table we make sure we're on the search page. Omitting this step will
  // break the default admin/content page.
  foreach ($query->getTables() as $alias => $table) {
    if ($table['table'] == 'search_index') {
      $search = $alias;
    }
    elseif ($table['table'] == 'node') {
      $node = $alias;
    }
  }

  // Make sure we're on the search page.
  if ($node && $search) {
    $db_and = db_and();
    // I guess you *could* use global $language here instead but this is safer.
    $language = i18n_language_interface();
    $lang = $language->language;

    $db_and->condition($node . '.language', $lang, '=');
    $query->condition($db_and);
  }
}

Примечание: этот код на 100% основан на превосходном модуле настройки поиска .

Язык пользователя против контента

Некоторые сайты могут иметь обнаружение языка, настроенное для отображения интерфейса на предпочитаемом языке пользователя, в то время как содержимое страницы отображается на основе URL-адреса или языка содержимого.

В этом случае рассмотрите возможность замены

$language = i18n_language_interface();

с

$language = i18n_language_content();
Алекс Вебер
источник
Прекрасно работает, но повлияет ли это на любой запрос на сайте, например, запрос, сгенерированный из модуля представлений, или любой другой запрос на основе друпалов, а не по умолчанию "search / node /%"?
Мохамад Салама
@mohamadsalama это повлияет на все поисковые запросы, которые влияют на доступ к узлу; другими словами, большинство запросов представлений должно быть затронуто, если вы специально не отключите проверку доступа к узлу в расширенных настройках (вне головы и неподтвержденных).
Алекс Вебер
Это не недокументированный хук - это на самом деле хук hook_query_TAG_alter (), где тегом является «node_access». Мой собственный код также проверяет, нет ли в запросе языкового условия, но в остальном он очень похож.
Джон Фиала
4

У меня были те же требования, и я использовал модуль пользовательского поиска , который включает подмодуль под названием « Интернационализация пользовательского поиска» : « поиск контента по всему или только на текущем языке, а также обработка перевода всех меток и селекторов » (обратите внимание, что этот модуль предоставляет также несколько других полезных такие функции, как пользовательские блоки поиска). Работает отлично.

Коджо
источник
0

Я не уверен, что поисковое ядро ​​поддерживает это.

Я вижу проект i18nluceneapi, но на данный момент он не поддерживает версию 7.

Я использую searchapi и создаю грани языка :). Он может использовать для вашего случая, создать фасеты и фильтр по умолчанию на странице поиска.

Санг Ле Тхань
источник
0

Вы можете использовать модуль Показать комплект, где вы можете выбрать опцию Режим просмотра-> Язык, которая дает результаты поиска на текущем языке, который находится на текущем языке сайта.

Акшай Савант
источник