php语言

Yii2创建表单(ActiveForm)方法

时间:2022-11-17 06:16:20 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)方法】相关文章:

Dreamweaver用属性面板创建链接的方法12-23

职称计算机Dreamwaver教程:认识表单对象05-16

绩效的改进方法12-08

绿色学校创建教案(通用5篇)10-20

小学创建绿色校园教案(精选12篇)12-08

ps黑白的色调的方法11-12

photoshop的使用方法12-09

科目一的考试方法10-27

日语学习的入门方法04-10

网速的计算方法06-17