Вопрос По Cactiveform

Есть CActiveForm. Надо узнать, прошли ли данные валидацию, или нет. Валидация проходит на сервере и аяксом отдается клиенту.

Надо то, что пришло в ответе, вставить в див, если данные прошли валидацию.

Проблема в том, что если ставить ajaxSubmitButton, то при нажатии кнопки данные не будут валидироваться и любой ответ перезаписывает див .form-add-coupon, а если поставить submitButton, то невозможно понять, что данные сохранены, т.к. обработчик повесть нельзя.

Форма


                    <?php $form=$this->beginWidget('CActiveForm', array(

                            'action'=>Yii::app()->createUrl('save'),

                            'id'=>'kupon-form',

                            'enableAjaxValidation'=>true,

                            'clientOptions'=>array(

                                    'validateOnSubmit'=>true,

                                    'hideErrorMessage'=>true,

                                    'validationDelay'=>1000

                            ),

                            'htmlOptions'=>array('class'=>'edit-form',

                                                 'enctype'=>'multipart/form-data')

                    )); ?>

Копки


<?php echo CHtml::ajaxSubmitButton('Добавить', Yii::app()->createUrl('save'), array('update' => '.form-add-coupon'), array('class'=>'submit')); ?>


<?php echo CHtml::submitButton('Добавить', array('class'=>'submit')); ?>

Используйте




        'clientOptions'=>array(

            'validateOnSubmit'=>true,

            'afterValidate'=>'js:afterFormValidateFunction',     

        ),






    function afterFormValidateFunction(form, data, hasError){

        if (!hasError){

            $.post(form.attr('action'), form.serialize(), function(data){

                if (data)

                //do smth here

            });

        }

        // Always return false so that Yii will never do a traditional form submit

        return false;

    } 



Этот код срабатывает только если данные не прошли валидацию. Если все норм, и данные ушли, то 0 реакции.


                    <?php $form=$this->beginWidget('CActiveForm', array(

                            'action'=>Yii::app()->createUrl('save'),

                            'id'=>'kupon-form',

                            'enableAjaxValidation'=>true,

                            'clientOptions'=>array(

                                    'validateOnSubmit'=>true,

                                    'hideErrorMessage'=>true,

                                    'afterValidate'=>'js:afterFormValidateFunction', 

                            ),

                            'htmlOptions'=>array('class'=>'edit-form',

                                                 'enctype'=>'multipart/form-data')

                    )); ?>


function afterFormValidateFunction(form, data, hasError) {

    alert('afterValidate');

    console.log('data');

    

    if (!hasError) {

        $.post(form.attr('action'), form.serialize(), function(data) {

            if (data) {

                 console.log(data);

            }

        });

    }

    // Always return false so that Yii will never do a traditional form submit

    return false;

} 

Есть идея разделить методы для валидации и сохранения, но тогда надо хотя бы заставить эту функцию работать.

Какая должна быть реакция, если данные ушли?

Тут данные уходят на сервер


        $.post(form.attr('action'), form.serialize(), function(data) {

            if (data) {

                 console.log(data);

            }

а тут обрабатывайте результата запроса к серверу.





            if (data) {

                 console.log(data);



Верните success, если на сервер все получилось. Например, проверяйте, если if(data.success)…

Реакция это alert(‘afterValidate’) или console.log(‘data’), которые я поставил в начале функции, а так как их нет, то я даже не знаю что делать.

Ошибок нет тоже

Разобрался.

Ошибка была в том, что я валидировал и сохранял данные по одному и тому же урлу, в одном и том же методе.

Т.е. мой ответ, который я возвращал при успешном сохранении просто не распознавался юи-формой и считался всё равно заваленной валидацией.

Когда я стал возвращять при прохождении валидации пустую строку, код


'afterValidate'=>'js:afterFormValidateFunction

заработал.

В общем, решение разделить валидацию и сохранение на отдельные методы - верно.

В итоге сделал через стандартный метод performAjaxValidation(), и как я сразу не догадался…