Мне интересно, могут ли какие-либо эксперты Yii2 помочь мне понять, как лучше всего работать с формами ajax в сочетании с валидацией Yii ajax. Думаю, я могу объяснить проблему, не пропустив весь мой код.
Я работаю над формой ввода промо-кода, в которой пользователь вводит свой промо-код в форму, форма отправляется через ajax. Затем мы выполняем поиск базы данных для деталей промо-кода, проверяем код и, если код проверяется, мы хотим отобразить регистрационную форму, которая скрыта на странице.
У меня есть специальная функция проверки для поля формы "code", которая является активным полем в модельном сценарии с именем "register".
class UserCode extends ActiveRecord
{
...
public function scenarios()
{
return [
'register' => ['code'],
];
}
public function rules()
{
return [
[['code'], 'required'],
[['code'], 'validateUserCode', 'on' => ['register']],
];
}
public function validateUserCode($attribute, $params)
{
// perform all my custom logic to determine if the code is valid
if ($code_invalid) {
$this->addError($attribute, 'Sorry, this code is invalid.');
}
}
...
}
Затем в контроллере, как предлагает Yii2 Guide, я задерживаю эту проверку ajax следующим кодом:
public function actionValidate() {
$model = new UserCode(['scenario' => 'register']);
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
Yii::$app->response->format = Response::FORMAT_JSON;
return ActiveForm::validate($model);
}
// no logic can be run after the above code b/c the form is submit with ajax
// and therefore always trapped in the Yii::$app->request->isAjax conditional
}
Приведенный выше код работает отлично, и если я удаляю фокус из поля $form->field($model, 'code')
в моей форме, выполняется проверка Yii ajax и выводит мое пользовательское сообщение об ошибке на основе моей пользовательской логики проверки.
Моя задача возникает, когда я отправляю форму. Подача формы также обрабатывается через ajax, и поэтому действие контроллера всегда возвращает результат ActiveForm::validate($model);
, потому что if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post()))
будет применяться как к валидации формы ajax, так и к форме submit.
С приведенным выше подходом я вынужден возвращать только результаты проверки ajax, а не любые json-данные, которые могут понадобиться для дополнительной проверки на стороне клиента, например, отображение регистрационной формы после того, как действительный код использования отправлен через ajax.
Я понимаю, что я могу установить 'enableAjaxValidation' => false
в ActiveForm, а затем вернуть свои собственные данные json внутри условия if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post()))
. Если я это сделаю, я могу показать регистрационную форму, потому что у меня есть свои собственные данные json для работы.
Есть ли способ иметь ajax-проверку в форме, представленной с помощью ajax? Как вы могли бы отследить проверку ajax отдельно от представления формы ajax для обработки двух событий разными способами?
Любые предложения или альтернативные подходы высоко ценятся!