<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. php語言

    Yii2創建表單(ActiveForm)方法

    時間:2025-01-12 19:08:11 php語言 我要投稿
    • 相關推薦

    Yii2創建表單(ActiveForm)方法

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

      由于表單涉及到一些驗證方面的信息,屬性設置又比較多、比較復雜,所以哪里有什么不正確的地方請留言指點

      目錄

      表單的生成

      表單中的方法

      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() ?>

      <p style="color:#999;margin:1em 0">

      If you forgot your password you can <?= Html::a('reset it', ['site/request-password-reset']) ?>

      </p>

      <p class="form-group">

      <?= Html::submitButton('Login', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?>

      </p>

      <?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代

      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中的所有的錯誤信息匯總到一個p中。

      ?

      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部分組成:

      ① 最外層p為每個field的容器,

      ② label為每個field的文本說明,

      ③ input為輸入元素,

      ④ 還有一個p為錯誤提示信息。

      ?

      1

      2

      3

      4

      5

      <p 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]">

      <p class="help-block">Username cannot be blank.</p>

      </p>

      $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'

    【Yii2創建表單(ActiveForm)方法】相關文章:

    PHP 表單驗證方法11-01

    常用表單驗證的js方法11-12

    PHP提交from表單的方法07-05

    php防止表單重復提交的方法10-16

    使用php自動提交表單的方法11-16

    php提交form表單處理方法07-12

    用PHP提交from表單的處理方法09-06

    ThinkPHP中create()方法自動驗證表單信息09-10

    兩種實現表單驗證的javascript方法09-19

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人