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