Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从搜索中隐藏Drupal节点_Php_Search_Drupal_Drupal 6_Acl - Fatal编程技术网

Php 从搜索中隐藏Drupal节点

Php 从搜索中隐藏Drupal节点,php,search,drupal,drupal-6,acl,Php,Search,Drupal,Drupal 6,Acl,我在drupal站点上创建了一个私有部分,通过编写一个模块来检查该部分的RERQUEST_URI以及用户角色。我现在遇到的问题是如何防止这些节点/视图出现在搜索中 “专用”部分中使用的内容类型将在网站的其他位置使用 让Druapl search忽略内容/不索引/不在搜索结果中显示内容的最佳方法是什么?网站上有一篇精彩的文章解释了这一点 这篇文章的评论也值得一读,因为那里的人建议了其他方法,也可以通过contrib模块(而不是在自己的代码中实现一些钩子)来实现。注释中也有D6的代码 嗯 如果私人部

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

“专用”部分中使用的内容类型将在网站的其他位置使用


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

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

这篇文章的评论也值得一读,因为那里的人建议了其他方法,也可以通过contrib模块(而不是在自己的代码中实现一些钩子)来实现。注释中也有D6的代码


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

基本上,如果查看两个节点(一个私有节点和一个公共节点)的详细信息,它们之间的区别是什么


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

摇篮曲文章有点过时,包含许多直截了当的方法。它还包含注释中的答案-搜索限制模块,适用于DP6,允许细粒度和基于角色的控制。其他一切要么阻止内容被索引,如果对内容有不同的访问级别,这可能是不可取的;要么同等地影响所有搜索查询,如果有不同的访问级别,这也将不起作用。

对于Drupal 7。 可以使用自定义字段从搜索结果中隐藏节点。在我的例子中,我已经创建了一个名为“存档”的自定义字段,以满足所需的内容类型,在该自定义字段的帮助下,您可以编写“我的模块查询更改”功能

代码

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

它们之间的区别在于URL路径以及它们在菜单中的位置。我并不反对添加只包含“private”标记的分类法,如果它能让我达到目的的话。我明白了-你想根据用户在系统中的位置限制结果。如果它们位于专用区域,则这些节点将被包括在内,但如果它们位于外部,则不包括在内。如果是这样的话(乍一看),摇篮曲的文章可能会让你达到目的。很高兴听到。。。那就快乐编码吧!;)