当前位置: 首页>>技术问答>>正文


仅搜索当前活动的语言

webfans 技术问答 , , , 去评论

问题描述

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

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

最佳解决方案

您可以使用全球$language来了解您的语言。在“视图”中,您可以使用“内容:语言 – >当前用户语言”进行过滤。

次佳解决方案

使用明显未记录的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%基于优秀的Search Config模块。

用户与内容语言

某些站点可能已将语言检测配置为以用户首选语言显示界面,而页面内容则基于URL或内容语言显示。

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

$language = i18n_language_interface();

$language = i18n_language_content();

第三种解决方案

我有相同的要求,我使用了Custom search模块,其中包括一个名为Custom Search Internationalization的子模块:“仅搜索所有或当前语言的内容,以及所有标签和选择器翻译处理”(注意此模块还提供了其他一些有用的功能喜欢自定义搜索块)。完美的工作。

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2622.html,转载请务必附带本地址声明。