我正在寻找一种特定的行为,根据节点的创建日期时间授予查看一个或多个cck字段的权限。
特别需要:
授予角色A:完全访问所有CCK(新旧) 授予角色B:访问所有CCK,但只能访问节点OLDER中存在的CCK而不是1年 匿名用户:无权访问CCK字段
我怎样才能得到这个结果?
答案 0 :(得分:2)
您希望控制字段级别的权限,因此我会避免使用hook_nodeapi()
而是建议您使用hook_field_access
(或使用hook_nodeapi
和hook_field_access()
的组合
示例:
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;
}
看看被调用的钩子 http://api.lullabot.com/content_access
来自CCK模块的Drupal 6中提供了 hook_field_access()
。在Drupal 7中它是核心。
答案 1 :(得分:1)
我会在自定义模块中实现hook_nodeapi()
,并在$op == 'view'
上检查正确的节点类型和用户角色。根据角色,我将从'$ node-> content'数组中删除相关字段条目。
请注意,需要在CCK之后调用自定义模块才能使其工作,否则CCK字段在`$ node-> content'数组中尚不可用。因此,根据其名称,可能需要将自定义模块权重更改为高于CCK的值。
如果同样需要对节点编辑表单应用逻辑,可以在$op == 'prepare'
上执行相同的操作。
答案 2 :(得分:1)
感谢大家的建议!
hook_field_access()是我正在寻找的解决方案。
我之前使用的是 $ node-> field_FIELDNAME [0] ['#value'] ,但我不想为用户添加我的主题(或template.php)函数访问。还有主题问题,这个解决方案没有使用语义CCK 模块提供简单,干净的HTML输出的可能性!
再次感谢! 再见!
聚苯乙烯。为什么我的帖子不是最后一个?? !!
答案 3 :(得分:0)
这很容易,创建node- {YOURTYPE} .tpl.php,主题它,并添加条件以显示日期中的字段依赖...