版权声明:本文非博主原创文章,原文链接http://www.dodobook.net/php/2290。 https://blog.csdn.net/gc258_2767_qq/article/details/70847441
作为一个yii2新手来说,对于验证码真是又爱又恨,框架自带的验证码解决了自写验证码的烦恼,然而还是有些小问题。
需求:登陆输入:用户名、密码、验证码
弹框登录+ajax验证
1、LoginForm.php(跟大多数人加验证码的方式一致)
public function rules()
{
return [
[['userID', 'password'], 'required'],
['password', 'validatePassword'],
['code','captcha','captchaAction'=>'site/captcha']
];
}
2、页面(ActiveForm enableAjaxValidation和id是异步提交必不可少的,validationUrl异步验证的方法)
因为是弹框登录,From中的验证和提交url,是分开写的。
<?php
$form = ActiveForm::begin([
'id' => 'login-form',
'enableAjaxValidation' => true,
'enableClientValidation' => true, //开启客户端验证,生成js
'validationUrl' => Url::toRoute(['validate-form']),
]);
?>
3、控制器
// 看主要的验证操作,该操作是表单字段失去焦点时异步验证,同时如果直接提交表单,也会先执行该操作进行验证
public function actionValidateForm() {
if(Yii::$app->request->isAjax&&isset($_POST['ajax'])){
$model = new LoginForm(); //这里要替换成自己的模型类
$model->load(Yii::$app->request->post());
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
$errors=\yii\bootstrap\ActiveForm::validate($model,array('userID','password'));
if(sizeof($errors)>0){
return $errors;
}
return true;
}
之前存在的问题:
1、弹框登录,ajax异步提交。
解决方法:ActiveForm里面添加
'enableAjaxValidation' => true,
'validationUrl' => Url::toRoute(['validate-form']),
2、可以在弹出的登陆框里面验证数据,But验证码输入正确,依然会提示错误。
错误原因:ActiveForm::validate的验证我指定了验证字段,因为如果验证所有的,那验证码将会出问题,因为每次验证后都会生成新的验证码。
解决方法:思路就是这里的数据校验只验证 密码 名字。验证码的校验交给yii来做。 (ps:照搬别人的^~^),
so:解决