Yii模型验证工作,表格仍然张贴没有错误


Yii model validation works, form is still posted without error

在谷歌和SO搜索了一个关于模型验证问题的解决方案后,我决定发布我自己的问题。有些事情告诉我问题很小,请原谅我眼前的失明。

问题:我有一份登记表,其中包括字段day monthyear,这两个字段需要一起验证,最低年龄为18岁。

问题是,方法checkAge()似乎正在启动并给出响应(我使用Firebug Webdev Tools中的Net repense检查了这一点),只是响应没有显示在<?php echo $form->error($model,'day'); ?>占位符中,验证错误也没有阻止表单发布。

我的另一个自定义验证方法checkEmail()工作得很好,错误按预期显示(显然可以防止在出现错误时发布表单)。

型号:

class SignUpForm extends CFormModel
{
...
public $email;
public $day;
public $month;
public $year;
...
public function rules()
{
    return array(
        array('..., email, day, month, year, ...', 'required'),
        ....
        array('email', 'checkEmail'),
        array('day', 'checkAge'),
    );
}
public function checkEmail()
{
    $check = file_get_contents('...'); // api checks if email is in use - WORKS (!)
    if ($check == 0)
        $this->addError('email','Email is in use.');
}

public function checkAge()
{
    $this->addError('day','Age must be atleast 18 years old.');
}
    ...

视图:

<div class="form signupform" id="signupform">
<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'signup-form',
    'enableAjaxValidation'=>true,
    'clientOptions'=>array('validateOnSubmit'=>true),
    'action' => array('site/signup')
)); ?>
...
<div class="row select">
<?php echo $form->labelEx($model,'day', array('class'=>'geb')); ?>
<select name="SignUpForm[day]" class="day">
    <option value="1">1</option>
    <option value="2">2</option> 
    ... 
</select>
<select name="SignUpForm[month]" class="month">
    <option value="1">jan</option>
    <option value="2">feb</option>
    ... 
</select>
<select name="SignUpForm[year]" class="year">
    <option value="1996">1996</option> 
    <option value="1995">1995</option>
    ...
</select>
<?php echo $form->error($model,'day'); ?>
</div>
...

控制器:

public function actionSignUp()
{
    $model=new SignUpForm;
    if(isset($_POST['ajax']) && $_POST['ajax']==='signup-form')
    {
        echo CActiveForm::validate($model);
        Yii::app()->end();  
    }
    if (isset($_POST['SignUpForm'])) 
    {
        $postFields = $_POST['SignUpForm'];
        // posts to api via curl
        $response= Yii::app()->curl->post('http://www.api.com/myapi.php', array(
                        ...
            'email' => $postFields['email'],
            'day' => $postFields['day'],
            'month' => $postFields['month'],
            'year' => $postFields['year'],
                        ...
        )); 
        // proces response
    }
    else
        $this->render('register', array('model'=>$model));
}

AJAX的响应(如firebug中所示):

{"SignUpForm_email":["E-mail is required.","Email is in use."],"SignUpForm_day":["Age must be atleast 18 years old."]}

这意味着验证正在启动,但用户不会收到任何错误,也不会阻止表单的发布。

我在这里迷路了,任何帮助都将不胜感激。

您是对的,在返回时不再需要true或false。但我认为问题可能在于html中的选择框。我认为你需要正确设置ID:

<select name="SignUpForm[day]" id="SignUpForm_day" class="day">
    <option value="1">1</option>
    <option value="2">2</option>
</select>

通常最好使用CHTML中内置的表单生成器,这样就不会遇到这样的问题。示例:

$options = array(1,2,3,4,5,6);
echo $form->dropDownList($model,'day',$options);
$options = array(1=>'jan',2=>'feb',3='mar');
echo $form->dropDownList($model,'month',$options);