在项目中的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
被正确赋值。这里的验证器有什么问题?
答案 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>'
])