Yii 2.0场景 - 动态验证

时间:2015-05-30 20:03:24

标签: validation yii2 scenarios

我有一种情况需要验证文本框输入;但是,验证的类型取决于该页面上下拉列表的选择(页面上每个都有多个)。因此,文本框可以采用字符串,整数,日期等,用户必须从下拉列表中选择一些内容,告诉我用户将要输入的数据类型。

我正在考虑为此使用场景;但是,我的模型/数据库中的文本框是1个字段,它接受数据库级别的字符串(我不希望用户在整数合适时输入字符串,无论我如何处理后端)。

这是我到目前为止的想法,但我不知道这是否是解决此问题的最佳途径?另外,如果我可以使用这个场景,那么当用户选择需要输入的内容时,如何在视图中指定文本框的规则?有没有办法在点击下拉列表时用Ajax调用规则?对不起,这可能是一个有点过于宽泛的问题,但我是Yii的新手,而我只是想通过这个方式走上正确的道路。谢谢!

public function scenario()
{
    return[
            'isstring' => ['filter_value'],
            'isint' => ['filter_value'],
            'isdate' => ['filter_value'],
            'isfloat' => ['filter_value'],
            'all' => ['freq_int', 'freq_unit_fk', 'filter_field_fk',   'arithmetic_op', 'logic_op', 'filter_value']
    ];

}
public function rules()
{
    return [
        [['freq_int', 'freq_unit_fk'], 'integer', 'message' => 'Integer'],
        [['freq_int', 'freq_unit_fk', 'filter_field_fk', 'arithmetic_op'], 'required'],
        [['logic_op'], 'safe'],
        [['filter_value'], 'integer', 'on' => 'isint'],
        [['filter_value'], 'string', 'min' => '2', 'max' => '75', 'on' => 'isstring'],
        [['filter_value'], 'trim', 'on' => 'isstring'],
        [['filter_value'], 'number', 'on' => 'isfloat'],
        [['filter_value'], 'date', 'on' => 'isdate']
        ];
}

好的,为了提供更多详细信息,我现在决定放弃基于下拉列表选择验证集的想法。相反,它只需要根据我在加载页面时从数据库中获取的值进行设置。我有一个名为' _settings.php'的部分视图文件。它通过名为' manage.php'的视图文件呈现为模态。以下是_settings.php中的代码,其中显示了我尝试进行验证的文本框:

foreach($crystalfields as $field)   

        {

            if($field['custom'] == 4)
            {           
                        $datatype = $model->getDatatypeName($field['datatype']);                    
                        $filterstring = $form->field($model, 'filter_value', ['inputOptions' => ['id' =>'filterval'.$crystalid.'-'.$field['fieldid']]])
                                                ->textinput(['name' => 'filterval'.$crystalid.'-'.$field['fieldid']])
                                                ->label(false);         
                        $filterstrings = $filterstrings.'<div class="form-group">
                                                <div class="form_group row">
                                                    <label for="filterval'.$crystalid.'-'.$field['fieldid'].'" class="col-sm-3 control-label">'.$field['fieldname'].'</label>
                                                        <div class="col-sm-6 pull-right">'.$filterstring.'</div>
                                                </div>
                                            </div>';

            }

...... foreach循环还有更多内容是无关紧要的。基本上,我想要做的是根据方法的结果设置此文本框的验证$ model-&gt; getDatatypeName($ field [&#39; datatype&#39;])...方法是一部分我的模型存在验证规则;但是,我传递给此方法的主键$ field [&#39;数据类型&#39;]基于在我的视图模型中连接许多相关表的查询。在这种情况下,$ model。所以当这种方法回传时,字符串&#39;我想相应地设置验证。模态中可以有多个这样的文本框,每个文本框都有不同的验证类型,但是它们附加到相同的“过滤器”值。每次都是场。

1 个答案:

答案 0 :(得分:1)

我认为这里更简单的解决方案是使用when-functionality。这使您可以很好地控制是否应该触发规则:

public function rules()
{
    return [
        [['freq_int', 'freq_unit_fk'], 'integer', 'message' => 'Integer'],
        [['freq_int', 'freq_unit_fk', 'filter_field_fk', 'arithmetic_op'], 'required'],
        [['logic_op'], 'safe'],
        [['filter_value'], 'integer', 'when' => function ($model) {return $model->logic_op == 'integer'; }],
        [['filter_value'], 'string', 'min' => '2', 'max' => '75', 'when' => function ($model) {return $model->logic_op == 'string'; }],
        [['filter_value'], 'trim', 'when' => function ($model) {return $model->logic_op == 'string'; }]],
        [['filter_value'], 'number', 'when' => function ($model) {return $model->logic_op == 'float'; }]],
        [['filter_value'], 'date', 'when' => function ($model) {return $model->logic_op == 'date'; }]]
    ];
}