我已经在模型中进行了验证。此外,我已在控制器中进行了一些验证以检查验证码。之后,应用程序不显示模型验证错误。如果我评论控制器代码,模型验证工作正常并显示错误。两者都不起作用..
模型代码(样本)
class User extends AppModel {
var $name = 'User';
var $validate = array(
'username' => 'notempty',
'firstname' => 'notempty'
);
}
控制器代码
if (!empty($this->data)) {
$this->User->set($this->data);
$this->User->create();
$captcha = $this->Session->read('CAPTCHA_CODE');
if (strtolower($captcha) != strtolower($this->data['User']['captcha']))
{
$this->User->invalidate('captcha', __('Sorry, your entry did not match', true));
}
if ($this->User->save($this->data, array('validate' => 'only')))
{
if ($this->User->save($this->data, array('validate' => 'false'))) {
$this->Session->setFlash(__('Registered successfully', true));
$this->redirect('success');
}
}else {
$this->Session->setFlash(__('Please, try again.', true));
}
}
我已将if ($this->User->save($this->data, array('validate' => 'only')))
行替换为if ($this->User->validates())
,然后它也无效。
请帮助
答案 0 :(得分:11)
您的代码应与if ( $this->User->validates() )
一起使用。您遇到问题的不正确行为是因为Model::save()
重置Model::validationErrors
成员,从而消除了您的自定义验证错误。 Model::validates()
没有,因此您的双重验证设置应该有效。
例如,以下函数在CakePHP 1.2下正确运行。
型号:
class User extends AppModel
{
var $validate = array(
'my_other_field' => array(
'rule' => 'notEmpty',
'message' => 'This field should not be empty.'
)
);
}
控制器:
class UsersController extends AppModel
{
function add()
{
if (! empty($this->data)) {
$this->User->set( $this->data );
if ( 'foo' != $this->data['User']['my_field'] ) {
$this->User->invalidate( 'my_field', 'Should be "foo".' );
}
if ( $this->User->validates() ) {
$this->flash('Form validated correctly.'); exit;
}
}
}
}
查看:
<?php echo $form->create('User', array('action'=>'add')); ?>
<?php echo $form->input('User.my_field', array('value'=>'bar')); ?>
<?php echo $form->input('User.my_other_field', array('value'=>'')); ?>
<?php echo $form->end('Submit'); ?>
按原样提交,表单验证错误出现在两个字段下面,一个来自控制器的验证逻辑,另一个来自模型的验证规则。
当然,更大的问题是通过让控制器处理一些数据验证来混淆MVC角色。你可能想要考虑这样的事情:
控制器:
class UsersController extends AppController
{
function add()
{
if (! empty($this->data)) {
$captcha = $this->Session->read('CAPTCHA_CODE');
$this->User->setCaptchaCheck( $captcha );
if ( $this->User->save( $this->data, array('validate'=>true))) {
$this->Session->setFlash('Success');
$this->redirect('success',303,true);
}
}
}
}
型号:
class User extends AppModel
{
var $captchaCheck = '';
var $validates = array(
'captcha' => array(
'matchesCheck' => array(
'rule' => array( 'matchesCaptchaCheck', 'captchaCheck' ), // second value of array should match class member-name above
'message' => "CAPTCHAs don't match."
)
)
);
function matchesCaptchaCheck( $data, $checkVar )
{
$data = reset(array_values($data)); // I don't need to know the field name now.
return low($data) == low($this->{$checkVar});
}
function setCaptchaCheck( $captcha )
{
$this->captchaCheck = $captcha;
}
}
现在,您的控制器对您的模型如何验证其数据,甚至数据的结构方式一无所知;并且您的表单验证都发生在模型中。
希望这有帮助。