CakePHP想要访问ACL节点

时间:2013-04-30 05:46:48

标签: cakephp cakephp-2.0

我已经完成了一个简单的“change_email”函数及其视图和控制器中的所有内容。除了保存数据外,一切都工作正常。当我提交我的表单并且我的模型实际运行其save() - 方法CakePHP抛出错误:

  

AclNode :: node() - 找不到“Array”标识的Aro节点(   [Aro0.model] =>用户[Aro0.foreign_key] => 11)“

当然,他找不到节点,因为它尚未创建(当用户注册其帐户时,将不会自动创建节点)。我很好奇为什么我的模型想要找到节点,因为实际操作不需要它。

public function change_email()
    {
        if ($this->request->is("put")) {
            if (!empty($this->request->data)) {
                $this->User->validator()
                    ->add('password', array(
                        'valid' => array(
                            'rule' => 'validatePassword'
                        )
                    ))
                    ->add('email_confirm', array(
                        'valid' => array(
                            'rule' => 'validateEmail'
                        )
                    ));
                if ($this->User->save($this->request->data)) {
                    $this->set("status", true);
                }
            }
        }
    }

这是我在控制器中的代码。除了beforeFilter()方法之外,该模型没有实际效果,只有哈希密码。

有没有人有想法?

1 个答案:

答案 0 :(得分:1)

如果适用,使用Acl通常需要用户和组模型中的parnetNode()和bindNode()方法。

Using AclBehavior

  

大多数AclBehavior在您的模型上透明地工作   afterSave()。但是,使用它需要您的模型具有   parentNode()方法已定义。这是由AclBehavior使用的   确定父 - >子关系。模型的parentNode()方法   必须返回null或返回父模型引用。

属于User模型的Group模型

public function parentNode() {
    if (!$this->id && empty($this->data)) {
        return null;
    }
    $data = $this->data;
    if (empty($this->data)) {
        $data = $this->read();
    }
    if (!$data['User']['group_id']) {
        return null;
    } else {
        return array('Group' => array('id' => $data['User']['group_id']));
    }
}

public function bindNode($user) {
    return array('model' => 'Group', 'foreign_key' => $user['User']['group_id']);
}

Group模型中,或者User模型没有任何父关联,它应该返回null

public $actsAs = array('Acl' => array('type' => 'requester'));

public function parentNode() {
    return null;
}

您还需要确保使用新方法和控制器更新acos表。 AclExtras是一个很好的插件,可以为您自动执行此操作。