【问题标题】:Yii2 - DynamicModel validationYii2 - 动态模型验证
【发布时间】:2021-08-22 13:52:30
【问题描述】:

我有一个表单,我想根据在特定选择输入中选择的值更改我的 DynamicModel 规则验证。我读过this doc,但我不明白为什么我的代码不起作用。我试过以下没有结果:

我的控制器

private function createFormModel(){
    
    $model = new DynamicModel([
        'indicador',
        'mes'
    ]);
   
    $model->addRule(['indicador'], 'required',['message' => 'This field is required']);
    $model->addRule(['mes'], 'string');
    $model->addRule(
        'mes',
        function ($attribute, $params, $validator) use ($model) {
            if ($model->indicador == 'semana') {
                $model->addError('mes', 'This field is required');
            }
        }
    ); 
    
    return $model;
}

我的视图

<?php $form = ActiveForm::begin(); ?>         

<!-- indicador -->  
<div class="form-group">
    <?=  $form->field($model, 'indicador')->widget(Select2::class, [
        'options' => ['id'=>'indicador'],
        'data' => [
            'dia' => 'Actividad por Día',
            'semana' => 'Actividad por Semana',
            'resumen' => 'Resumen de actividad'
        ],
        'pluginOptions' => [ 
            'placeholder'=>'Seleccionar indicador',
            'allowClear' => true 
            ],          
    ]); ?>    
</div>
<!-- /.indicador -->               

<!-- mes -->
<div id = "semana" class="form-group hidden">
    <?= $form->field($model, 'mes')->widget(DepDrop::class, [
        'type' => DepDrop::TYPE_SELECT2,
        'options' => ['id' => 'mes'],
        'select2Options' => ['pluginOptions' => ['allowClear' => true]],
        'pluginOptions' => [
            'depends' => ['indicador'],
            'placeholder'=>'Seleccionar mes',
            'url' => Url::to(['/campus/subindicador']),
            'loadingText' => 'Cargando ...',
            'initialize' => true,
        ]
    ]);?>  
</div>
<!-- /.mes -->    

<?= Html::submitButton('Aplicar filtros', ['class' => 'btn btn-block btn-default']) ?>

<?php ActiveForm::end(); ?>

【问题讨论】:

  • 你怎么称呼它?表单是如何提交的?您添加了private function createFormModel,您的表单提交到的操作在哪里?最重要的是当您提交表单时会发生什么?说 我已经尝试了以下但没有结果 信息不足

标签: php forms dynamic yii2


【解决方案1】:

您需要将when 与所需的验证器一起使用。

$model = new DynamicModel(['indicador', 'mes']);
$model->addRule(['indicador'], 'required', ['message' => 'This field is required']);
$model->addRule(['mes'], 'string');
$model->addRule(['mes'], 'required', ['when' => function ($dModel) {
    return $dModel->indicador == 'semana';
}, 'message' => 'This field is required']);

【讨论】:

  • 谢谢!我已经尝试过您的代码,但始终需要字段“mes”,无条件地输入“indicador”值。
  • @4aLifeTime 我测试了代码,它按预期工作。为表单启用 Ajax 验证。
  • 或者不能开启ajaxValidation,做客户端验证条件:'whenClient' =&gt; 'function(attribute,value){ return $("#inputId").val()==""; }', 其中inputId为html输入元素id。在文档here 中描述
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多