Показать сообщение отдельно
  #1 (permalink)  
Старый 17.01.2017, 20:49
Профессор
Отправить личное сообщение для smart-create Посмотреть профиль Найти все сообщения от smart-create
 
Регистрация: 25.10.2016
Сообщений: 157

Вывод ошибок сервера через AJAX
Добрый день! Проблема следующая - осуществляю загрузку изображений на сайте пользователем. Само собой для загружаемого элемента существуют некоторые ограничения - расширение файла, вес, размер. Хочу сделать что бы посетитель видел отчет по каждой из причин если они возникли, то есть "Недопустимый тип"файла, "Превышен максимальный размер" и т.д.

Форма выглядит таким образом:
<form id="feeds" method="post" action="<?php echo base_url(); ?>feeds/add_feeds" enctype="multipart/form-data">
	<input type="text" placeholder="Заголовок статьи" name="title" />
	<input type="text" placeholder="Ключ статьи" name="key_n" />
	<textarea placeholder="Текс статьи" name="txt" rows="10"></textarea>
	<input type="file" name="userfile" />
	<button type="submit" class="button--8">ОПУБЛИКОВАТЬ</button>
</form>


Сервер:
function add_feeds() {
	$config['upload_path'] = './library/img/news/';
	$config['allowed_types'] = 'gif|jpg|png|jpeg';
	$config['max_size']	= '100';
	$config['max_width']  = '1024';
	$config['max_height']  = '768';
	$config['encrypt_name']	= TRUE;
	$config['remove_spaces'] = TRUE;
	$this->load->library('upload', $config);
	
	if ( ! $this->upload->do_upload()){
		$error = array('error' => $this->upload->display_errors());
		$this->load->view('pages/feeds/index', $error);
	}else{
		$image_data = $this->upload->data();
			
		$feeds['title']  = $_POST['title'];
		$feeds['txt'] = $_POST['txt'];
		$feeds['key_n'] = $_POST['key_n'];
		$feeds['img'] = $image_data['file_name'];
		$this->main_model->new_feeds($feeds);
                echo json_encode($feeds);
	}
}


Сервер написан на php-фреймворке Codignaiter, обработка и отображение ошибок происходит вот в этой части кода:
if ( ! $this->upload->do_upload()){
	$error = array('error' => $this->upload->display_errors());
	$this->load->view('pages/feeds/index', $error);
}


Для того что бы ошибка отображалась на страницу добавляю вот это:
<?php if (isset($error)) {?>
	<?php echo $error;?>
<?php }?>


И если на форму не вешать аякс, что бы отправка на сервер происходила обновлением страницы, то вывод ошибок будет работать, а вот если повесить аякс, то нет...
Конечно, в скрипте можно вывести какой-то allert с ошибкой типа "Что-то пошло не так", но это не совсем то что я хочу, обработчтк выглядит так:
$("form#feeds").submit(function(e){
	e.preventDefault();
	var f = this,
		form = new FormData(this),
        s = $(f.elements).last(),
        e = s.end().slice(0, -2).removeClass('input-error').filter(function() {
            return !$.trim(this.value)
        });
    if(e.length) e.addClass('input-error');
	else {
		s.prop('disabled', 1);
        s.end().not(s);
		$.ajax({
			url: f.action,
			type: 'POST',
			data: form,
			contentType: false,
			processData: false,
			cache: false,
			dataType: 'json',
			success: function(data) {
				f.reset();
				s.prop('disabled', 0);
				e.removeClass('input-error');
				$("#content").load("feeds #content");
			},
			error: function() {
				// здесь вывести ошибку
			}
		});
	}
});


Я догадываюсь что мне каким-то образом нужно вывести вот это:
<?php if (isset($error)) {?>
	<?php echo $error;?>
<?php }?>

здесь:
error: function() {
        // здесь вывести ошибку
}


Но, как это сделать я не понимаю, и не могу найти адекватного ответа в интернете, прошу помочь, словом или делом))
Ответить с цитированием