Проверьте уникальное поле, используя Ajax, Yii2 ActiveForm

Я новичок в Yii и не могу понять, как работает проверка ajax ActiveForm,
В моей модели у меня есть уникальное поле:

public function rules()
{
return [
//...
[['end_date'], 'unique'], //ajax is not working

[   'end_date', //ajax is working
'compare',
'compareAttribute'=>'start_date',
'operator'=>'>=',
'skipOnEmpty'=>true,
'message'=>'{attribute} must be greater or equal to "{compareValue}".'
],
];
}

Правило сравнения проверяется с помощью ajax и работает нормально, но unique не является. Я попытался включить проверку AJAX в форме:

  <?php $form = ActiveForm::begin( ['id' => 'routingForm', 'enableClientValidation' => true, 'enableAjaxValidation' => true]); ?>

Но не знаю, что делать дальше.

контроллер:

public function actionCreate()
{
$model = new Routing();
$cities = [];
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['index']);
} else {
return $this->renderAjax('create', [
'model' => $model,
'cities' => $cities
]);
}
}

Я знаю, что мог бы сделать AJAX вызов на контроллер на end_date изменить событие и форму submit, но не уверен, как сделать все соответствующие CSS, чтобы показать ошибки.

0

Решение

Вам нужно использовать Yii::$app->request->isAjax в контроллере.

public function actionCreate()
{
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
return ActiveForm::validate($model);
}
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['index']);
} else {
return $this->renderAjax('create', [
'model' => $model,
'cities' => $cities
]);
}
}
1

Другие решения

Попробуйте этот код в вашем контроллере …

public function actionCreate()
{
$model = new Routing();
$cities = [];

if(Yii::$app->request->isAjax){
$model->load(Yii::$app->request->post());
return Json::encode(\yii\widgets\ActiveForm::validate($model));
}

if ($model->load(Yii::$app->request->post()) && $model->save())  {
return $this->redirect(['index']);
} else {
return $this->renderAjax('create', [
'model' => $model,
'cities' => $cities
]);
}
}
1

По вопросам рекламы [email protected]