1

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

特别是我需要:

授予角色 A:对所有 CCK(旧的和新的)的完全访问权限 授予角色 B:访问所有 CCK,但仅限于节点中存在的 OLDER 超过 1 年 匿名用户:无权访问 CCK 字段

我怎样才能得到这个结果?

4

4 回答 4

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的钩子

hook_field_access()可从 CCK 模块的 Drupal 6 中获得。在 Drupal 7 中,它是核心。

于 2010-09-17T16:26:33.840 回答
1

我将hook_nodeapi()在自定义模块中实现,并$op == 'view'检查正确的节点类型和用户角色。根据角色,我会从 `$node->content' 数组中删除相关字段条目。

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

如果同样的逻辑也需要应用于节点编辑表单,可以在$op == 'prepare'.

于 2010-09-16T21:43:59.937 回答
1

感谢大家的建议!

hook_field_access() 是我正在寻找的解决方案。

我以前使用过$node->field_FIELDNAME[0]['#value']但我不喜欢将我的主题(或 template.php)函数放入用户访问。还有主题的问题,这个解决方案没有给我使用Semantic CCK模块简单和干净的 HTML 输出的可能性!

再次感谢!再见!

附言。为什么我的帖子不是在最后一个之后??!!

于 2010-09-18T12:24:23.283 回答
0

很简单,创建 node-{YOURTYPE}.tpl.php,为其设置主题,并添加条件以显示来自日期的字段依赖...

于 2010-09-16T20:49:35.630 回答