yii2 創建ActiveForm(表單)


表單的生成
表單中的方法

    ActiveForm::begin()方法
    ActiveForm::end()方法
    getClientOptions()方法
    其它方法:errorSummary、validate、validateMultiple

表單中的參數

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

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

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

復制代碼
中間為各個項的輸入框,最后由end結尾

    <?php ActiveForm::end(); ?>

復制代碼

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?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 ? $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方法生成的輸入表單都可以進

原文鏈接:http://www.yiifans.com/forum.php?mod=viewthread&tid=51


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM