Yii2 - Ajax ActiveForm验证不显示错误

时间:2016-04-27 07:31:09

标签: json ajax yii2

我在一个表单中有5个不同的模型,可以在一个控制器中使用ajax进行验证:

public function performAjaxValidation($model1, $model2, $model3, $model4, $model5) {
    Yii::$app->response->format = Response::FORMAT_JSON;
    return ActiveForm::validateMultiple([$model1, $model2, $model3, $model4, $model5]);
}

对于每个型号,我都有一个“独特”规则,如:

[['COUNTRY_LABEL'], 'required',
    'when' => function ($model) {
        return ($model->COUNTRY_ID == 0) || is_null($model->COUNTRY_ID);
    }, 'whenClient' => "function (attribute, value) {
        return ($('#country-country_id').val() == 0) || ($('#country-country_id').val() == \"\");
    }"],   

[['COUNTRY_LABEL'], 'unique', 'message' => 'Country already exist.')],

以及更多......

单一观点:

            <?php
            $form = ActiveForm::begin([
                        'options' => ['enctype' => 'multipart/form-data',],
                        'enableAjaxValidation' => true,
            ]);
            ?>
            <?= $form->field($countryModel, 'COUNTRY_LABEL')->textInput(['maxlength' => true]) ?>

JSON工作正常,我可以在我的视图中看到“不能为空”的消息。 当我想测试'COUNTRY_LABEL'是否唯一时,JSON返回'country already exists'但不要在视图中显示该消息。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

首先,您需要在表单中配置id

$form = ActiveForm::begin([
    'id' => 'contact-form',
    'enableAjaxValidation' => true,
]);

您还需要准备服务器,以便它可以处理AJAX验证请求。这可以通过控制器操作中的以下代码片段来实现:

if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
    Yii::$app->response->format = Response::FORMAT_JSON;
    return ActiveForm::validate($model);
}

最后,这就是我在视图中处理返回的json结果的方法(在这种情况下,迭代data来填充选择字段):

        $.post('" . Yii::$app->urlManager->createUrl('some/action') . "', {id: $('#someform-attrib_id').val()}, function (data) {
            $.each(data, function (key, obj) {
               someSelect.append($('<option>').val(obj.id).text(obj.name));
            })
        });