我在网上,cakePHP book / API和StackOverflow上搜索过,但似乎无法找到答案。我遇到的问题是为我正在构建的应用程序创建用户。我的控制器中的添加操作的密码验证规则工作正常 - 没有任何问题,甚至Auth组件也很满意。我已经创建了一个与我的数据模型完美匹配的change_password动作(如实际发生的 - 更改),但是没有对它应用验证,即使我将表单字段命名为与添加操作完全相同。
多个操作可以不共享相同的验证吗?我是否必须在change_password操作中稍微重命名我的表单ID,然后创建新的验证变量来匹配这些?这对我来说似乎效率很低,但如果我不得不走这条路,我会。
非常感谢!! 约翰
编辑,现在添加代码段,因为它似乎是合适的。
首先是行动:
function change_password($id = null) {
if (!empty($this->data)) {
if (!empty($this->data['User']['passwd'])) {
$this->data['User']['password'] = $this->Auth->password($this->data['User']['passwd']);
}
if ($this->User->save($this->data)) {
$this->Session->setFlash('Password has been changed');
$this->redirect(array('controller' => 'bookings', 'action' => 'index'));
} else {
$this->Session->setFlash('Password could not be changed');
}
}
现在验证规则(再次注意这些对我的添加操作非常有效,它们只是在change_password中失败):
var $validate = array(
'first_name' => array(
'notempty' => array('rule' => array('notempty')),
),
'last_name' => array(
'notempty' => array('rule' => array('notempty')),
),
'email' => array(
'email' => array('rule' => array('email')),
),
'group_id' => array(
'numeric' => array('rule' => array('numeric')),
),
'active_user' => array(
'boolean' => array('rule' => array('boolean')),
),
'passwd' => array(
'rule' => array('minLength', '6'),
'message' => 'Password should be at least 6 characters long',
'required' => true,
'allowEmpty' => false,
'on' => 'create'
),
'passwd_confirm' => array(
'rule' => 'matchpwd',
'message' => 'Confirm password doesnt match'
),
);
function matchpwd($data){
if ($this->data['User']['passwd'] != $data['passwd_confirm'] ) {
return false;
}
return true;
}
最后,观点(虽然我不认为添加这个会有所帮助,但无论如何我都包括它):
<div class="users form">
<?php echo $form->create('User', array('action'=>'change_password'));?>
<fieldset>
<legend><?php __('Change Password for "'.$User_to_change.'"');?></legend>
<?php
echo $form->input('id');
echo $form->input('passwd', array(
'type' => 'password')
);
echo $form->input('passwd_confirm', array(
'type' => 'password')
);
?>
</fieldset>
<?php echo $form->end('Submit');?>
</div>
我在下面的答案中提到验证似乎是“中途工作”。当我尝试在“passwd”表单字段中输入密码但将“passwd_confirm”留空时,控制器的保存操作失败,我看到闪存消息“密码无法更改”。所以显然它在我的验证规则中运行了matchpwd函数。但是,为两个框输入空白值都会成功,因此就好像它没有通过其他验证规则。
(如果代码缩进没有正确显示,请原谅。如您所见,我有点像StackOverflow n00b)
答案 0 :(得分:0)
Cake验证系统的一大好处是您只需编写一次规则。在控制器加载模型定义时,默认情况下,任何使用模型的操作都将应用规则。
我认为最有可能发生的是required
参数设置为true
。如果该字段为空,则会导致验证失败。
答案 1 :(得分:0)
密码会自动进行哈希处理,因此您需要哈希其他密码字段以进行比较。我通常在模型中的beforeSave函数中执行它:
function beforeSave() {
if(!empty($this->data['User']['password2'])) {
$this->data['User']['password']=Security::hash($this->data['User']['password2'], null, true);
}
return true;
}
我将这些验证规则用于我的pw字段:
'password' => array(
'notempty' => array(
'rule' => array('notempty'),
'message' => 'Give a password.',
),
),
'password2' => array(
'notempty' => array(
'rule' => array('notempty'),
'message' => 'Give a password.',
),
),
'passwordn' => array(
'notempty' => array(
'rule' => array('notempty'),
'message' => 'Give a password.',
),
),
'current_password' => array(
'notempty' => array(
'rule' => array('notempty'),
'message' => 'Give a password.',
),
),
用于注册的密码和密码2,密码密码2和current_password位于更改表格上。