Yii2表单ActiveForm是一个非常方便的表单生成组件。可以把继承\yii\db\ActiveRecord的模型rules转换成js验证规则,这样开发者在写表单时就不需要添加前端验证了。
基本使用这里不做介绍,请看官方文档。
全局配置
全局设置模板关键在fieldConfig属性。
<?php $form = ActiveForm::begin([
// form标签配置
'id'=>'my-form',
'options' => ['class'=>'form-horizontal'],
'action' => '',
// 验证配置
'validateOnBlur'=>false,
'validateOnSubmit'=>true,
'enableAjaxValidation'=>false, // 是否进行异步验证
// 自定义全局模板
'fieldConfig'=>[
'options'=>[
// 设置最外层div的类
'class'=>'form-group',
// 去除最外层div标签
'tag' => false
],
// 模板
'template'=>'{label}\n{input}\n{hint}\n{error}',
// 标签配置
'labelOptions' => ['class' => 'control-label'],
// input输入框配置
'inputOptions'=>['class'=>'form-control'],
// error错误配置
'errorOptions'=>['class'=>''],
// 提示配置
'hintOptions'=>['class'=>''],
]
]);?>
...
...
<?php ActiveForm::end();?>
字段配置
单独的字段配置会覆盖全局的配置。
<?= $form->field($model,'username',[
'options'=>[
// 设置最外层div的类默认是class="form-group"
'class'=>'flex-1 pr-10',
// 去除最外层div标签
'tag' => false
],
// 设置模板
'template'=>'{label}\n{input}\n{hint}\n{error}',
// 标签配置,这里会覆盖全局,但会被下面的label覆盖
'labelOptions'=>[],
// input输入框配置,这里会覆盖全局,但会被下面textInput的配置覆盖
'inputOptions'=>[].
])->textInput([
// 设置input的类,默认是class="form-control",这里会覆盖field配置和全局配置,优先级最高
'class'=>''
])->label('设置label名',[
//labelOptions配置 ,这里的配置会覆盖field配置和全局配置,优先级最高
]); ?>
验证码
验证码显示需要用到yii\captcha\Captcha类型,同事$model中rules需要对应字段为['字段名','captcha']。
<?=$form->field($model, 'captcha')
->widget(\yii\captcha\Captcha::className(), [
// 验证码action
'captchaAction' => '/site/captcha',
// 验证码模板
'template' => '{label}\n{input}\n{image}\n{hint}\n{error}',
// 验证码图片配置
'imageOptions'=>['class'=>'dk-code'],
// 其他配置 同上字段配置
'options'=>[],
// ...
])
?>
单复选
请参看下面的相关文章“Yii2自定义checkboxList和radioList样式”;
异步提交
前端提交表单避免Ajax异步操作,这样可以有很好的用户的体验。
$('#my-form').on('beforeSubmit', function (e) {
// 这里执行异步提交表单
}).on('submit', function (e) {
e.preventDefault();
});