Валидация Ajax Формы

всем привет

озадачился использованием отправки формы аяксом - все шло ровно до тех пор пока не встала проблема валидации…

в нарытых в сети примерах везде виджет с CActiveFrom и конструкции типа $model->…, $form->…

а у меня модель формы CFromModel и вывод полей через CHtml с отправкой через CHtml::ajaxSubmitButton

вопрос: как в моем случае прикрутить валидацию формы?

вери вери нид ё хэлп!

js код генерируется методом CActiveForm.error(), поэтому без $form-> никак, а CFormModel или CActiveRecord - не важно.

то есть в моем случае фигачить =


$form = $this->beginWidget('CFormModel'...

и далее "по списку"?

Точнее:




$form = $this->beginWidget('CActiveForm', ...)



И далее по списку :)

сделал… но работает не все = не хочет "валидироваться" загружаемый файл…

все поля проходят, а загружаемый файл - всегда пустой…

и еще = как вывести красиво ошибки заполнения?

сейчас они выводятся или текстом или массивом =


$error = CActiveForm::validate($model);

if($error!='[]')

//echo $error;

print_r($model->getErrors());

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

а хоцца чтобы красиво подсвечивались незаполненные поля… :angry:

Посмотрите код, который генерирует yii при создании проекта, там всё красиво. А файлы через ajax не отправляются, но можно использовать FormData, ну и не забыть указать multipart/form-data для формы.

Если вы хотите подсветку и красивый вывод - передавайте ошибки в виде json. Красивый вид возвращает CActiveFrom::validate(), либо же можно привести самому.




//ajax validation 

            if(!$model->validate()){

                foreach($model->getErrors() as $attribute=>$error)

                    $errors[CHtml::activeId($model,$attribute)]=$error[0];

                echo CJSON::encode($errors);

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

            }



Затем во вьюшке отображаем ошибки(подставляйте свои классы)




if (data.status!="success"){

        $.gritter.removeAll();

        $.each(data, function(key, val) {

             $("#books-form #"+key+"_em_").text(val+" ");

             $("#books-form #"+key+"_em_").parent(".error_wrapter").addClass("error");

             $("#books-form #"+key+"_em_").css("display","block");

             });

        moveToError();

}      



Проблему с файлами и аякс загрузкой файлов я поднимал недавно, не нашел ничего другого как загрузка файлов отдельно в новом аяксе:




if (e.status=="success"){

                       //upload files

                       var fd = new FormData();

                       fd.append("Books[url_img]", $("#Books_url_img")[0].files[0]);

                       fd.append("Books[url_large_img]",$("#Books_url_large_img")[0].files[0]);

                       fd.append("Books[url_epub]", $("#Books_url_epub")[0].files[0]);

                       

                       fd.append("id",e.id);

                       fd.append("update","'.$model->isNewRecord.'");

                       $.ajax({

                        url: "/books/save",

                        type: "POST",

                        cache: false,

                        data: fd,

                        beforeSend: function() {

                            $("body").animate({ scrollTop: 0}, 1100);

                            notification(e.message);

                        },

                        dataType: "json",

                        processData: false,

                        contentType: false,

                        success: function (data)



Если интересно могу выложить куда нибудь форму/контроллер.

А вообще с файлами аякс лучше не использовать, а делать обычный сабмит, так как пользователю нужно будет оповещение о том что что - то сохраняется, желательно блокировать кнопку сабмита(чтобы несколько раз не отправили). У меня страница например скролится вверх и выводится сообщение о том что идет загрузка файлов. Вообщем очень много проблем пришлось решить по пути к готовой форме.

уже осознал!

что касается = чтобы несколько раз не отправили = может быть? =


$this->refresh()

Вы не можете делать $this->refresh() в данном случае, получите ошибку.

Если делаете аяксом валидацию и отправку формы - делайте так:

  1. В контроллере определяете нужно ли редиректить и добавляете в отправляемый json

‘redirect’=>$this->createUrl("")

  1. В вью определяете нужно ли редиректить? Делаете window.location.replace(data.redirect),

если не надо - делаете window.location.reload()

В чем проблема - при аякс загрузке файлов и формы вы это будете делать в success, соответственно у вас до вызова success ничего не будет происходить. Возьмем например 3-4 файла, они будут грузится если все хорошо секунды 3-4, в это время можно повторно отправить форму. Тоесть нам нужно либо в beforeSend делать кнопку неактивной, либо блокировать интерфейс (blockUI например).

зачетно = +1…

но я с аяксом пока похерил дело - сделаю обычный сабмит с рефрешем против двойной отправки

У меня на текущем проекте все формы на аяксе. ПМ говорит что я извращенец и это сложно, да может и не совсем правильно, но зато можно сделать мега крутые эффекты после отправки формы. Например у меня идут скролл к 1 ошибке, после изменения поля к следущей и так далее) Да и много еще красивостей, все зависит от задачи, иногда это лишнее.

ну, дай бог!

а я только изучаю "юй" - поэтому в моей админке = все будет просто

Я начал писать на yii 9 месяцев назад. До этого пробовал яву под андроид, и верстал немного))

а чего ява не пошла?

сейчас же круто писать на ней…

да и бабла больше в ЗП

p.s. php-программисты явашниками и за программистов не считаются :lol:

У фирмы не пошло с проектами на андроиде, пришлось искать работу, а так как городок маленький, это довольно сложно. Ну и предложили попробовать php. ЗП осталась та же (даже немного больше), а насчет того что пхпшники не программисты - это их мнение. Все зависит от задач и стиля.