我已经做了一个简单的"change_email"函数,它的视图和控制器中的所有东西。实际上,除了保存数据之外,一切都工作得很好。当我提交我的表单和我的模型实际上运行它的save()方法CakePHP抛出一个错误:
AclNode::node() -找不到由"Array() "标识的Aro节点[Aro0。model] => User [0.]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()方法只对密码进行哈希运算外,没有任何实际作用。
有人有什么想法吗?
如果使用Acl,通常需要在用户和组模型中使用parnetNode()和bindNode()方法。
使用AclBehavior
大多数AclBehavior在你的模型上透明地工作afterSave()。然而,使用它需要您的模型具有定义的parentNode()方法。这由AclBehavior来使用确定父->子关系。模型的parentNode()方法必须返回null或返回父模型引用。
属于Group
模型的User
模型内
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是一个很好的插件,可以为您自动执行此操作