激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - Yii2創建表單(ActiveForm)方法詳解

Yii2創建表單(ActiveForm)方法詳解

2021-02-18 16:22wjtlht928 PHP教程

這篇文章主要介紹了Yii2創建表單(ActiveForm)的方法,結合實例形式詳細分析了Yii創建表單的詳細步驟及相關函數與屬性的使用技巧,需要的朋友可以參考下

本文實例講述了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程序設計有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 男人午夜小视频 | 久久精品观看 | 国产毛片毛片 | 国产亚洲精品久久午夜玫瑰园 | 免费观看黄色影片 | 91久久国产露脸精品免费 | 中文字幕在线免费看 | 午夜视频在线观看免费视频 | 激情综合在线 | 黄色免费播放网站 | 爽爽淫人网 | 欧美十区 | 成人一级免费视频 | 老司机免费福利午夜入口ae58 | 欧美日本另类 | 成年人高清视频在线观看 | 日美黄色片 | 国产九九九九 | 毛片在线播放视频 | 97精品视频在线观看 | 中文字幕欧美日韩 | 污片在线观看视频 | 日本欧美一区二区三区在线观看 | 欧美特黄a | 色污视频 | 姑娘第四集免费看视频 | 婷婷久久影院 | 国产精品视频六区 | 最近中文字幕一区二区 | 久久久久久久久久久国产精品 | 国产精品视频免费在线观看 | 国产精品久久亚洲 | 国产精品av久久久久久久久久 | 午夜在线观看视频网站 | 在线成人免费网站 | 欧美中文字幕一区二区三区亚洲 | 九九热在线视频免费观看 | 国产一级二级在线播放 | 中国的免费的视频 | 九九午夜 | 欧美色大成网站www永久男同 |