我一直在尝试对此进行大约两天的调试,并且已经在互联网上阅读了这个问题的每个答案......但仍然无法让它发挥作用。
在我的CakePHP应用程序中,我有一个用户注册表单,它使用名为 User 的模型和 Form 帮助程序。验证失败时,表单不会显示任何验证错误。
根据$this->User->validationErrors
,在呈现视图之前正确填充debug()
数组,$this->User->save()
检测到模型未验证的事实。
以下是我的观点:
<?php
echo $this->Form->create('User');
echo $this->Form->input('soton_username', array('label' => 'Email address', 'after' => '@soton.ac.uk'));
echo $this->Form->input('username', array('label' => 'Choose a username'));
echo $this->Form->input('password');
echo $this->Form->input('password_confirm', array('label' => 'Password (again)', 'type' => 'password'));
echo $this->Form->input('first_name');
echo $this->Form->input('last_name');
echo $this->Form->submit('Create account');
echo $this->Form->end();
?>
这是我的行动:
public function create() {
if($this->request->is('post')) {
$this->User->set($this->request->data);
$valid = true;
$validationErrors = array();
$password = $this->request->data('User.password');
$password_confirm = $this->request->data('User.password_confirm');
if(strlen($password) < 5) {
$validationErrors['password'][] = 'Password must be at least 5 characters long';
$valid = false;
}
if($password != $password_confirm) {
$validationErrors['password_confirm'][] ='Passwords do not match';
$valid = false;
}
$this->User->data['User']['email'] = $this->request->data('User.soton_username') . '@soton.ac.uk';
$group = $this->Group->find('first', array('conditions' => array('default' => 1)));
if($group) {
$gid = $group['Group']['id'];
} else {
$gid = 1;
}
$this->User->data['User']['group_id'] = $gid;
if($this->User->validates() && $valid) {
$this->User->save();
$this->Session->setFlash('<a href="/users/activate/' . $this->User->data['User']['activation_id'] . '">Activate</a>');
return $this->redirect('/users/confirm_create');
}
$this->User->validationErrors = array_merge($this->User->validationErrors, $validationErrors);
if(isset($this->User->validationErrors['email'])) {
$this->User->validationErrors['soton_username'] = $this->User->validationErrors['email'];
}
//debug($this->request->validationErrors);exit;
$this->Session->setFlash('There were errors with the form.');
}
}
soton_username 和 password_confirm 字段实际上不是数据库的一部分,但仍需要进行验证。
我的用户模型确实有一个$validate
变量,表单在将required="required"
插入正确位置时会识别出来。
任何帮助都将不胜感激。
答案 0 :(得分:5)
好的,我已经找到了问题的答案。
我的 AppController 类中的以下函数是culrprit:
public function beforeRender() {
$user_id = $this->Auth->user('id');
$user = $this->User->read(null, $user_id);
$this->set('user', $user);
}
出于某种原因,调用$this->Model->read()
函数可以防止显示验证错误,并且此函数在每个操作结束时都会调用此函数。将其移至beforeFilter()
函数可以解决问题。
答案 1 :(得分:1)
这是我的答案,因为我没有打电话给User-&gt; read():
我挖掘了cake的核心,发现错误字段是根据使用form-&gt; create('model')传递的模型名称自动填充的。
我的模型是'用户',在我看来,我有$ this-&gt; form-&gt; create('Users')。注意's'。 验证在模型上完成,因此验证错误数组由模型名称索引:“用户”。表单使用create,'Users'中传递的名称来搜索错误。
要解决此问题,请确保在form-&gt; create()中使用模型的单数形式。对我来说就是'用户'。