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

Php 当yii2中的验证器工作不正常时,php,yii2,yii2-advanced-app,yii2-basic-app,Php,Yii2,Yii2 Advanced App,Yii2 Basic App,在项目中的一个视图文件中,我正在使用when验证器为模型定义一些验证,但它不能正常工作可能是因为我不知道如何使用该验证器。这是该表的型号代码 return [ [['event_id', 'user_id'], 'required'], [['event_id', 'user_id'], 'integer'], [['is_mandatory'], 'boolean'], [['answer'], 'string',

在项目中的一个
视图
文件中,我正在使用
when
验证器为
模型定义一些验证,但它不能正常工作可能是因为我不知道如何使用该验证器。这是该表的型号代码

       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; }]
    ];
这是我的
视图
代码,是的,我正在使用实例在视图文件中创建此字段,因为创建这些字段取决于其他输入

        $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]);
$modelsanswers=新答案();
$modelsanswers->是必需的=0;
echo$form->field($modelsanswers,“answer”[
'模板'=>'{label}{input}{error}{hint}'
])->textInput(['maxlength'=>true]);
但它总是根据需要打印字段。我可以在调试器中看到
$model
被正确地分配了值。这里的验证器有什么问题吗?

when()
验证仅用于服务器端验证,并且仅在提交表单时进行评估。如果您想根据
的值是否需要显示字段,则有两个选项

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

其次,您可以简单地调整该字段的模板,以便不包括错误消息,除非
是必需的
设置为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>'
        ])
echo$form->field($modelsanswers,“answer”[
'模板'=>'此处标签的名称{input}{error}{hint}'
])

$modelsanswers->是否必须=0
$model->是强制的==1。您在
时发布的代码将永远不会在此条件下完成。发布控制器代码。@INERSA我正在“视图”页上创建此实例。所以控制器中没有与
答案相关的内容。我在
查看
页面上创建它,因为它取决于是否生成该字段的其他输入天气。再次,您将
$modelsanswers->is_mandable
设置为
0
,并要求它为
1
。你的条件怎么可能是真的?@ineersa实际上我把它设置为静态,只是为了把它贴在堆栈上。否则,其值将由查询设置。查询将返回0或1。@ineersaa,如果该值设置为
0
,则该值不应为必需值,但不管我提供了什么条件,它都会作为必需值打印在表单上。我更喜欢第二个想法。因为为没有事件分配id的字段编写java脚本对我来说有点困难。我将尝试第二种方法,它抛出语法错误。我也试着只键入
,但它不起作用,我不知道它怎么工作。