我在一个表单中有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'但不要在视图中显示该消息。
我做错了什么?
答案 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));
})
});