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