驗證惟一性很重要,說不上用得很普及,可是也必需要有。比如註冊功能模塊,手機號、郵箱註冊這些,確定是要驗證其的惟一性的,重複了登陸就會混亂。那麼如何使用Yii2自帶的targetClass驗證惟一性呢?使頁面刷新的可能不少人都會,要是不刷新頁面直接觸發targetClass驗證的應該就少些了吧!不會的也沒必要苦惱,沒必要擔憂,由於我寫這篇文章的目的就是要告訴你怎麼經過頁面不刷新的方式直接觸發targetClass驗證其手機號、郵箱惟一性。php
一、使用Yii2框架自帶的targetClass在不刷新頁面的狀況下驗證手機號、郵箱惟一性。html
這是點擊下一步的時候在頁面沒刷新的狀況下出現的驗證提示「手機號已經註冊」。
html5
一、配置model,我以註冊SignupFrom 的model爲例,rules裏的代碼以下:ajax
public function rules() { return [ ['t_mobile', 'filter', 'filter' => 'trim'], ['t_mobile', 'required'], //targetClass 不會本身調用Ajax驗證,提交表單後纔會觸發 ['t_mobile', 'unique', 'targetClass' => '\login\models\User', 'message' => '手機號已經註冊。'], [['t_mobile'],'match','pattern'=>'/^[1][358][0-9]{9}$/'], ['t_password','required'], ['t_re_password','required'], ['t_re_password','compare','compareAttribute'=>'t_password','message'=>'兩次密碼輸入不一致。'], ['t_password', 'string', 'min' => 6], ['t_re_password', 'string', 'min' => 6], ['company_id', 'trim'], ['t_realname', 'trim'], ['company_id', 'required'], ['t_realname', 'required'], ['company_id', 'string', 'min' => 2, 'max' => 255], ['t_realname', 'string', 'min' => 2, 'max' => 255], ['code', 'required'], //驗證碼驗證,model自定義驗證的寫法,也分享給你們了 ['code', function ($attribute, $params) { $cd=SmsCode::find()->where(['mobile'=>$this->t_mobile,'code'=>$this->$attribute])->one(); if(!empty($cd->code) && (strtolower($this->$attribute) == strtolower($cd->code))){ return true; }else{ $this->addError('code','驗證碼錯誤。'); } }], ]; }
註釋:郵箱和手機號的寫法是同樣的,區別是pattern的驗證規則,如是郵箱驗證就換成郵箱的正則匹配符。
二、在Controller里加上以下一段Ajax提交表單驗證的代碼app
//Ajax表單驗證 if((Yii::$app->request->isAjax && $model->load($post))){ Yii::$app->response->format=Response::FORMAT_JSON; return ActiveForm::validate($model); }
注意:這段代碼要放在控制器註冊方法的最前面,緣由很簡單,不可能你全部的操做都完成了再去走驗證吧?
三、View層的Ajax驗證觸發配置
from表單代碼以下:框架
<?php $form = ActiveForm::begin([ 'action'=>'signup?id=reg', 'id' => 'login-form', 'validateOnBlur'=>false,//關閉失去焦點驗證 'enableAjaxValidation'=>true, //開啓Ajax驗證 'enableClientValidation'=>false //關閉客戶端驗證 ]); ?> <div id="set_up"> <h3 class="form-title font-blue">設置用戶名</h3> <div class="alert alert-danger display-hide"> <button class="close" data-close="alert"></button> <span> Enter any username and password. </span> </div> <div class="form-group has-error"> <!--ie8, ie9 does not support html5 placeholder, so we just show field title for that--> <!-- <label class="control-label visible-ie8 visible-ie9">Username</label>--> <?= $form->field($model, 't_mobile',['inputOptions'=>['class'=>'form-control form-control-solid placeholder-no-fix','placeholder'=>'手機號']])->label('') ?> </div> <div class="form-actions"> <?= Html::Button('下一步', ['class' => 'btn blue uppercase', 'name' => 'login-button','id'=>'next']) ?> <?= Html::a('登陸',['/site/login'],['class' => 'forget-password']) ?> </div> </div>
註釋:(1)、enableAjaxValidation和enableClientValidation的配置必須是enableAjaxValidation爲true,enableClientValidation爲false。除此以外id也必需要有。
(2)、上面的點擊下一步按鈕我使用Button,緣由是個人註冊功能不是一步走完的,須要好幾步,好幾個頁面才能完成註冊,要實現所有無刷新,不能直接使用submitButton提交表單,得本身寫Ajax提交。可是若是大家作的註冊功能是一個頁面實現的話,那就能夠直接用submitButton提交表單了。以上的配置Ajax驗證已經生效,提交表單頁面不刷新的狀況下也能直接觸發targetClass驗證,沒必要擔憂驗證惟一性的時候頁面會刷新了。yii
一、只model裏配置targetClass惟一性驗證,在View層開啓enableAjaxValidation和關閉enableClientValidation驗證,沒有在Controller裏邊加上文章中我所說的Ajax提交表單驗證的代碼,致使Ajax驗證不成功。那段代碼必需要加的。ide
一、YII2表單驗證問題:註冊時ajax驗證手機號惟一 :http://www.yiichina.com/question/241post