从搜索中隐藏Drupal节点

时间:2009-11-17 13:23:02

标签: php search drupal drupal-6 acl

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

私人部分中使用的内容类型将在网站的其他位置使用。

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

4 个答案:

答案 0 :(得分:3)

有一篇精彩的文章在lullabot网站上解释了这一点。

值得一读这篇文章的评论,因为那里的人建议采用其他方式,也就是使用contrib模块(而不是在你自己的代码中实现一些钩子)。 D6的代码也在评论中。

HTH!

答案 1 :(得分:1)

lullabot文章有点过时,包含许多直言不讳的方法。它还包含评论中的答案 - 适用于DP6的搜索限制模块,允许细粒度和基于角色的控制。其他所有内容都阻止内容被编入索引,如果内容的访问级别不同,或者平等地影响所有搜索查询,这可能是不可取的,如果存在不同的访问级别,这也将无效。

答案 2 :(得分:0)

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

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

注意:我假设您希望节点对有权访问私有区域的用户显示,但对“匿名”用户不显示。

答案 3 :(得分: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');
   }
 }
}