我需要在Yii2框架中实现自定义表单验证。
我的页面上有以下脚本:
<script src="/assets/acb8f29e/jquery.js"></script>
<script src="/assets/cb9d857a/yii.js"></script>
<script src="/assets/cb9d857a/yii.activeForm.js"></script>
<script src="/unify/assets/js/form.js"></script>
在form.js
内部,我们有一个函数initProfilePage
function initProfilePage(){
$('#form_id').on('beforeValidate', function (e) {
$('#form_id').yiiActiveForm('find', 'attribute').validate = function (attribute, value, messages, deferred, $form) {
//Custom Validation
}
return true;
});
}
在页面的最底部,我有以下脚本:
<script>
jQuery(function ( $ ) {
initProfilePage();
jQuery('#user-profile').yiiActiveForm(... here we have the validation parameter which works fine ...)
});
</script>
表单显示正确,没有任何错误,但是当我提交表单时,我收到以下错误:
TypeError: $(...).yiiActiveForm(...) is undefined
我做错了什么?如何修复它?
发布于 2018-07-26 09:05:11
错误的原因是,当您调用$('#form_id').yiiActiveForm('find', 'attribute')
时,实际上在第一个参数中传递了函数名find
,在第二个参数中传递了要验证的输入。但是它不应该是name
属性,而应该是id
,它也是由model-attribute
格式的ActiveForm
生成的。
它为validate undefined
抛出错误,因为find
方法返回undefined
,而它应该返回要验证的输入的attributes
,并且返回undefined
的原因是其中之一
ActiveForm
配置中的"enableClientValidation"=>false
。要为要验证的特定字段生成与ActiveForm
生成的名称完全相同的名称,可以使用\yii\helpers\Html::getInputId($model,'attribute')
。
因此,要像下面这样更改您的javascript
$this->registerJs ( "$('#form_id').on('beforeValidate', function (e) {
$('#form_id').yiiActiveForm('find', '".Html::getInputId($model , 'name')."').validate = function (attribute, value, messages, deferred, \$form) {
console.log('validating now');
}
return false;
});", \yii\web\View::POS_READY);
https://stackoverflow.com/questions/51524169
复制相似问题