我有我的UsersController和edit.ctp视图。当我浏览/ users / edit / 1时,我看到填写了*****的密码字段(在实体User.php中填充哈希,使用DefaultPasswordHasher)。我的UsersTable.php有密码需要。
所以,我可以试试:
unset($user->password); // in edit() from UsersController.php
并设置[require => false]在edit.ctp中
当我保存时,我得到了
The user could not be saved. Please, try again.
因为在我的UsersTable.php中我有:
$validator
->requirePresence('password', 'create')
->notEmpty('password');
如果我试图从控制器留空,我会收到错误,如果我尝试填写实际密码,它会再次出现哈希值。
如何在不更改密码的情况下编辑任何用户?我可以从模型中设置它,还是需要输入密码?
提前致谢
答案 0 :(得分:2)
一些事情:
首先,如果您还没有,则可能需要将密码字段标记为hidden ,以防止它在toArray
来电中公开哈希或JSON视图。
其次,提供给patchEntity的任何数据字段都将经过验证并保存(正如您已发现的那样),即使该字段的值为空白。
如果您使用debug($user)
查看实体,您会注意到它会跟踪哪些字段是"脏",并且因为patchEntity看到您提交了密码字段(即使它是空白的) ),它将用户实体的password
设置为空白并将其标记为"脏"。即使您稍后致电unset($user->password)
,它仍然会记录它是脏的,因此它会尝试验证它的值。
您可以使用$export->setDirty('password', false);
标记字段清洁,但是当在表单中提交新密码时,它将无法保存。
更好的选择是在调用patchEntity之前检查密码字段是否为空,然后取消设置:
if ($this->request->is(['patch', 'post', 'put'])) {
$data = $this->request->getData();
if(empty($data['password'])){
unset($data['password']);
}
$user = $this->Users->patchEntity($user, $data);