CActiveForm и AJAX

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Аватара пользователя
BuCeFaL
Сообщения: 447
Зарегистрирован: 2010.03.17, 21:22
Откуда: Kiev
Контактная информация:

Re: CActiveForm и AJAX

Сообщение BuCeFaL »

validateOnSubmit не реагирует на ajaxSubmitButton. Хотя реагирует на submitButton. Ajax submit в Yii есть и он работает, вот только провести валидацию перед отправкой.
Аватара пользователя
BuCeFaL
Сообщения: 447
Зарегистрирован: 2010.03.17, 21:22
Откуда: Kiev
Контактная информация:

Re: CActiveForm и AJAX

Сообщение BuCeFaL »

Имея результат валидации (в json), как применить его к форме с помощю js ? Реализация в jquery.yiiactiveform.js
/**
* yiiactiveform set function.
* @param map settings for the active form plugin. Please see {@link CActiveForm::options} for availablel options.
*/
earx
Сообщения: 3
Зарегистрирован: 2011.03.08, 01:22

Re: CActiveForm и AJAX

Сообщение earx »

Код: Выделить всё


<?php
  $form=$this->beginWidget(
            'CActiveForm',
            array(
                'id'                      => 'add_category_form'
                , 'action'                => Yii::app()->createUrl("admin/AddCategory" )
                , 'enableAjaxValidation'  => true
                , 'clientOptions'         => array(
                                                'validateOnSubmit'=>true
                                                , 'validationUrl' => Yii::app()->createUrl("admin/FormValidation" )
                                                , 'ajaxVar' => 'ajax'
                                                , 'afterValidate' => "js: function(form, data, hasError) {
                                                    
                                                    //if no error in validation, send form data with Ajax
                                                    if (! hasError) {
                                                      $.ajax({
                                                        type: 'POST',
                                                        url: form[0].action,
                                                        data: $(form).serialize(),
                                                        success: function(ret) {
                                                          //alert(data)
                                                        }
                                                      });
                                                    }
                                                    
                                                    return false;
                                                }
                                                "
                                                )                
            )
        );
  ?>
  

<div class="name" id='name_wrapper'>
    <?php echo $form->labelEx($model,'name'); ?>
    <?php echo $form->textField($model,'name' ); ?>
    <?php echo $form->error($model,'name'); ?>

</div>

  <?php
      echo CHtml::submitButton(Yii::t('user', 'Submit')  );
  ?>

работает и валидация, и ajax сабмит формы.
Аватара пользователя
alexk984
Сообщения: 433
Зарегистрирован: 2010.10.21, 15:03
Контактная информация:

Re: CActiveForm и AJAX

Сообщение alexk984 »

Так у меня работает через аякс

Код: Выделить всё

$form=$this->beginWidget('CActiveForm', array(
    'id'=>'review-form',
    'enableAjaxValidation'=>true,
    'action'=>Yii::app()->createUrl('review/create'),
)); 

Код: Выделить всё

echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save',array(
            'ajax'=>array(
                'type'=>'POST',
                'url'=>Yii::app()->createUrl('review/create'),
                'success'=>'function(data) {$("#test").html(data)}',
            )
        )); 
Аватара пользователя
SowenoK
Сообщения: 43
Зарегистрирован: 2011.03.17, 18:09
Откуда: Россия, Краснодар
Контактная информация:

Re: CActiveForm и AJAX

Сообщение SowenoK »

Подскажите, форма валидируется аяксом при нажатии на инпут, форма отсылает аякс, но если есть ошибки валидации при нажатии на кнопку, то аяксом возвращаются ошибки в jsone и в поля для ошибок не выводятся, как это исправить?
Самурай без меча - это тоже, что самурай с мечом, но только без меча.
gladman
Сообщения: 26
Зарегистрирован: 2010.11.07, 13:31

Re: CActiveForm и AJAX

Сообщение gladman »

Вложу и свои труды, может кому поможет.

Сначала скажу, что мой Action может вернуть 3 разных ответа на ajax запрос.
1) Делаем определённые действия (например, я создаю объект и отсылаю пользователю письмо в случае успеха), у нас всё получается - возвращаем ответ: echo '200';
2) Делаем определённые действия, у нас происходит сбой/ошибка (например, объект не создался по каким-то причинам) - возвращаем ответ: echo '400';
3) Мы приняли ajax-запрос, проверили на корректность поля и поняли, что не все соответствуют наших правилам модели, поэтому мы вообще никаких действий не выполняем, а сразу возвращаем нашему скрипту ответ JSON с ошибками: echo CActiveForm::validate($modelForm);

Код представления:

Код: Выделить всё

        <?php        
            $form = $this->beginWidget('CActiveForm', array(
            'id' => 'ID ВАШЕЙ ФОРМЫ',
            'enableClientValidation' => true,
                ));
        ?>

        <!-- здесь ваш html-код формы -->

        <?php echo CHtml::ajaxSubmitButton('Send my coupon', '', array(
                'type' => 'POST',
                'success' => 'js: function(data) {
                        if (data=="200") {
                            // ваши действия при успехе
                        }
                        else if (data=="400") {
                            // ваши действия при провале
                        }
                        else {
                            // а это случай, когда в качестве ответа от экшена проходят данные по валидации
                            // мы парсим запрос и раскидываем сообщения об ошибках по соответствующим блокам
                            // разумеется, если вы как-то изменяете стандартную форму (созданную тем же gii), 
                            // то возможно у вас будут другие id-шники, не забудьте их поменять ( key+"_em_" меняем на ваши)
                            var response= jQuery.parseJSON (data);
                            $.each(response, function(key, value) { 
                              $("#"+key+"_em_").show();
                              $("#"+key+"_em_").html(\'\'+value);                            
                            });
                        }
                    }',
            ),
            array(
                'type' => 'submit',
        ); ?>

        <?php $this->endWidget(); ?>
Кстати, возможно, вы заметили вот такую странность ".html(\'\'+value);". Зачем же здесь к пустому месту прибавлять value. Если честно, то я и сам не знаю, но у меня работает только так. Если передавать просто value, то ничего не произойдёт (ошибки не добавятся в нужные нам места). Если кто-нибудь мне сможет пояснить с чем это связано, буду благодарен!
esche
Сообщения: 1054
Зарегистрирован: 2010.11.24, 03:39

Re: CActiveForm и AJAX

Сообщение esche »

Пустая срока перед плюсом определяет тип результата?
...
gladman
Сообщения: 26
Зарегистрирован: 2010.11.07, 13:31

Re: CActiveForm и AJAX

Сообщение gladman »

Всё. Разобрался благодаря js-дебагеру из-за чего без \'\' не работает. Там value не строка, а массив из одного элемента оказывается.

Меняем это

Код: Выделить всё

$("#"+key+"_em_").html(\'\'+value);
на это

Код: Выделить всё

$("#"+key+"_em_").html(value[0]);  
profit!
Аватара пользователя
hyzhak
Сообщения: 23
Зарегистрирован: 2009.12.10, 22:10
Откуда: Kyiv

Re: CActiveForm и AJAX

Сообщение hyzhak »

в ClientOptions определить js функцию, которая будет віполняться после ajaxvalidation и в ней сабмитить форму через ajax

вот кусок из доки по єтому поводу:
afterValidate: function, the function that will be invoked after performing ajax-based validation triggered by form submission action (available only when validateOnSubmit is set true). The expected function signature should be afterValidate(form, data, hasError) {...}, where 'form' is the jquery representation of the form object; 'data' is the JSON response from the server-side validation; 'hasError' is a boolean value indicating whether there is any validation error. If the return value of this function is NOT true, the normal form submission will be cancelled.
exru
Сообщения: 1
Зарегистрирован: 2013.10.16, 10:15

Мож это поможет

Сообщение exru »

$form = $this->beginWidget('CActiveForm', array(
'id' => isset($id)?$id:null,
'method'=>isset($method)?$method:'POST',
'action' => isset($action)?$action:null,
'enableAjaxValidation' => true,
'clientOptions' => array(
'beforeValidate'=>'js:function(){
alert("");
}',
'validateOnSubmit' =>true,
'validateOnChange' => true,
),
yiiframworker
Сообщения: 12
Зарегистрирован: 2013.10.19, 10:47

Re: CActiveForm и AJAX

Сообщение yiiframworker »

Вот примеры валидации и вывода ошибок AJAX-формы с использованием ajaxSubmitButton и без. :idea:
AlexGas
Сообщения: 24
Зарегистрирован: 2013.05.13, 22:55

Re: CActiveForm и AJAX

Сообщение AlexGas »

Если используем обыкновенный сабмит а не аякс
то чтоб происходила Аякс валидация - нужно чтоб присутствовала строчка
<?php echo $form->error($model,'name'); ?>
без нее аякс валидация ТОЛЬКО по аякссабмиту возможна
Ответить