Yii2创建表单(ActiveForm)方法详解


Posted in PHP onJuly 23, 2016

本文实例讲述了Yii2创建表单(ActiveForm)的方法。分享给大家供大家参考,具体如下:

由于表单涉及到一些验证方面的信息,属性设置又比较多、比较复杂,所以哪里有什么不正确的地方请留言指点

目录

表单的生成

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

表单中的参数
  表单form自身的属性
  表单中各个项(field)输入框相关的属性
    $fieldConfig
    关于验证的属性
    关于每个field容器样式的属性
  ajax验证
  前端js事件
  表单中的其它属性

我们先看看Yii里面最简单的登录表单以及生成的html代码和界面,先有个直观的了解

<?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开始

<?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方法生成的输入表单都可以进行验证

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

PHP 相关文章推荐
PHP IPV6正则表达式验证代码
Feb 16 PHP
php设计模式 Facade(外观模式)
Jun 26 PHP
深入了解PHP类Class的概念
Jun 14 PHP
PHP处理JSON字符串key缺少双引号的解决方法
Sep 16 PHP
php导入excel文件到mysql数据库的方法
Jan 14 PHP
PHP模板引擎Smarty内置变量调解器用法详解
Apr 11 PHP
使用php从身份证号中获取一系列线索(星座、生肖、生日等)
May 11 PHP
Yii CGridView用法实例详解
Jul 12 PHP
php获取ajax的headers方法与内容实例
Dec 27 PHP
PHP使用Redis实现Session共享的实现示例
May 12 PHP
Referer原理与图片防盗链实现方法详解
Jul 03 PHP
如何使用php生成zip压缩包
Apr 21 PHP
Yii2验证器(Validator)用法分析
Jul 23 #PHP
yii2 RBAC使用DbManager实现后台权限判断的方法
Jul 23 #PHP
Yii2简单实现多语言配置的方法
Jul 23 #PHP
yii2控制器Controller Ajax操作示例
Jul 23 #PHP
PHP实现清除MySQL死连接的方法
Jul 23 #PHP
php实现批量修改文件名称的方法
Jul 23 #PHP
golang与PHP输出excel示例
Jul 22 #PHP
You might like
一个可以删除字符串中HTML标记的PHP函数
2006/10/09 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
laravel安装和配置教程
2014/10/29 PHP
自己写的php中文截取函数mb_strlen和mb_substr
2015/02/09 PHP
php实现购物车功能(下)
2016/01/05 PHP
js 纯数字不重复排列的另类方法
2010/07/17 Javascript
修复IE9&amp;safari 的sort方法
2011/10/21 Javascript
jquery对象和javascript对象即DOM对象相互转换
2014/08/07 Javascript
JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)
2015/10/10 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
NodeJS爬虫实例之糗事百科
2017/12/14 NodeJs
Vue 实时监听窗口变化 windowresize的两种方法
2018/11/06 Javascript
Vue入门学习笔记【基本概念、对象、过滤器、指令等】
2019/04/13 Javascript
深入学习TypeScript 、React、 Redux和Ant-Design的最佳实践
2019/06/17 Javascript
js实现图片粘贴到网页
2019/12/06 Javascript
js实现小时钟效果
2020/03/25 Javascript
JavaScript 俄罗斯方块游戏实现方法与代码解释
2020/04/08 Javascript
详解如何在vue+element-ui的项目中封装dialog组件
2020/12/11 Vue.js
Python内置函数的用法实例教程
2014/09/08 Python
Python GUI学习之登录系统界面篇
2019/08/21 Python
python实现图片转换成素描和漫画格式
2020/08/19 Python
python实现简单的井字棋游戏(gui界面)
2021/01/22 Python
详解前端HTML5几种存储方式的总结
2016/12/27 HTML / CSS
Travelstart沙特阿拉伯:廉价航班、豪华酒店和实惠的汽车租赁优惠
2019/04/06 全球购物
端口镜像是怎么实现的
2014/03/25 面试题
linux面试题参考答案(10)
2013/11/04 面试题
工程管理造价应届生求职信
2013/11/13 职场文书
《陈涉世家》教学反思
2014/04/12 职场文书
企业口号大全
2014/06/12 职场文书
关于读书的演讲稿500字
2014/08/27 职场文书
房产授权委托书范本
2014/09/22 职场文书
2014预防青少年违法犯罪工作总结
2014/12/10 职场文书
期末个人总结范文
2015/02/13 职场文书
2015年度优秀员工推荐信
2015/03/23 职场文书
硕士学位申请报告
2015/05/15 职场文书
Golang ort 中的sortInts 方法
2022/04/24 Golang