Проверка Yii на стороне клиента и интеграция плагина jQuery Form

Я использую платформу Yii в одном из своих проектов и хочу использовать плагин jQuery Form вместе со встроенной проверкой Yii на стороне клиента.

Я не могу заставить их работать вместе. Если я настрою jQuery form plugin с помощью этого простого кода js:

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

проверка на стороне клиента выполняется, но не останавливает отправку формы, даже если проверка не удалась. Я предполагаю, что это связано с тем, что и клиентская библиотека проверки Yii, и плагин формы jQuery связывают одно и то же событие «отправить» в форме.

К вашему сведению, я дважды проверил, что нет ошибок js с консолью FireBug и Chrome.

Интересно, кто-то сталкивался с такой же проблемой и решил ее каким-то образом.


person Fabrizio D'Ammassa    schedule 20.02.2012    source источник


Ответы (3)


Я решил так:

Код инициализации активной формы Yii:

<?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
       });
   }
}
person Fabrizio D'Ammassa    schedule 21.02.2012

Попробуйте остановить распространение в вашем событии отправки:

$('#your-form').submit(function(e){
      e.stopPropagation();
      ... some other code ...
});
person Oleg    schedule 21.02.2012
comment
К сожалению, я не могу сделать это без взлома основных файлов фреймворка Yii. И я не привязываю отправку формы напрямую, но это делает плагин формы jquery. Во всяком случае, я решил по-другому. - person Fabrizio D'Ammassa; 21.02.2012

На стороне клиента вы можете

<?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();
    }
}
person Nagibaba    schedule 25.01.2018