使用CCK在Drupal中按节点创建日期访问字段

使用CCK在Drupal中按节点创建日期访问字段,drupal,cck,drupal-permissions,Drupal,Cck,Drupal Permissions,我正在寻找一种特定的行为,它根据节点的创建日期和时间授予查看一个或多个cck字段的权限 我尤其需要: 授予角色A:完全访问所有CCK旧版和新版 授予角色B:访问所有CCK,但仅访问节点中1年以上的CCK 匿名用户:无法访问CCK字段 如何获得此结果?很简单,创建节点-{YOURTYPE}.tpl.php,对其进行主题化,并添加条件以显示字段对日期的依赖性…很简单,创建节点-{YOURTYPE}.tpl.php,对其进行主题化,并添加条件以显示字段对日期的依赖性…我将在自定义模块中实现,并在$op

我正在寻找一种特定的行为,它根据节点的创建日期和时间授予查看一个或多个cck字段的权限

我尤其需要:

授予角色A:完全访问所有CCK旧版和新版 授予角色B:访问所有CCK,但仅访问节点中1年以上的CCK 匿名用户:无法访问CCK字段


如何获得此结果?

很简单,创建节点-{YOURTYPE}.tpl.php,对其进行主题化,并添加条件以显示字段对日期的依赖性…

很简单,创建节点-{YOURTYPE}.tpl.php,对其进行主题化,并添加条件以显示字段对日期的依赖性…

我将在自定义模块中实现,并在$op=='view'上检查正确的节点类型和用户角色。根据角色的不同,我将从“$node->content”数组中删除有问题的字段条目

请注意,需要在CCK之后调用自定义模块,以使其工作,否则,“$node->content”数组中的CCK字段尚不可用。因此,根据其名称,可能需要将自定义模块的权重更改为高于CCK的值

如果同样的逻辑也需要应用于节点编辑表单,则可以在$op=='prepare'上执行相同的操作。

我将在自定义模块中实现,并在$op=='view'上检查正确的节点类型和用户角色。根据角色的不同,我将从“$node->content”数组中删除有问题的字段条目

请注意,需要在CCK之后调用自定义模块,以使其工作,否则,“$node->content”数组中的CCK字段尚不可用。因此,根据其名称,可能需要将自定义模块的权重更改为高于CCK的值


如果同样的逻辑也需要应用于节点编辑表单,则可以在$op='prepare'上执行相同的操作。

您希望控制字段级别的权限,因此我将避免使用hook\u nodeapi,我建议您使用hook\u field\u访问,或者使用hook\u nodeapi和hook\u field\u访问的组合

伪代码中的示例:

mymodule_hook_field_access($op, $field, $account = NULL, $node = NULL){

    if($field['field_name'] == 'field_xyz'){
        switch($op){
            case 'view':
                if($node->created was less than a year ago && $account role is A){
                   return FALSE;
                }

                if($node->created was less than a year ago && $account role is B){
                 return TRUE;
                }

                return FALSE;
                break;
            case 'edit':
                ...
                ...
        }    
    }

    return TRUE;
}
查看以查看调用的钩子


Drupal 6中的CCK模块提供了hook_field_访问。在Drupal 7中,它位于核心。

您希望控制字段级别的权限,因此我将避免使用hook\u nodeapi,而我建议您使用hook\u field\u访问或使用hook\u nodeapi和hook\u field\u访问的组合

伪代码中的示例:

mymodule_hook_field_access($op, $field, $account = NULL, $node = NULL){

    if($field['field_name'] == 'field_xyz'){
        switch($op){
            case 'view':
                if($node->created was less than a year ago && $account role is A){
                   return FALSE;
                }

                if($node->created was less than a year ago && $account role is B){
                 return TRUE;
                }

                return FALSE;
                break;
            case 'edit':
                ...
                ...
        }    
    }

    return TRUE;
}
查看以查看调用的钩子


Drupal 6中的CCK模块提供了hook_field_访问。在Drupal 7中,它位于核心。

感谢大家的建议

hook\u field\u访问是我正在寻找的解决方案

我以前使用过$node->field\u FIELDNAME[0]['value'],但我不喜欢将主题或template.php函数用于用户访问。还有主题化的问题,这个解决方案没有给我提供一个使用语义CCK模块的简单和干净的HTML输出的可能性

再次感谢! 再见


为什么我的帖子不是在最后一篇之后

谢谢大家的建议

hook\u field\u访问是我正在寻找的解决方案

我以前使用过$node->field\u FIELDNAME[0]['value'],但我不喜欢将主题或template.php函数用于用户访问。还有主题化的问题,这个解决方案没有给我提供一个使用语义CCK模块的简单和干净的HTML输出的可能性

再次感谢! 再见


为什么我的帖子不是在最后一篇之后

我认为这不可行,因为CCK字段在节点模板中不单独可用,但已经在$content变量中呈现。但是,如果找到合适的CCK字段模板或主题函数,覆盖它而不是节点模板,那么一般的方法可能会起作用。这将起作用,而且是一种不用自定义模块hook_nodeapi隐藏字段的方法。只需删除$content,这不利于主题化。使用$node->field\u FIELDNAME[0]['value'],通过print\r或dsm devel模块函数调查$node。@Nikit:我明白了-当然,如果您扔掉$content变量并直接输出nodes字段,您可以做任何您想做的事情。但是你也可以绕过Drupals主题系统的主要部分,扔掉其他模块可能对内容所做的任何定制!我认为这是一个很不礼貌的建议,因为它可能会简单地破坏其他功能。亨利克,我不同意,主题是在发送给用户之前最有效的事情,所以它比通过HoojnNoDAPI或其他钩子来删除字段更安全。@ NITKIT:我并不是说它不安全。但它破坏了其他功能。例如:启用CCK后,可以调整后端UI admin/content/node type/[yourNodeType]/fields中字段的输出顺序。在那里定义的顺序将在$content变量中使用。在你的方法中,这种顺序将被完全忽略,因为点头

e模板将定义自己的顺序。既然你知道这一点,那么如果它是你自己的网站,那也没关系。但是如果该站点被其他人使用,他们会认为他们可以调整UI中的顺序,但会失败,因为您将忽略他们的设置。我认为这不起作用,因为CCK字段在节点模板中不单独可用,但已经在$content变量中呈现。但是,如果找到合适的CCK字段模板或主题函数,覆盖它而不是节点模板,那么一般的方法可能会起作用。这将起作用,而且是一种不用自定义模块hook_nodeapi隐藏字段的方法。只需删除$content,这不利于主题化。使用$node->field\u FIELDNAME[0]['value'],通过print\r或dsm devel模块函数调查$node。@Nikit:我明白了-当然,如果您扔掉$content变量并直接输出nodes字段,您可以做任何您想做的事情。但是你也可以绕过Drupals主题系统的主要部分,扔掉其他模块可能对内容所做的任何定制!我认为这是一个很不礼貌的建议,因为它可能会简单地破坏其他功能。亨利克,我不同意,主题是在发送给用户之前最有效的事情,所以它比通过HoojnNoDAPI或其他钩子来删除字段更安全。@ NITKIT:我并不是说它不安全。但它破坏了其他功能。例如:启用CCK后,可以调整后端UI admin/content/node type/[yourNodeType]/fields中字段的输出顺序。在那里定义的顺序将在$content变量中使用。在您的方法中,这种顺序将被完全忽略,因为节点模板将定义自己的顺序。既然你知道这一点,那么如果它是你自己的网站,那也没关系。但是如果该站点被其他人使用,他们会认为他们可以调整UI中的顺序,但是会失败,因为你会忽略他们的设置。你的帖子不会在最后一个之后,因为顺序是基于stackoverflow上的投票。您可以通过左侧数字周围的小箭头向上和向下投票问题以及答案。所以你应该投票给NoParrots,因为它对你很有用。作为提问者,你也可以接受正确的答案。这将把答案放在首位,而不管投票结果如何,这样其他人就可以更容易地找到答案。向上投票和回答接受给作者一些声誉分数,所以投票要自由——投票系统是stackoverflow工作的主要原因+1.后续行动。虽然通常情况下,你不应该将后续内容作为一个单独的答案发布,但只需接受正确的答案,并在该答案的评论中添加你的评论。既然你似乎最喜欢我的答案,为什么不将其标记为正确:-。你也可以投弃权票!您的帖子不在最后一篇之后,因为订单是基于stackoverflow上的投票。您可以通过左侧数字周围的小箭头向上和向下投票问题以及答案。所以你应该投票给NoParrots,因为它对你很有用。作为提问者,你也可以接受正确的答案。这将把答案放在首位,而不管投票结果如何,这样其他人就可以更容易地找到答案。向上投票和回答接受给作者一些声誉分数,所以投票要自由——投票系统是stackoverflow工作的主要原因+1.后续行动。虽然通常情况下,你不应该将后续内容作为一个单独的答案发布,但只需接受正确的答案,并在该答案的评论中添加你的评论。既然你似乎最喜欢我的答案,为什么不将其标记为正确:-。你也可以投弃权票+1-不知道这个钩子-比我的钩子建议简单多了+1-不知道这个钩子-比我的钩子建议简单多了!