Снова ajax валидация

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
louisvuitton
Сообщения: 203
Зарегистрирован: 2014.02.16, 03:09

Снова ajax валидация

Сообщение louisvuitton »

Не получается заставить работать ajax валидацию :evil:

Есть форма

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

$form = $this->beginWidget('CActiveForm', array(
        'id' => 'Orders-form',
        'enableClientValidation' => true,
        'enableAjaxValidation' => true,
        'clientOptions'=>array(
            'validateOnSubmit'=>true,
        ),
        'htmlOptions' => array('class' => 'form-order'),
    ));
отправляется такой кнопкой

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

echo CHtml::ajaxSubmitButton('Отправить', array('/orders/main/add'),
                array('type' => 'POST'),
                array('id'=>'btn-send-order')
            );
На вот такое действие

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

    public function actionAdd(){
        $model = new Orders();
        $this->performAjaxValidation($model);
        echo 'ololo';

    }
Данные посылаются ajax-ом, но performAjaxValidation не отрабатывает, приходит 'ololo'

В чем может быть проблема?
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Снова ajax валидация

Сообщение SiZE »

Может надо показать performAjaxValidation ?
louisvuitton
Сообщения: 203
Зарегистрирован: 2014.02.16, 03:09

Re: Снова ajax валидация

Сообщение louisvuitton »

Вот

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

    protected function performAjaxValidation($model){
        if(isset($_POST['ajax']) && $_POST['ajax'] === $this->modelName.'-form') {
            echo CActiveForm::validate($model);
            Yii::app()->end();
        }
    } 
$this->modelName здесь равно Orders

В массиве $_POST нет 'ajax', а только данные формы

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

array(1) {
  ["Orders"]=>
  array(5) {
    ["fio"]=>
    string(8) "olofddfa"
    ["email"]=>
    string(5) "fdasf"
    ....
  }
louisvuitton
Сообщения: 203
Зарегистрирован: 2014.02.16, 03:09

Re: Снова ajax валидация

Сообщение louisvuitton »

Если же из определения формы убрать

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

'clientOptions'=>array(
            'validateOnSubmit'=>true,
        ), 
То параметры вместе с ajax отправляются каждый раз при смене значения, но в ответ приходят не ошибки заполнения, а страница целиком!

При нажатии на кнопку отправки, в ответ приходит "ololo", независимо от того были в форме ошибки или нет.

А хотелось бы добиться такого поведения - валидация javascript-ом на клиенте, а при нажатии на кнопку отправлялся ajax запрос а в ответе на него ajax-ом либо только(!) ошибки с их автоматическим отображением в форме, либо "ололо" при прохождении валидации.
fluffy@prog.ru
Сообщения: 5
Зарегистрирован: 2015.02.02, 18:02

Re: Снова ajax валидация

Сообщение fluffy@prog.ru »

Похоже, у меня аналогичная проблема (http://www.yiiframework.ru/forum/viewto ... =3&t=22221). Точнее - причина общая. Вы создаете кнопку при помощи CHtml::ajaxSubmitButton. В этом случае используется функция JQuery.ajax() и действительно не передаются параметры $_GET['ajax'] / $_POST['ajax']. В этом случае еще и exception не показывается. Тоже самое происходит с CButtonColumn в CGridView. Пока детальнее не разобрался.

Попробуйте использовать обычную submit-кнопку - внутри CActiveForm с enableAjaxValidation = true она должна правильно работать.
Последний раз редактировалось fluffy@prog.ru 2015.02.11, 02:40, всего редактировалось 1 раз.
fluffy@prog.ru
Сообщения: 5
Зарегистрирован: 2015.02.02, 18:02

Re: Снова ajax валидация

Сообщение fluffy@prog.ru »

Можно в performAjaxValidation делать проверку не $_POST['ajax'], а Yii::app()->request->isAjaxRequest и Yii::app()->request->isPostRequest - значение этих функций верное во всех указанных выше ситуациях.
louisvuitton
Сообщения: 203
Зарегистрирован: 2014.02.16, 03:09

Re: Снова ajax валидация

Сообщение louisvuitton »

Это печально, но я нашел тут на форуме несколько тем ~ c таким же вопросом, оставшихся без решения =[

Автоматически работать валидацию заставить не удалось, и сделал в итоге вручную примерно как
здесь

Добавил в контроллер фильтр о том что это действие работает только по ajax

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

    public function filters() {
        return array(
            'ajaxOnly + add',
        );
    }

Само действие вкратце запилил так (без performAjaxValidation):

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

    public function actionAdd(){
        $model = new Orders();
        if(isset($_POST['Orders'])){
            $model->attributes = $_POST[$this->modelName];
            if($model->save()){
                            echo CJSON::encode(array(
                               'status'=>'success'
                            ));
                       }
                       else {
                            echo CJSON::encode($model->errors);
                       }
            }
            else {
                     throw new CHttpException(500,"Некорректные параметры запроса");
            }
    }
В кнопке вручную добавление ошибок к полям формы:

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

echo CHtml::ajaxSubmitButton('Отправить', array('/orders/add'),
                array(
                    'type' => 'POST',
                    'success'=>'function(data) {
                         data = $.parseJSON(data);
                        if(data.status=="success"){
                         $("#form-result").text("Ваша заявка принята. Спасибо.");
                         $("#Orders-form")[0].reset();
                        }
                         else{
                            $.each(data, function(key, val) {
                            $("#Orders-form #Orders_"+key+"_em_").text(val[0]);
                            $("#Orders-form #Orders_"+key+"_em_").show();
                        });
                        }
                    }',
                    'beforeSend'=>'function(){
                           $("#form-result").empty();
                      }',
                ),
                );
На мой не особо проф взгляд выглядит костыльно , но что поделать раз толкового объяснения не дождаться (
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Снова ajax валидация

Сообщение SiZE »

Что ты в итоге хочешь получить? Сохранение формы через AJAX без перезагрузки страницы?
Ответить