我有一个用 drupal 构建的 wiki,有一个分类类别工作组,分配给用户和文章。我正在使用带有 facet api 的 apache solr 搜索模块,我的最终目标是设置搜索,以便默认情况下当用户搜索文章时,只显示来自他们工作组的文章。
也就是说,当他们从搜索框中启动搜索时,他们应该得到与 for /search/site/hello?f[0]=im_field_kb_workgroups%3A4529
(其中 4529 是一个工作组 ID)相同的结果,而不仅仅是/search/site/hello
(当前行为)用户仍然应该被允许在他们想要的时候在其他工作组方面进行搜索, 通过删除 facet 块中的复选框。
我几乎是通过破解 apachesolr 模块来完成这项工作的(我知道不推荐,但我真的希望它能工作)。在函数中apachesolr_search_custom_page_search_form_submit
,我有:
// Get the workgroup id
global $user;
$account = user_load($user->uid);
$user_kb_wg_fieldinfo = field_get_items('user', $account, 'field_kb_workgroups');
$user_kb_wg_tid= '';
if ($user_kb_wg_fieldinfo) {
$user_kb_wg_tid = $user_kb_wg_fieldinfo[0]['tid'];
}
// Add the solr filter for this workgroup facet so that by default, search results are
// fetched only from that workgroup.
if ($user_kb_wg_tid === '4529') {
$get['f[0]'] = 'im_field_kb_workgroups:4529';
}
这完成了工作,但问题是这依赖于 apachesolr 搜索表单。我有用户通过从 wiki 外部的站点搜索来访问 wiki,其中 wiki 搜索表单只是一个指向 KB 域和路径的简单 POST 表单/search
。因此,这仅在人们从 wiki 内部进行搜索时才有效,我会在其中向他们展示 apachesolr 搜索表单。
我调查了其他一些选择:
在我的自定义模块中,我实现了这个钩子(现在没有用户工作组检查,用于测试):
apachesolr 过滤分类 有大用 有大大用
function kb_hacks_apachesolr_query_prepare($query) {
$query->addFilter('im_field_kb_workgroups', '4529');
}
这会过滤所有地方的搜索结果,但过滤器会一直应用,用户无法取消选择此过滤器或其他过滤器。(事实上 ,其他过滤器仅在将过滤器作为 GET 参数传递时出现,如上面的 f[0])
我还玩过 url_inbound_alter 挂钩,但无法弄清楚如何将 solr 查询参数作为 GET 传递。以下没有工作。
function kb_hacks_url_inbound_alter(&$path, $original_path, $path_language) {
if ($path == 'search/site/hello') {
$_GET['f[0]'] = "im_field_kb_workgroups:4529";
//$_GET['f[0]'] = "im_field_kb_workgroups%3A4529";
//$path = 'search/site/hello?f[0]=im_field_kb_workgroups%3A4529;
}
}
有没有办法从此挂钩设置 GET 参数?但即使这有效,我仍然必须弄清楚如何仅在默认情况下(提交搜索表单时)执行此操作,而不是在取消选择过滤器本身时执行此操作。有没有办法检测构面块中的复选框更改?
也许还有另一种方法可以做到这一点?过去两天我一直被困在这里,非常感谢我能得到的任何帮助。谢谢!