通过AJAX在Yii2中验证Select2

时间:2019-01-31 10:01:43

标签: ajax validation yii2 jquery-select2

我有Yii2应用程序,该应用程序使用Kartik插件初始化表单中的Select2下拉列表。

我有一个特定的Select2,它使用AJAX调用来获取下拉选项的数据。

<?=
$form->field($model, 'court_house_id', ['enableAjaxValidation' => true, 'selectors' => ['input' => '#' . $id . "-court-house"],'template' => FormHelper::GenerateFieldTemplate([6])])
->widget(Select2::classname(), [
    'options' => ['id' => $id . "-court-house", 'placeholder' => Yii::t('app', 'Search court house...')],
    'hashVarLoadPosition' => \yii\web\View::POS_READY,
    'pluginOptions' => [
        'dropdownParent' => new JsExpression("$('#$modalWindowId')"),
        'allowClear' => true,
        'minimumInputLength' => 2,
        'language' => [
            'errorLoading' => new JsExpression("function () { return '" . Yii::t('app', 'Search...') . "'; }"),
        ],
        'ajax' => [
            'url' => app\components\UrlMaker::link('data/court-house-list'),
            'dataType' => 'json',
            'data' => new JsExpression('function(params) { return {q:params.term}; }')
        ],
        'escapeMarkup' => new JsExpression('function (markup) { return markup; }'),
        'templateResult' => new JsExpression('function(courthouse) { return courthouse.text; }'),
        'templateSelection' => new JsExpression('function (courthouse) { return courthouse.text;}'),
]])
->label(Yii::t('app', 'Court House'), ['class' => FormHelper::GenerateLabelClassTemplate([3])]);
?>

有意粘贴所有代码,尽管我认为大多数代码都是无关紧要的。

我以多种动态创建的形式加载了该代码,因此包含了所有奇怪的ID和选择器。但是,表单具有不同的下拉菜单,该下拉菜单控制是否显示(和显示)某些字段。上面的特定字段仅在表单的所有其他变体不具有的情况之一中显示。因此该模型具有以下验证:

[['court_house_id', 'staff'], 'required', 'on' => self::SCENARIO_ONE],

顺便说一下,staff只是一个普通的文本字段,一切都可以正常工作。

为了更改方案,在 视图 中,以下行的格式为:

<?php $model->scenario = \app\models\MyModel::SCENARIO_ONE; ?>

问题是,当我将表单提交为空时,staff字段会被标记为红色,但无效,而法院会被标记为绿色(虽然为空)。

如果我进入模型并移除'on' => self::SCENARIO_ONE部分,那么一切都会按预期进行-在空白状态下提交,法院区域也以红色亮起,但这对于我的其他情况是一个问题字段是不需要的。

有什么想法可能会导致该问题以及如何解决该问题?

1 个答案:

答案 0 :(得分:1)

例如,在调用save()方法之前尝试在控制器中设置场景

$model = new MyModel(['scenario' => MyModel::SCENARIO_ONE])