Здравствуйте! Я столкнулся со следующей проблемой в Yii2:
Я хочу проверять данные ActiveForm формы с помощью ajax. Для этого я объявил форму следующим образом:
<?php
if($new_technic)
$action = Url::to(['admin/create-technic']);
else
$action = Url::to(['admin/update-technic', "id" => $_GET['id']]);
$form = ActiveForm::begin([
'id' => 'technic-form',
'action' => $action,
'enableClientValidation' => false,
'enableAjaxValidation' => true,
'validationUrl' => Url::to(['admin/validate-technic']),
'validateOnSubmit' => true,
]);
?>
<?= $form->field($technic, 'model')->dropDownList($tech_models, ['id' => "tech_model"]); ?>
<div id="model_input" style="display: none; padding-left: 48px;">
<?= $form->field($tech_model, 'firm')->textInput(); ?>
<?= $form->field($tech_model, 'model')->textInput(); ?>
<?= $form->field($tech_model, 'type')->dropDownList($tech_types); ?>
</div>
<?= $form->field($technic, 'logic_id')->dropDownList($logics); ?>
<?= $form->field($technic, 'physic_id')->dropDownList($physics); ?>
<div class="form-group">
<?php
if($new_technic)
$label = 'Добавить';
else
$label = 'Изменить';
echo Html::submitButton($label, ['class' => 'btn btn-primary', 'name' => 'contact-button']);
?>
</div>
<?php
ActiveForm::end();
В этом случае, при валидации, форма посылает запрос на admin/validate-technic и в случае успеха переходит на admin/create-technic.
Вопрос в следующем: что должен возвращать admin/validate-technic в случае неудачной проверки? В официальных доках содержится такая конструкция:
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
Yii::$app->response->format = Response::FORMAT_JSON;
return ActiveForm::validate($model);
}
Т.е. возвращается ассоциативный массив, в котором именами ключей служат названия полей, а значениями - сообщения об ошибках. Тогда я пытаюсь сделать так:
public function actionValidateTechnic()
{
if(Yii::$app->request->isAjax)
{
Yii::$app->response->format = Response::FORMAT_JSON;
$tech = new Technic();
$tech->load($_POST);
return ActiveForm::validate($tech);
}
}
И это действие всегда проводит успешную валидацию, даже если ActiveForm::validate не проводится как надо и возвращает ошибки. При этом если сделать вот так:
public function actionValidateTechnic()
{
return false;
}
То валидация не проводится и форма не отправляется. Но стоит вернуть ActiveForm::validate($tech); как валидация проводится даже если форма заполнена неверно. Т.е. ajax-запрос возвращает сообщение об ошибке, но форма все равно перескакивает на её action.
Вопрос вот в чем: что должен вернуть ajax-запрос, чтобы форма не подтвердилась и высветились нужные сообщения об ошибках? И что он должен вернуть при успешной валидации?