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 に答える