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代码把全角数字转为半角数字
Dec 10 PHP
php MYSQL 数据备份类
Jun 19 PHP
php 接口类与抽象类的实际作用
Nov 26 PHP
zf框架的校验器使用使用示例(自定义校验器和校验器链)
Mar 13 PHP
PHP连接access数据库
Mar 27 PHP
php 在线导入mysql大数据程序
Jun 11 PHP
PHP+sqlite数据库操作示例(创建/打开/插入/检索)
May 26 PHP
thinkphp,onethink和thinkox中验证码不显示的解决方法分析
Jun 06 PHP
php模拟post上传图片实现代码
Jun 24 PHP
PHP记录和读取JSON格式日志文件
Jul 07 PHP
thinkPHP批量删除的实现方法分析
Nov 09 PHP
PHP 超级全局变量相关总结
Jun 30 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
在同一窗体中使用PHP来处理多个提交任务
2006/10/09 PHP
UCenter 批量添加用户的php代码
2012/07/17 PHP
PHP处理postfix邮件内容的方法
2015/06/16 PHP
php 从一个数组中随机的取出若干个不同的数实例
2016/12/31 PHP
一些有用的JavaScript和jQuery的片段分享
2011/08/23 Javascript
js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS
2013/11/18 Javascript
JavaScript strike方法入门实例(给字符串加上删除线)
2014/10/17 Javascript
javascript实现修改微信分享的标题内容等
2014/12/11 Javascript
node.js中的fs.chmodSync方法使用说明
2014/12/18 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
jQuery 遍历函数详解
2015/07/05 Javascript
js+html5实现canvas绘制网页时钟的方法
2016/05/21 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
2017/06/08 jQuery
jQuery实现锚点向下平滑滚动特效示例
2017/08/29 jQuery
利用express启动一个server服务的方法
2017/09/17 Javascript
React根据宽度自适应高度的示例代码
2017/10/11 Javascript
arcgis for js栅格图层叠加(Raster Layer)问题
2017/11/22 Javascript
详解如何实现一个简单的 vuex
2018/02/10 Javascript
vue.js中ref及$refs的使用方法解析
2019/10/08 Javascript
vue自定义指令实现仅支持输入数字和浮点型的示例
2019/10/30 Javascript
微信小程序事件流原理解析
2019/11/27 Javascript
小程序双头slider选择器的实现示例
2020/03/31 Javascript
微信小程序多列表渲染数据开关互不影响的实现
2020/06/05 Javascript
vue路由结构可设一层方便动态添加路由操作
2020/08/31 Javascript
vue使用lodop打印控件实现浏览器兼容打印的方法
2021/02/07 Vue.js
在Python中调用ggplot的三种方法
2015/04/08 Python
关于Python中Inf与Nan的判断问题详解
2017/02/08 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
2019/02/22 Python
快速解决Django关闭Debug模式无法加载media图片与static静态文件
2020/04/07 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
2020/05/23 Python
python 解决函数返回return的问题
2020/12/05 Python
电钳专业个人求职信
2014/01/04 职场文书
公司成本主管岗位责任制
2014/02/21 职场文书
大学生评语大全
2014/04/18 职场文书
药房管理制度范本
2015/08/06 职场文书
机关干部正风肃纪心得体会
2016/01/15 职场文书