仅搜索当前使用的语言


23

如何限制Drupal 7中默认搜索的结果,以仅带当前语言的节点?

我的网站有三种语言切换器;用户选择查看网站时要使用的语言。如果他搜索了某些内容,则结果页面会显示其他语言的结果。今天,我只有3种启用的语言,但我们计划将其扩展到6种或更多。

Answers:


2

您可以使用全局$language语言来了解您所使用的语言。在视图中,您可以使用“ content:language->当前用户语言”进行过滤。


3
这有什么帮助?您可以用节点替换搜索页面吗?这有什么缺点吗?
2013年

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

注意:基于出色的Search Config模块,此代码是100%。

用户与内容语言

某些网站可能配置了语言检测,以用户首选的语言显示界面,而页面内容是根据URL或内容语言显示的。

在这种情况下,请考虑更换

$language = i18n_language_interface();

$language = i18n_language_content();

工作完美,但会影响网站上的任何查询,例如从视图模块生成的查询,还是任何基于drupal的查询,而不是默认的“ search / node /%”?
mohamad salama

@mohamadsalama这将影响所有影响节点访问的搜索查询;换句话说,大多数视图查询应该受到影响,除非您在高级设置中特别禁用了节点访问检查(不在我的脑海中并且未经证实)。
Alex Weber 2014年

这不是未记录的钩子-实际上是hook_query_TAG_alter()钩子,其中标记为“ node_access”。我自己的代码还会检查以确保查询中没有语言条件,但其他方面非常相似。
John Fiala

4

我有相同的要求,并且使用了“ 定制搜索”模块,该模块包括一个名为“ 定制搜索国际化 ” 的子模块:“ 仅从所有或当前语言中搜索内容,以及所有标签和选择器的翻译处理 ”(请注意,该模块还提供了其他一些有用的帮助自定义搜索块等功能)。完美运作。


0

我不确定搜索核心是否支持它。

我看到了项目i18nluceneapi但目前不支持版本7。

我正在使用searchapi并创建构面语言:)。它可以根据您的情况使用,在搜索页面上创建构面和默认过滤器。


0

您可以使用显示套件模块,在其中可以选择选项“查看模式”->“语言”,该选项以当前语言和当前站点语言提供搜索结果。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.