我已经完成了一个简单的“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()方法之外,该模型没有实际效果,只有哈希密码。
有没有人有想法?
答案 0 :(得分:1)
如果适用,使用Acl通常需要用户和组模型中的parnetNode()和bindNode()方法。
大多数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是一个很好的插件,可以为您自动执行此操作。