我正试图为用户注册设置验证,但我遇到了麻烦。当我只有有电子邮件,角色和密码字段在$validation数组(删除其他),它将工作,并将保存一个新用户。当我尝试添加其他字段时,它失败并给出flash消息错误"用户无法保存"。请再试一次。"
我很确定这是re_password检查。当我删除验证,它的工作。但是,当密码不同时,re_password验证确实会显示错误,因此我不确定在哪里查看
这是我的用户表
id | email | password | location | website | role | created | modified
这是验证需求。为了让它保存一个新用户,我必须删除除电子邮件、密码和角色之外的所有内容。
public $validate = array(
'email' => 'email'
,
'password' => array(
'required' => array(
'rule' => array('minLength', '8'),
'message' => 'A password with a minimum length of 8 characters is required'
)
),
're_password' => array(
'required' => array(
'rule' => array('equalTo', 'password' ),
'message' => 'Both password fields must be filled out'
)
),
'role' => array(
'valid' => array(
'rule' => array('inList', array('admin', 'author')),
'message' => 'Please enter a valid role',
'allowEmpty' => false
)
),
'location' => array(
'valid' => array(
'rule' => array('notEmpty'),
'message' => 'Please select a location'
)
)
);
表单如下(选项数组在上面,认为没有必要显示)
echo $this->Form->input('email');
echo $this->Form->input('password');
echo $this->Form->input('re_password', array('type'=>'password', 'label'=>'Re-Enter Password', 'value'=>'', 'autocomplete'=>'off'));
echo $this->Form->input('location', array('options' => $options, 'label' => 'Select Nearest Location'));
echo $this->Form->input('website',array('label'=>'Enter your website, such as www.example.com. '));
echo $this->Form->input('role', array('type' => 'hidden', 'default' => 'user'));
以下是User模型中的re_password检查函数
function check_user_password($userid) {
$salt = Configure::read('Security.salt');
$this->User->id = $userid;
$hashed_password = $this->User->field('password');
// check password
if($hashed_password == md5($data['User']['re_password'].$salt)) {
return true;
} else {
return false;
}
}
最后,这是UsersController
中的add函数public function add() {
if ($this->request->is('post')) {
$this->User->create(); //create initiates a form on User/add.ctp
if ($this->User->save($this->request->data)) { //save the form data
$this->Session->setFlash(__('The user has been saved'));
$this->redirect(array('controller' => 'demos', 'action' => 'index'));
} else {
$this->Session->setFlash(__('The user could not be saved. Please, try again.'));
}
}
}
如果还有什么需要看的请告诉我
我认为您的re_passwords验证规则equalTo将其值与字符串password而不是实际字段进行比较。我喜欢使用自定义函数。
所以尝试替换re_passwords规则数组
//'rule' => array('equalTo', 'password' ),
'rule' => array('equalToField', 'password'),
并在该模型中声明equalToField函数
function equalToField($array, $field) {
return strcmp($this->data[$this->alias][key($array)], $this->data[$this->alias][$field]) == 0;
}
**也在将来当你似乎有验证规则的问题在你的控制器操作中试试这个(它比删除每条规则要快)
if ($this->User->save($this->request->data)) {
...
} else {
debug($this->User->validationErrors);
...
}
请使用以下代码满足您的要求:
通过在用户模型中放置自己的方法来重写equalTo函数:
function equalTo( $field=array(), $compare_field=null )
{
foreach( $field as $key => $value ){
$v1 = $value;
$v2 = $this->data[$this->name][ $compare_field ];
if($v1 !== $v2) {
return FALSE;
} else {
continue;
}
}
return TRUE;
}
注意,在@luboss的回答中,他声明:
function equalToField($array, $field) {
return strcmp($this->data[$this->alias][key($array)], $this->data[$this->alias][$field]) == 0;
}
不能工作,因为我们比较不一致的字段:STRCMP的左成员已经被散列了,但右成员还没有。这发生在CakePHP自动化中,因为该字段被称为密码。我让它工作的方式是重用哈希函数在equalToField helper:
public function equalToField($array, $field) {
$valueFirstOccurrence = $this->data[$this->alias][$field];
$valueSecondOccurrence = Security::hash($this->data[$this->alias][key($array)], $type = 'sha1', $salt = true) ;
return !strcmp($valueFirstOccurrence, $valueSecondOccurrence);
}
其他点:如果你有兴趣为你的密码字段添加最小长度验证字段,你想先阅读这篇好文章:CakePHP