1

我用它的视图和控制器中的所有东西完成了一个简单的“change_email”功能。除了保存数据外,一切实际上都运行良好。当我提交表单并且我的模型实际运行它的 save() 方法时,CakePHP 会抛出一个错误:

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

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

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() 方法外,该模型没有任何实际效果。

有人有想法吗?

4

1 回答 1

1

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

使用 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是一个不错的插件,可以为您自动执行此操作。

于 2013-04-30T06:38:09.490 回答