当yii2中的验证器不能正常工作时

时间:2015-12-14 06:53:43

标签: php yii2 yii2-advanced-app yii2-basic-app

在项目中的view文件之一上,我使用when验证程序为model定义了一些验证,但它无法正常工作可能是因为我不知道如何使用它验证器。这是该表的型号代码

       return [
        [['event_id', 'user_id'], 'required'],
        [['event_id', 'user_id'], 'integer'],
        [['is_mandatory'], 'boolean'],
        [['answer'], 'string', 'max' => 250],
        [['answer'], 'required', 'when' => function($model){
            return $model->is_mandatory == 1; }]
    ];

这是我的view代码,是的,我正在使用实例在视图文件上创建此字段,因为创建这些字段取决于其他输入。

        $modelAnswers = new Answers();
        $modelAnswers->is_mandatory = 0;

        echo $form->field($modelAnswers, "answer",[
            'template' => ' <div class="row"><div class="col-lg-6 col-md-6 col-sm-6 col-xs-6"><label>{label}</label></div><div class="col-lg-4 col-md-4 col-sm-6 col-xs-8">{input}{error}{hint}</div></div>'
        ])->textInput(['maxlength' => true]);

但它总是按要求打印字段。我可以在调试器中看到$model被正确赋值。这里的验证器有什么问题?

1 个答案:

答案 0 :(得分:1)

when()验证仅用于服务器端验证,并且仅在表单提交时进行评估。如果您想根据is_mandatory的值显示字段是否符合要求,那么您有两种选择。

首先,您可以使用whenClient()方法添加客户端验证。这是我在我自己的表单上使用的,并且涉及编写一个javascript函数,该函数将确定该字段是否是必需的,然后它将应用relvant类。为此,您需要在表单的某处包含is_mandatory字段,可能是隐藏字段,并且您需要在表单上启用clientValidation。

其次,您可以简单地调整字段的模板,以便除非is_mandatory设置为true,否则不会包含错误消息。这将涉及重写字段标签。

echo $form->field($modelAnswers, "answer",[
            'template' => ' <div class="row"><div class="col-lg-6 col-md-6 col-sm-6 col-xs-6"><label class="{$modelAnswers->is_mandatory ? 'required' : ''}">Name of label here</label></div><div class="col-lg-4 col-md-4 col-sm-6 col-xs-8">{input}{error}{hint}</div></div>'
        ])