在 yii2 中验证 select2

Posted

技术标签:

【中文标题】在 yii2 中验证 select2【英文标题】:Validate select2 in yii2 【发布时间】:2016-09-07 17:31:14 【问题描述】:

我在 _form.php 中有一个 textInput。然后,我将其更改为 select2。但是在我更改它之后,验证不起作用。有什么问题?如何在 select2 中进行验证,使其不能为空? 这是代码:

_form.php

<?php

        $formatJs = <<< 'JS'
        var formatPenerima = function (penerima) 
            if (penerima.loading) 
                return penerima.text;
            
            var markup =
            '<div class="row">' + 
                '<div class="col-sm-4">' +
                    '<b style="margin-left:5px">' + penerima.text + '</b>' + 
                '</div>' +
                '<div class="col-sm-3"><i class="fa fa-phone"></i> ' + penerima.telepon + '</div>' +
                '<div class="col-sm-4"><i class="fa fa-envelope"></i> ' + penerima.mail + '</div>' +
            '</div>';
            return '<div style="overflow:hidden;">' + markup + '</div>';
        ;
        var formatPenerimaSelection = function (penerima) 
            return penerima.id || penerima.text;
        
JS;

        // Register the formatting script
        $this->registerJs($formatJs, \yii\web\View::POS_HEAD);

        // Script to parse the results into the format expected by Select2
        $resultsJs = <<< JS
        function (data, params) 
            params.page = params.page || 1;
            return 
                results: data.results,    // check here
                /*pagination: 
                    more: (params.page * 30) < data.total_count
                */
            ;
        
JS;

        $url = Url::to(['/paket/jsonlist']);

        // Render your widget
        // Get data from dummy data
        echo $form->field($model, 'no_induk')->widget(Select2::className(), [
            'name' => 'kv-repo-template',
            'value' => '',
            'initValueText' => '',
            'options' => ['placeholder' => 'Cari pemilik ...', 'id' => 'pengambil'],
            'pluginOptions' => [
                'allowClear' => true,
                'minimumInputLength' => 1,
                'ajax' => [
                    'url' => $url,
                    'dataType' => 'json',
                    'delay' => 250,
                    'data' => new JsExpression('function(params)  return q:params.term, page: params.page; '),
                    'processResults' => new JsExpression($resultsJs),
                    'cache' => true
                ],
                'escapeMarkup' => new JsExpression('function (markup)  return markup; '),
                'templateResult' => new JsExpression('formatPenerima'),
                'templateSelection' => new JsExpression('formatPenerimaSelection'),
            ],
        ])->label('Pemilik');
    ?>

这是我的示范规则:

public function rules()
    
        return [
            [['no_induk', 'nama', 'no_telepon', 'email', 'kategori_paket', 'nama_pengirim'/*, 'tanggal_sampai'*/],
                'required', 'message' => 'attribute tidak boleh kosong.'],
            [['id_satpam_pengentry'], 'required', 'message' => 'Nama satpam tidak boleh kosong.'],
            [['kategori_paket', 'status', 'id_satpam_pengentry', 'id_satpam_penyetuju'], 'integer'],
            [['tanggal_sampai', 'tanggal_pengambilan'], 'safe'],
            [['no_induk', 'email'], 'string', 'max' => 255],
            [['nama', 'nama_pengirim', 'nama_pengambil'], 'string', 'max' => 128],
            [['no_telepon'], 'string', 'max' => 64]
        ];
    

【问题讨论】:

你能分享你的select2代码和模型规则吗? 当然。我会在我的问题上分享它。 您是否能够对其他字段进行验证?客户端验证和服务器端都不适用于no_induk 吗? 我可以对其他字段进行验证。 select2 正在工作,但不适用于验证。只是验证。 您已经找到解决方案了吗? 【参考方案1】:

你可以像这样在“options”数组中设置“required = true”

'options' => ['placeholder' => 'Cari pemilik ...', 'class' => 'form-control', 'required' => true],

【讨论】:

【参考方案2】:

你必须把 class=> 选项中的“form-control”并删除 id,因此验证将起作用

【讨论】:

【参考方案3】:
echo $form->field($model, 'no_induk')->widget(Select2::className(), [
        'name' => 'kv-repo-template',
        'value' => '',
        'initValueText' => '',
        'options' => ['placeholder' => 'Cari pemilik ...', 'class' => 'form-control'],
        'pluginOptions' => [
            'allowClear' => true,
            'minimumInputLength' => 1,
            'ajax' => [
                'url' => $url,
                'dataType' => 'json',
                'delay' => 250,
                'data' => new JsExpression('function(params)  return q:params.term, page: params.page; '),
                'processResults' => new JsExpression($resultsJs),
                'cache' => true
            ],
            'escapeMarkup' => new JsExpression('function (markup)  return markup; '),
            'templateResult' => new JsExpression('formatPenerima'),
            'templateSelection' => new JsExpression('formatPenerimaSelection'),
        ],
    ])->label('Pemilik');

【讨论】:

以上是关于在 yii2 中验证 select2的主要内容,如果未能解决你的问题,请参考以下文章

在 yii2 中验证 select2

Yii2在Form中处理短信验证码的Validator,耦合度最低的短信验证码验证方式

Yii2 - 表单验证规则:如何使用自定义验证功能或替代?

YII2-跳过自带的URL验证

yii2 unique 验证

Yii2,自定义验证:clientValidateAttribute() 无法正常工作