我正在使用Promo Code输入表单,用户将其促销代码输入表单,表单通过ajax提交.然后,我们对促销代码细节执行数据库查找,验证代码,如果代码验证,我们要显示隐藏在页面上的注册表单.
我有一个表单字段“代码”的自定义验证功能,它是名为“寄存器”的模型场景中的活动字段.
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指南所示,我使用以下代码来捕获这个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->字段($model,’code’)字段中删除焦点,Yii的ajax验证将基于我的自定义验证逻辑,并显示我的自定义错误消息.
当我去提交表格时,我的挑战就出现了.表单提交也通过ajax处理,因此控制器动作总是返回ActiveForm :: validate($model)的结果;因为if(Yii :: $app-> request-> isAjax&&$model-> load(Yii :: $app-> request-> post()))将适用于ajax表单验证和表单提交.
使用上述方法,我被迫返回只有ajax验证的结果,而不是我可能需要额外的客户端验证的任何json数据,例如在通过ajax表单提交有效的使用代码之后显示注册表单.
我意识到我可以设置’enableAjaxValidation’=>在ActiveForm中为false,然后在if(Yii :: $app-> request-> isAjax& $model-> load(Yii :: $app-> request->请求中)中返回自己的json数据; post()))条件.如果我这样做,我可以显示注册表单,因为我有我自己的json数据来处理.
有没有办法在用ajax提交的表单上进行ajax验证?您如何分别从ajax表单提交中捕获ajax验证,以不同的方式处理这两个事件?
任何建议或替代方法都非常感激!