Yii 客户端验证和 jQuery Form 插件集成

发布于 2025-01-07 08:01:15 字数 400 浏览 1 评论 0原文

我在我的一个项目中使用 Yii 框架,我想一起使用 jQuery Form 插件使用 Yii 客户端内置验证。

我无法让他们一起工作。如果我使用这个简单的 js 代码设置 jQuery 表单插件:

$('#myform-id').ajaxForm();

将执行客户端验证,但即使验证失败,它也不会停止表单提交。我认为这与 Yii 客户端验证库和 jQuery 表单插件在表单上绑定相同的“提交”事件有关。

仅供参考,我仔细检查了 FireBug 和 Chrome 控制台没有 js 错误。

我想知道是否有人遇到过同样的问题并以某种方式解决了这个问题。

I'm using Yii framework in one of my projects and I would like to use the jQuery Form plugin together with Yii client-side built-in validation.

I can't get them work together. If I setup jQuery form plugin with this simple js code:

$('#myform-id').ajaxForm();

the client-side validation is performed but it doesn't stop the form submission even if the validation fails. I suppose that this is related to the fact that both Yii client-side validation library and jQuery form plugin bind the same "submit" event on the form.

FYI, I double checked that there no js errors with FireBug and Chrome console.

I wonder if someone experienced the same issue and solved that someway.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

迷鸟归林 2025-01-14 08:01:15

我这样解决了:

Yii Active Form init code:

<?php $form = $this->beginWidget('CActiveForm', array(
    'id'=>'user-form',
    'enableClientValidation'=>true,
    'clientOptions' => array(
         'validateOnSubmit'=>true,
         'validateOnChange'=>false,
         'afterValidate'=>'js:submiAjaxForm'
     )
)); ?>

在同一页面中,我添加了这个 js 代码以通过 jquery 表单插件提交表单:

function submitAjaxForm(form, data, hasError)
{
   if(!hasError)
   {
       $('#user-form').ajaxSubmit(
       {
           // ajax options here
       });
   }
}

I solved this way:

Yii Active Form init code:

<?php $form = $this->beginWidget('CActiveForm', array(
    'id'=>'user-form',
    'enableClientValidation'=>true,
    'clientOptions' => array(
         'validateOnSubmit'=>true,
         'validateOnChange'=>false,
         'afterValidate'=>'js:submiAjaxForm'
     )
)); ?>

And in the same page I've added this js code to submit the form via jquery form plugin:

function submitAjaxForm(form, data, hasError)
{
   if(!hasError)
   {
       $('#user-form').ajaxSubmit(
       {
           // ajax options here
       });
   }
}
待天淡蓝洁白时 2025-01-14 08:01:15

尝试在提交事件中停止传播:

$('#your-form').submit(function(e){
      e.stopPropagation();
      ... some other code ...
});

Try to stop propagation in your submit event:

$('#your-form').submit(function(e){
      e.stopPropagation();
      ... some other code ...
});
梦里人 2025-01-14 08:01:15

在客户端你可以

<?php echo CHtml::activeTextField($model, 'text', array(
                                                            'placeholder'=>$model->getAttributeLabel('text'),
                                                            'class'=>'form-control'
<script>                                                    )); ?>
function Validate(field){
            var _this = field;
            var errorDiv = _this.parent().find('.errors');
            var attr = [];
            _this.each(function(){
                var match = $(this).attr('name').match(/\[(.*?)\]/);
                attr.push(match[1]);
            })

            jQuery.ajax({
                type: 'POST',
                url: 'url/',
                data: 'ajax=keyup&'+_this.serialize()+'&attr='+attr,
                cache: false,
                processData: false,        
                success: function(data){
                    data=JSON.parse(data);
                    if(data.success){
                        _this.addClass('green');
                        errorDiv.html('');

                    }else{
                        _this.addClass('red');
                        errorDiv.html(data[attr][0]);
                    }
                }
            });
        }
        var delay = (function(){ 
            var Timer = 0;
            return function(callback, ms){
                clearTimeout (Timer);
                Timer = setTimeout(callback, ms);
            };
        })(); //if you want to delay

        $('#traveler_info input').keyup(function(){
            var _this = $(this);
            timeout = setTimeout(function(){
                Validate(_this,'Travelers')
            },1000)

        });

`
在站点控制器中

public function actionAjaxvalidation($type = null)
{   

    $model = new Travelers;

    if( isset($_POST['Travelers'], $_POST['attr']) ) 
    {
        /*
        * @params Model->value $attr 
        *
        */
        $attr = $_POST['attr'];

        $model->$attr = $_POST['Travelers'][$attr];

        if( $model->validate(array($attr)) )
        {   

            echo json_encode(['success'=>true]);

        }
        else
        {
            echo json_encode( $model->errors );
        }

        Yii::app()->end();
    }
}

On the client-side you can

<?php echo CHtml::activeTextField($model, 'text', array(
                                                            'placeholder'=>$model->getAttributeLabel('text'),
                                                            'class'=>'form-control'
<script>                                                    )); ?>
function Validate(field){
            var _this = field;
            var errorDiv = _this.parent().find('.errors');
            var attr = [];
            _this.each(function(){
                var match = $(this).attr('name').match(/\[(.*?)\]/);
                attr.push(match[1]);
            })

            jQuery.ajax({
                type: 'POST',
                url: 'url/',
                data: 'ajax=keyup&'+_this.serialize()+'&attr='+attr,
                cache: false,
                processData: false,        
                success: function(data){
                    data=JSON.parse(data);
                    if(data.success){
                        _this.addClass('green');
                        errorDiv.html('');

                    }else{
                        _this.addClass('red');
                        errorDiv.html(data[attr][0]);
                    }
                }
            });
        }
        var delay = (function(){ 
            var Timer = 0;
            return function(callback, ms){
                clearTimeout (Timer);
                Timer = setTimeout(callback, ms);
            };
        })(); //if you want to delay

        $('#traveler_info input').keyup(function(){
            var _this = $(this);
            timeout = setTimeout(function(){
                Validate(_this,'Travelers')
            },1000)

        });

`
In the SiteController

public function actionAjaxvalidation($type = null)
{   

    $model = new Travelers;

    if( isset($_POST['Travelers'], $_POST['attr']) ) 
    {
        /*
        * @params Model->value $attr 
        *
        */
        $attr = $_POST['attr'];

        $model->$attr = $_POST['Travelers'][$attr];

        if( $model->validate(array($attr)) )
        {   

            echo json_encode(['success'=>true]);

        }
        else
        {
            echo json_encode( $model->errors );
        }

        Yii::app()->end();
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文