0

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

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

到目前为止,这是我的想法,但我不知道这是否是解决这个问题的最佳途径?另外,如果我可以为此使用场景,那么当用户选择需要 ie.date 输入的内容时,如何在视图中指定文本框的规则?有没有一种方法可以在单击下拉列表时使用 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->getDatatypeName($field['datatype']) 方法的结果设置此文本框的验证...方法是我的模型的一部分,其中验证存在规则;但是,在这种情况下,我传递给此方法的主键 $field['datatype'] 是基于在我的视图模型 ..$model 中加入许多相关表的查询。因此,当此方法传回“字符串”时,我想相应地设置验证。模式中可以有多个这样的文本框,每个都有不同的验证类型,但每次都附加到相同的“filter_value”字段。

4

1 回答 1

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'; }]]
    ];
} 
于 2015-06-01T18:59:56.050 回答