首頁 後端開發 php教程 Yii2建立表單(ActiveForm)方法詳解_php實例

Yii2建立表單(ActiveForm)方法詳解_php實例

Aug 04, 2016 am 08:56 AM
yii2

本文實例講述了Yii2創建表單(ActiveForm)的方法。分享給大家參考,具體如下:

由於表單涉及一些驗證方面的信息,屬性設定又比較多、比較複雜,所以哪裡有什麼不正確的地方請留言指點

目錄

表單的產生

表單中的方法
  ActiveForm::begin()方法
  ActiveForm::end()方法
  getClientOptions()方法
  其它方法:errorSummary、validate、validateMultiple

表單中的參數
  表單form自身的屬性
  表單中各項(field)輸入框相關的屬性
    $fieldConfig
    關於驗證的屬性
    關於每個field容器樣式的屬性
  ajax驗證
  前端js事件
  表單中的其它屬性

我們先看看Yii裡面最簡單的登入表單以及產生的html程式碼和介面,先有個直覺的了解

<&#63;php $form = ActiveForm::begin(['id' => 'login-form']); &#63;>
  <&#63;= $form->field($model, 'username') &#63;>
  <&#63;= $form->field($model, 'password')->passwordInput() &#63;>
  <&#63;= $form->field($model, 'rememberMe')->checkbox() &#63;>
  <div style="color:#999;margin:1em 0">
   If you forgot your password you can <&#63;= Html::a('reset it', ['site/request-password-reset']) &#63;>
  </div>
  <div class="form-group">
     <&#63;= Html::submitButton('Login', ['class' => 'btn btn-primary', 'name' => 'login-button']) &#63;>
  </div>
<&#63;php ActiveForm::end(); &#63;>

登入後複製

下面是產生的表單Html,我在裡面標示了5部分。

1、表單的生成

在Yii中表單即ActiveForm也是Widget,在上面可以看到是由begin開始

<&#63;php $form = ActiveForm::begin(['id' => 'login-form']); &#63;>

登入後複製

中間為各項的輸入框,最後由end結尾

<&#63;php ActiveForm::end(); &#63;>

登入後複製

2、表單中的方法

在Widget中begin()方法會呼叫int方法

public function init()

登入後複製

在最後的end()方法會呼叫run方法

public function run()

登入後複製

1、ActiveForm::begin()方法

//这个是在执行 $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&#63;r=site/login" method="post">
    echo Html::beginForm($this->action, $this->method, $this->options);
}

登入後複製

2、ActiveForm::end()方法

//这个是在执行 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()方法

/*
* 设置表单的全局的一些样式属性以及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 &#63; $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

public function errorSummary($models, $options = [])

登入後複製

它主要就是把model中的所有的錯誤訊息匯總到一個div中。

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

//这个方法在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為錯誤提示訊息。

<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類別中的屬性都可以在這裡設定。

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,則不會提交表單,格式為:

function ($form) {
 ...return false to cancel submission...
}

登入後複製

$beforeValidate:在每個屬性在驗證之前觸發,格式為:

function ($form, attribute, messages) {
 ...return false to cancel the validation...
}

登入後複製

$afterValidate:在每个属性在验证之后触发,格式为:

function ($form, attribute, messages) {
}

登入後複製

5、表单中的其它属性

$validateOnSubmit:提交表单的时候进行验证
$errorSummary:总的错误提示地方的样式
$attributes:这个属性比较特殊,它是在创建field的时候,在field中为这个form中的$attributes赋值的。这样可以确保通过field方法生成的输入表单都可以进行验证

更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話如何劫持工作,如何在PHP中減輕它? 會話如何劫持工作,如何在PHP中減輕它? Apr 06, 2025 am 12:02 AM

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

描述紮實的原則及其如何應用於PHP的開發。 描述紮實的原則及其如何應用於PHP的開發。 Apr 03, 2025 am 12:04 AM

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

在PHPStorm中如何進行CLI模式的調試? 在PHPStorm中如何進行CLI模式的調試? Apr 01, 2025 pm 02:57 PM

在PHPStorm中如何進行CLI模式的調試?在使用PHPStorm進行開發時,有時我們需要在命令行界面(CLI)模式下調試PHP�...

如何在系統重啟後自動設置unixsocket的權限? 如何在系統重啟後自動設置unixsocket的權限? Mar 31, 2025 pm 11:54 PM

如何在系統重啟後自動設置unixsocket的權限每次系統重啟後,我們都需要執行以下命令來修改unixsocket的權限:sudo...

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

如何用PHP的cURL庫發送包含JSON數據的POST請求? 如何用PHP的cURL庫發送包含JSON數據的POST請求? Apr 01, 2025 pm 03:12 PM

使用PHP的cURL庫發送JSON數據在PHP開發中,經常需要與外部API進行交互,其中一種常見的方式是使用cURL庫發送POST�...

See all articles