Yii2项目中如果使用了ActiveForm,且有分组验证(类似下一步,下一步这种)的需求时,Yii2本身提供的yiiActiveForm.js是不支持的,我们需要改造此js,并使用改造的yiiActiveForm.js。
最近在yiichina中有人提问,我就顺便分享下改造后的js,并怎么使用,分三步。
定制自己的ActiveForm类
需要自己定制两个类,一个是即将引入自己定制的yiiActiveForm.js的资源类,一个是activeForm用于替换系统的类。
ActiveFormAsset资源类
// ActiveFormAsset.php
namespace common\widgets;
/**
* ActiveFormAsset
*
* @author xiaopig <xiaopig123456@qq.com>
* @since 1.0
*/
class ActiveFormAsset extends \yii\widgets\ActiveFormAsset
{
// 自己定制的js资源存放的位置
public $sourcePath = '@common/assets/js';
// 自己定制的js名
public $js = [
'dookay.activeForm.js',
];
}
ActiveForm类
主要重载 registerClientScript方法,用于引入资源类,代码如下
// MyActiveForm.php
namespace common\widgets;
/**
* ActiveFormWidget
*
* @author xiaopig <xiaopig123456@qq.com>
* @since 1.0
*/
class MyActiveForm extends \yii\widgets\ActiveForm{
/**
* 重载此方法
*/
public function registerClientScript()
{
$id = $this->options['id'];
$options = \yii\helpers\Json::htmlEncode($this->getClientOptions());
$attributes = \yii\helpers\Json::htmlEncode($this->attributes);
$view = $this->getView();
// 这里注册上面的资源包
\common\widgets\ActiveFormAsset::register($view);
$view->registerJs("jQuery('#$id').yiiActiveForm($attributes, $options);");
}
}
改造yiiActiveForm.js
改造后,并重命名为上面提到的 dookay.activeForm.js这个名称,代码比较多,这里不贴出来了,自己下载后用工具比较。
改造后的js提供
groupValidate()
方法来进行局部验证,具体用法请看下面。
下载地址:
在视图中使用
具体使用就很简单了,也Yii2的ActiveForm使用一样。
// 页面视图 <?php $form = \common\widgets\MyActiveForm::begin(['id'=>'js-form']);?> <div class="gorup-1"> <? echo $form->field($model, 'name')->textInput(['maxlength' => 20]) ?> </div> <div class="gorup-2">...</div> <div class="gorup-3">...</div> <?php ActiveForm::end(); ?>
js中局部验证:
<script>
var activeForm = $("#js-form").data("yiiActiveForm");
activeForm.groupValidate($('.gorup-1'),function(validated){
if(validated){
alert('此区域下的表单控件已全部验证通过。');
}else{
alert('此区域下存在未通过验证的表单控件。');
}
});
</script>