本文實例講述了Yii2創建表單(ActiveForm)的方法。分享給大家供大家參考,具體如下:
由于表單涉及到一些驗證方面的信息,屬性設置又比較多、比較復雜,所以哪里有什么不正確的地方請留言指點
目錄
表單的生成
表單中的方法
ActiveForm::begin()方法
ActiveForm::end()方法
getClientOptions()方法
其它方法:errorSummary、validate、validateMultiple
表單中的參數
表單form自身的屬性
表單中各個項(field)輸入框相關的屬性
$fieldConfig
關于驗證的屬性
關于每個field容器樣式的屬性
ajax驗證
前端js事件
表單中的其它屬性
我們先看看Yii里面最簡單的登錄表單以及生成的html代碼和界面,先有個直觀的了解
1
2
3
4
5
6
7
8
9
10
11
|
<?php $form = ActiveForm::begin([ 'id' => 'login-form' ]); ?> <?= $form ->field( $model , 'username' ) ?> <?= $form ->field( $model , 'password' )->passwordInput() ?> <?= $form ->field( $model , 'rememberMe' )->checkbox() ?> <div style= "color:#999;margin:1em 0" > If you forgot your password you can <?= Html::a( 'reset it' , [ 'site/request-password-reset' ]) ?> </div> <div class = "form-group" > <?= Html::submitButton( 'Login' , [ 'class' => 'btn btn-primary' , 'name' => 'login-button' ]) ?> </div> <?php ActiveForm:: end (); ?> |
下面是生成的表單Html,我在里面標明了5部分。
1、表單的生成
在Yii中表單即ActiveForm也是Widget,在上面可以看到是由begin開始
1
|
<?php $form = ActiveForm::begin([ 'id' => 'login-form' ]); ?> |
中間為各個項的輸入框,最后由end結尾
1
|
<?php ActiveForm:: end (); ?> |
2、表單中的方法
在Widget中begin()方法會調用int方法
1
|
public function init() |
在最后的end()方法會調用run方法
1
|
public function run() |
1、ActiveForm::begin()方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
//這個是在執行 $form = ActiveForm::begin(['id' => 'login-form']); 中的begin方法的時候調用的 public function init() { //設置表單元素form的id if (!isset( $this ->options[ 'id' ])) { $this ->options[ 'id' ] = $this ->getId(); } //設置表單中間的要生成各個field的所使用的類 if (!isset( $this ->fieldConfig[ 'class' ])) { $this ->fieldConfig[ 'class' ] = ActiveField::className(); } //這個就是輸出表單的開始標簽 //如:<form id="login-form" action="/lulublog/frontend/web/index.php?r=site/login" method="post"> echo Html::beginForm( $this ->action, $this ->method, $this ->options); } |
2、ActiveForm::end()方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
//這個是在執行 ActiveForm::end(); 中的end方法的時候調用的 public function run() { //下面這個就是往視圖中注冊表單的js驗證腳本, if (! empty ( $this ->attributes)) { $id = $this ->options[ 'id' ]; $options = Json::encode( $this ->getClientOptions()); $attributes = Json::encode( $this ->attributes); $view = $this ->getView(); ActiveFormAsset::register( $view ); /* * $attributes:為要驗證的所有的field數組。它的值是在activeform中創建field的時候,在field的begin方法中給它賦值的。 * 其中每個field又是一個數組,為這個field的各個參數 * 比如username的field中的參數有 * validate、id、name、 * validateOnChange、validateOnType、validationDelay、 * container、input、error * * $options:為這個表單整體的屬性,如: * errorSummary、validateOnSubmit、 * errorCssClass、successCssClass、validatingCssClass、 * ajaxParam、ajaxDataType */ $view ->registerJs( "jQuery('#$id').yiiActiveForm($attributes, $options);" ); } //輸出表單的結束標簽 echo Html::endForm(); } |
3、getClientOptions()方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
/* * 設置表單的全局的一些樣式屬性以及js回調事件等 */ protected function getClientOptions() { $options = [ 'errorSummary' => '.' . $this ->errorSummaryCssClass, 'validateOnSubmit' => $this ->validateOnSubmit, 'errorCssClass' => $this ->errorCssClass, 'successCssClass' => $this ->successCssClass, 'validatingCssClass' => $this ->validatingCssClass, 'ajaxParam' => $this ->ajaxParam, 'ajaxDataType' => $this ->ajaxDataType, ]; if ( $this ->validationUrl !== null) { $options [ 'validationUrl' ] = Url::to( $this ->validationUrl); } foreach ([ 'beforeSubmit' , 'beforeValidate' , 'afterValidate' ] as $name ) { if (( $value = $this -> $name ) !== null) { $options [ $name ] = $value instanceof JsExpression ? $value : new JsExpression( $value ); } } return $options ; } |
下面這個是生成的表單驗證Js代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
jQuery(document).ready( function () { jQuery( '#login-form' ).yiiActiveForm( { "username" :{ "validate" : function (attribute, value, messages) { yii.validation.required(value, messages, { "message" : "Username cannot be blank." }); }, "id" : "loginform-username" , "name" : "username" , "validateOnChange" : true , "validateOnType" : false , "validationDelay" :200, "container" : ".field-loginform-username" , "input" : "#loginform-username" , "error" : ".help-block" }, "password" :{ "validate" : function (attribute, value, messages) { yii.validation.required(value, messages, { "message" : "Password cannot be blank." }); }, "id" : "loginform-password" , "name" : "password" , "validateOnChange" : true , "validateOnType" : false , "validationDelay" :200, "container" : ".field-loginform-password" , "input" : "#loginform-password" , "error" : ".help-block" }, "rememberMe" :{ "validate" : function (attribute, value, messages) { yii.validation.boolean(value, messages, { "trueValue" : "1" , "falseValue" : "0" , "message" : "Remember Me must be either \"1\" or \"0\"." , "skipOnEmpty" :1}); }, "id" : "loginform-rememberme" , "name" : "rememberMe" , "validateOnChange" : true , "validateOnType" : false , "validationDelay" :200, "container" : ".field-loginform-rememberme" , "input" : "#loginform-rememberme" , "error" : ".help-block" } }, { "errorSummary" : ".error-summary" , "validateOnSubmit" : true , "errorCssClass" : "has-error" , "successCssClass" : "has-success" , "validatingCssClass" : "validating" , "ajaxParam" : "ajax" , "ajaxDataType" : "json" }); }); |
4、其它方法:errorSummary、validate、validateMultiple
1
|
public function errorSummary( $models , $options = []) |
它主要就是把model中的所有的錯誤信息匯總到一個div中。
1
2
|
public static function validate( $model , $attributes = null) public static function validateMultiple( $models , $attributes = null) |
這兩個是獲取錯誤信息的方法,比較簡單也不說了。
3、表單中的參數
1、表單form自身的屬性
$action:設置當前表單提交的url地址,如果為空則是當前的url
$method:提交方法,post或者get,默認為post
$option:這個里面設置表單的其它的屬性,如id等,如果沒有設置id,將會自動生成一個以$autoIdPrefix為前綴的自動增加的id
1
2
3
4
5
6
7
8
|
//這個方法在Widget基本中 public function getId( $autoGenerate = true) { if ( $autoGenerate && $this ->_id === null) { $this ->_id = self:: $autoIdPrefix . self:: $counter ++; } return $this ->_id; } |
2、表單中各個項(field)輸入框相關的屬性
Yii生成的每個field由4部分組成:
① 最外層div為每個field的容器,
② label為每個field的文本說明,
③ input為輸入元素,
④ 還有一個div為錯誤提示信息。
1
2
3
4
5
|
< div class = "form-group field-loginform-username required has-error" > < label class = "control-label" for = "loginform-username" >Username</ label > < input type = "text" id = "loginform-username" class = "form-control" name = "LoginForm[username]" > < div class = "help-block" >Username cannot be blank.</ div > </ div > |
$fieldConfig:這個是所有的field的統一的配置信息設置的屬性。也就是說在field類中的屬性都可以在這里進行設置。
1
2
3
4
5
6
7
8
9
10
|
public function field( $model , $attribute , $options = []) { //使用fieldConfig和options屬性來創建field //$options會覆蓋統一的fieldConfig屬性值,以實現每個field的自定義 return Yii::createObject( array_merge ( $this ->fieldConfig, $options , [ 'model' => $model , 'attribute' => $attribute , 'form' => $this , ])); } |
關于驗證的屬性:
① $enableClientValidation:是否在客戶端驗證,也即是否生成前端js驗證腳本(如果在form中設置了ajax驗證,也會生成這個js腳本)。
② $enableAjaxValidation:是否是ajax驗證
③ $validateOnChange:在輸入框失去焦點并且值改變的時候驗證
④ $validateOnType:正在輸入的時候就進行驗證
⑤ $validationDelay:驗證延遲的時間,單位為毫秒
這5個屬性都可以在創建每個field的時候單獨設置,因為在field類中就有這5個屬性。
關于每個field容器樣式的屬性:
$requiredCssClass:必填項的樣式,默認為‘required'
$errorCssClass:驗證錯誤的樣式,默認值為‘has-error'
$successCssClass:驗證正確的樣式,默認值為‘has-success'
$validatingCssClass:驗證過程中的樣式,默認值為‘validating'
3、ajax驗證
$validationUrl:ajax驗證的url地方
$ajaxParam:url中的get參數,用來標明當前是ajax請求,默認值為‘ajax'
$ajaxDataType:ajax請求返回的數據格式
4、前端js事件屬性
$beforeSubmit:在提交表單之前事件,如果返回false,則不會提交表單,格式為:
1
2
3
|
function ( $form ) { ... return false to cancel submission... } |
$beforeValidate:在每個屬性在驗證之前觸發,格式為:
1
2
3
|
function ( $form , attribute, messages) { ... return false to cancel the validation... } |
$afterValidate:在每個屬性在驗證之后觸發,格式為:
1
2
|
function ( $form , attribute, messages) { } |
5、表單中的其它屬性
$validateOnSubmit:提交表單的時候進行驗證
$errorSummary:總的錯誤提示地方的樣式
$attributes:這個屬性比較特殊,它是在創建field的時候,在field中為這個form中的$attributes賦值的。這樣可以確保通過field方法生成的輸入表單都可以進行驗證
希望本文所述對大家基于Yii框架的PHP程序設計有所幫助。