Загрузка файлов (картинок) по ajax через форму для Opencart
Посмотрим как на примере добавления отзывов о магазине в Opencart. Добавим поле загрузки файлов. И сделаем так, чтобы файл картинки загружался в папку на сервере, а в базе данных прописывалось имя файла с путём к нему.
Вот наша форма такая
<h2 id="review-title"><?php echo $text_write; ?></h2> <div class="content"> <form name="uploader" enctype="multipart/form-data" method="post"> <b><?php echo $entry_name; ?></b><br /> <input type="text" name="name" value="" /> <br /> <br /> <b><?php echo $entry_otzyv; ?></b> <textarea name="text" cols="40" rows="8" style="width: 98%;"></textarea> <span style="font-size: 11px;"><?php echo $text_note; ?></span><br /><br /> <b><?php echo $entry_image; ?></b><br /> <input type="hidden" name="MAX_FILE_SIZE" value="300000" /> <input type="file" name="image" onchange="tstFile(this)" /><br /> <br /> <b><?php echo $entry_rating; ?></b> <span><?php echo $entry_bad; ?></span> <input type="radio" name="rating" value="1" /> <input type="radio" name="rating" value="2" /> <input type="radio" name="rating" value="3" /> <input type="radio" name="rating" value="4" /> <input type="radio" name="rating" value="5" /> <span><?php echo $entry_good; ?></span><br /> <br /> <b><?php echo $entry_captcha; ?></b><br /> <input type="text" name="captcha" value="" /> <br /> <img src="index.php?route=information/otzyv/captcha" alt="" id="captcha" /><br /> <br /><br /> <input type="submit" name="upload" value="Отправить" /> <!--<div class="left"><a id="button-review" class="button"><span><?//php echo $button_send; ?></span></a></div>--> </form> </div>
ниже в этом же файле представления скрипты пишем
<script type="text/javascript"><!-- ... function tstFile(val){ var v = val.value; var v = v.search(/^.*\.(?:jpg|jpeg)\s*$/ig) $('.success, .warning').remove(); if(v!=0){ $('#review-title').after('<div class="warning">"Неправильный формат файла"</div>'); } if(document.uploader.image.files[0].size > 300*1024) { $('#review-title').after('<div class="warning">"Очень большой файл картинки. Разрешенный размер не больше 300кб"</div>'); } } $("form[name='uploader']").submit(function(e) { var formData = new FormData($(this)[0]); //var imagesize = document.uploader.image.files[0].size; $.ajax({ url: "index.php?route=information/otzyv/write", type: "POST", dataType: 'json', // чтобы сообщение об успехе или ошибке показывалось после отправки формы data: formData, async: false, beforeSend: function() { $('.success, .warning').remove(); $("input[name='upload']").attr('disabled', true); $('#review-title').after('<div class="attention"><img src="catalog/view/theme/default/image/loading.gif" alt="" /> <?php echo $text_wait; ?></div>'); }, complete: function() { $("input[name='upload']").attr('disabled', false); $('.attention').remove(); }, success: function(data) { //alert(data) if (data.error) { $('#review-title').after('<div class="warning">' + data.error + '</div>'); } if (data.success) { $('#review-title').after('<div class="success">' + data.success + '</div>'); $('input[name=\'name\']').val(''); $('textarea[name=\'text\']').val(''); $('input[name=\'image\']').val(''); $('input[name=\'rating\']:checked').attr('checked', ''); $('input[name=\'captcha\']').val(''); $("form[name='uploader']").remove(); } }, cache: false, contentType: false, processData: false }); e.preventDefault(); }); //--></script>
Основная идея в том, что используем FormData для передачи всех данных формы.
Это мы сделали ajax часть. Теперь посмотрим, как обрабатываем данные на сервере. В контроллере вот что у нас. Когда мы отправили данные через FormData, то теперь доступна наша картинка из формы в глобальной переменной $_FILES.
$_FILES['image']. По идее в Opencart это то же, что и $this->files['image'], но у меня не работает, может что где не так пишу. Оставил в виде $_FILES
public function write() { $this->language->load('information/otzyv'); $this->load->model('catalog/otzyv'); $json = array(); if ((utf8_strlen($this->request->post['name']) < 3) || (utf8_strlen($this->request->post['name']) > 25)) { $json['error'] = $this->language->get('error_name'); } if ((utf8_strlen($this->request->post['text']) < 25) || (utf8_strlen($this->request->post['text']) > 1000)) { $json['error'] = $this->language->get('error_text'); } if (!isset($this->request->post['rating'])) { $json['error'] = $this->language->get('error_rating'); } if (!isset($this->session->data['captcha']) || ($this->session->data['captcha'] != $this->request->post['captcha'])) { $json['error'] = $this->language->get('error_captcha'); } //if(($_FILES['image']['size']) > 500) { // $json['error'] = $this->language->get('error_filesize'); // } if (($this->request->server['REQUEST_METHOD'] == 'POST') && !isset($json['error'])) { $extensions = array('jpeg', 'jpg', 'png', 'gif'); $max_size = 300000; $path = DIR_IMAGE."data/otzyv_images/"; $response = ''; if ($_FILES['image'] != '') { if ($_FILES['image']['size'] > $max_size) { $response = 'File is too large'; } else { $ext = strtolower(pathinfo($_FILES['image']['name'], PATHINFO_EXTENSION)); if (in_array($ext, $extensions)) { $newname = uniqid() . '.' . $ext; $path = $path . $newname; if (move_uploaded_file($_FILES['image']['tmp_name'], $path)) { $response = "<img style='height: 100px' src='$path' />"; $this->request->post['image'] = "data/otzyv_images/".$newname; // так как через post не передается файл по ajax, прописываем его сами из переменной $_FILES } } else { $response = 'File must be an image!'; } } } $this->model_catalog_otzyv->addOtzyv($this->request->post); $this->model_catalog_otzyv->sendNotification($this->request->post); $json['success'] = $this->language->get('text_success'); } $this->response->setOutput(json_encode($json)); }
addOtzyv - это функция в модели, она прописывает в базу данных.
public function addOtzyv($data) { $this->db->query("INSERT INTO " . DB_PREFIX . "otzyv SET author = '" . $this->db->escape($data['name']) . "', customer_id = '" . (int)$this->customer->getId() . "', text = '" . $this->db->escape(strip_tags($data['text'])) . "', rating = '" . (int)$data['rating'] . "', date_added = NOW()"); $review_id = $this->db->getLastId(); if (isset($data['image'])) { $this->db->query("UPDATE " . DB_PREFIX . "otzyv SET image = '" . $this->db->escape($data['image']) . "' WHERE review_id = '" . (int)$review_id . "'"); } }
Я просто принцип передал. Самая важная часть - как по javascript передавать данные из формы, если на ней есть поле для загрузки файла.
almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.
Вы можете почитать все статьи от almix'а.
- 0 Composer – пакетный менеджер PHP. Что и как? (22.07.2014)
- 0 Opencart: Скидки для пользователей, надо указывать в колонке "количество" значение, отличное от нуля! (02.07.2014)
- 0 Как оперативно создать интернет-магазин на основе шаблона OpenCart? (05.06.2014)
- 0 MySQL и PHP: Вычисление возраста (количество лет) по дате рождения (20.06.2017)
- 0 Yii: Bootstrap tabs, делаем активной вкладку на которую выполняется переход по ссылке (20.03.2014)
- 0 CodeIgniter: Всплывающая форма обратной связи на Ajax в Bootstrap Modal и проверкой Captcha (18.02.2014)
- 0 Opencart: Установка мета тега Keywords для главной страницы через админку (05.12.2013)
- 0 Как изменить часовой пояс на сервере (16.11.2013)
- 0 PHP: Как удалить файлы по маске? (07.11.2013)
- 0 Регулярные выражения в PHP (12.04.2014)
- 0 Opencart: война модулей FilterPro mega, Intelligent Product Labels, AStickers - Ajax стикеры (24.10.2013)
- 0 Opencart: Модуль Filter Product OpenCart_v1.5.x: Как скрывать недоступные опции в фильтре (23.10.2013)
- 0 Защита от спама в phpBB3 без капчи (09.10.2013)
- 0 Ошибка xml файла Opencart для Яндекс Маркета: <b>Notice</b>: iconv(): Detected an illegal character in input string... (04.09.2013)
- 0 Php функция implode внутри запроса SELECT к MySQL. (02.09.2013)
- 0 Opencart: Выводить изображения подкатегорий на странице категории. (11.07.2013)
- 0 Opencart: Вывод атрибутов вместо описания в категориях. (23.10.2013)
- 0 Opencart: Обновление движка с версии 1.4.9 до 1.5.1.3! (05.02.2015)
- 0 Opencart: Вставляем имя покупателя в модуле JV_QuickOrder - быстрый заказ товара (22.04.2013)
- 0 Как убрать папку www из денвера? (22.03.2013)
- 0 Устанавливаем и настраиваем WampServer (аналог MAMP в Mac и возможная замена Denwer'у) на Windows (22.03.2013)
- 0 Полезные возможности PhpStorm и настройка горячих клавиш (14.03.2013)
- 0 WordPress: Добавить ссылку "Сохранить фото" для галереи на NextGen с эффектом Lightbox (12.04.2013)
- 0 OpenCart: Fancybox (или colorbox)+"cloud-zoom" одновременно. Значок-ссылка поверх изображения товара на просмотр в полный вид (03.06.2013)
- 0 OpenCart: Делаем шаблон растягиваемым и добавляем отступы. (10.01.2014)