2009-11-17 57 views
2

我通过编写一个模块检查RERQUEST_URI以获取该部分以及用户角色,从而在drupal站点上创建了一个私有部分。我现在遇到的问题是如何防止这些节点/视图出现在搜索中。从搜索中隐藏Drupal节点

私人部分中使用的内容类型在网站的其他地方使用。

什么是让Druapl搜索忽略内容/不索引/不在搜索结果中显示的最佳方式?

回答

3

有一篇很好的文章解释了这个在lullabot网站上。

这篇文章也值得阅读,因为那里的人们建议使用替代方法来做到这一点,也是通过contrib模块的意思(而不是在你自己的代码中实现一些钩子)。代码D6也在评论中。

HTH!

+0

尼斯 - 我喜爱的一个;-) – DilbertDave 2009-11-17 17:09:46

+0

Lullabot的我指出了正确的方向。谢谢! – easement 2009-11-20 20:07:10

+0

很高兴听到...快乐编码吧! ;) – mac 2009-11-21 14:31:04

0

如果私人部分中使用的内容类型也在其他地方使用,你希望如何过滤它们的搜索结果(请注意,我还没有看过Mac的lullabot文章)。

基本上,如果你看看两个节点的细节,一个是私人的还是一个公共的,它们有什么区别?

注意:我假设您希望节点出现给有权访问“私有”区域的用户,而不是“匿名”用户。

+0

区别它们的是URL路径,可能在菜单中的位置。我不反对添加只包含“私人”标签的分类标准,如果它能让我到达那里。 – easement 2009-11-17 17:03:25

+0

我明白了 - 您希望根据用户在系统中的位置限制结果。如果他们在私人区域,那么这些节点将被包括在内,但如果他们在外面则不会。如果是这样的话(乍一看)lullabot文章可能会让你到那里。 – DilbertDave 2009-11-17 17:08:05

1

lullabot文章有点过时,包含许多钝的方法。它还包含评论中的答案 - 搜索限制模块,适用于DP6并允许进行细粒度和基于角色的控制。其他一切都会阻止内容被索引,如果内容访问级别不同,或者同样影响所有搜索查询,这可能并不合适,如果访问级别不同,这也不起作用。

0

对于Drupal 7. 您可以使用自定义字段来隐藏搜索结果中的节点。在我的情况下,我创建了一个名为归档的自定义字段以获得所需的内容类型,并且在该自定义字段的帮助下,您可以编写my_module_query_alter功能。

代码

function my_module_query_alter(QueryAlterableInterface $query) { 
$is_search = $is_node_search = FALSE; 
$node_alias = FALSE; 
foreach ($query->getTables() as $table) { 
    if ($table['table'] == 'search_index' || $table['table'] == 'tracker_user') { 
    $is_search = TRUE; 
    } 
    if ($table['table'] == 'node' || $table['table'] == 'tracker_user') { 
    $node_alias = $table['alias']; 
    $is_node_search = TRUE; 
    } 
} 

if ($is_search && $is_node_search) { 
    $nids = []; 
    // Run entity field query to get nodes that are 'suppressed from public'. 
    $efq = new EntityFieldQuery(); 
    $efq->entityCondition('entity_type', 'node') 
    ->fieldCondition('field_archive', 'value', 1, '='); 
    $result = $efq->execute(); 
    if (isset($result['node'])) { 
    $nids = array_keys($result['node']); 
    } 
    if (count($nids) > 0) { 
    $query->condition(sprintf('%s.nid', $node_alias), $nids, 'NOT IN'); 
    } 
} 
}