OpenCart — добавляем возможность скачивания файлов без покупки товара
Итак, заголовок поста практически говорит сам за себя — сегодня мы поговорим о том, как позволить посетителям нашего магазина скачивать файлы до совершения покупок, оформления заказа и оплаты.
OpenCart, как довольно приличный магазинный движок, позволяет загружать различные файлы и продавать их как информационный товар. То есть покупатель покупает этот самый файл и в своем личном кабинете может его скачать после оплаты. Но порой необходимо реализовать нечто иное. Например, магазин имеет своей направленностью не информационные товары, а вполне себе физические, имеющие потребность в инструкции, аннотации и т.д. Как же позволить покупателю, прежде чем он совершит покупку, скачать инструкцию? Что уж говорить о прайсах, pdf документах и прочей информационной документации…
Вот и у меня, благодаря заказчику, появилась надобность в реализации подобного функционала. И, к счастью, велосипед изобретать не пришлось — случайно увидела способ добавления загрузки и скачивания файлов из карточки товара на сайте FineSites. Огромная благодарность автору Serg за подробную и толковую инструкцию.
Что ж, если и Вам интересен этот вопрос, присоединяйтесь, открывайте свои редакторы и принимайтесь вносить изменения, которые принесут желаемый результат.
Все изменения протестированы на стандартном шаблоне, версия OpenCart 1.5.3.1.
1. Открываем файл catalog/model/catalog/product.php и ищем строку (приблизительно 497 строка):
1 |
public function getTotalProductSpecials() { |
И перед ней размещаем код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public function getDownloads($product_id) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_to_download pd LEFT JOIN " . DB_PREFIX . "download d ON(pd.download_id=d.download_id) LEFT JOIN " . DB_PREFIX . "download_description dd ON(pd.download_id=dd.download_id) WHERE product_id = '" . (int)$product_id . "' AND dd.language_id = '" . (int)$this->config->get('config_language_id')."'"); return $query->rows; } public function getDownload($product_id, $download_id) { $download=""; if($download_id!=0)$download=" AND d.download_id=".(int)$download_id; $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_to_download pd LEFT JOIN " . DB_PREFIX . "download d ON(pd.download_id=d.download_id) LEFT JOIN " . DB_PREFIX . "download_description dd ON(pd.download_id=dd.download_id) WHERE product_id = '" . (int)$product_id . "' ".$download." AND dd.language_id = '" . (int)$this->config->get('config_language_id')."'"); return $query->row; } |
2. Теперь обращаемся к контроллеру и открываем файл catalog/controller/product/product.php. Ищем приблизительно 363 строку:
1 |
$this->model_catalog_product->updateViewed($this->request->get['product_id']); |
и опять таки, перед ней размещаем код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
///////////////////////////////////// $this->data['downloads'] = array(); $results = $this->model_catalog_product->getDownloads($this->request->get['product_id']); foreach ($results as $result) { if (file_exists(DIR_DOWNLOAD . $result['filename'])) { $size = filesize(DIR_DOWNLOAD . $result['filename']); $i = 0; $suffix = array( 'B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB' ); while (($size / 1024) > 1) { $size = $size / 1024; $i++; } $this->data['downloads'][] = array( 'date_added' => date($this->language->get('date_format_short'), strtotime($result['date_added'])), 'name' => $result['name'], 'size' => round(substr($size, 0, strpos($size, '.') + 4), 2) . $suffix[$i], 'href' => $this->url->link('product/product/download', 'product_id='. $this->request->get['product_id']. '&download_id=' . $result['download_id']) ); } } /////////////////////////////////////// |
В этом же файле, немного ниже (573 строка, с учетом внесенных изменений) находим строку:
1 |
public function upload() { |
перед ней добавляем:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
public function download() { $this->load->model('catalog/product'); if (isset($this->request->get['download_id'])) { $download_id = $this->request->get['download_id']; } else { $download_id = 0; } if (isset($this->request->get['product_id'])) { $product_id = $this->request->get['product_id']; } else { $product_id = 0; } $download_info = $this->model_catalog_product->getDownload($product_id, $download_id); if ($download_info) { $file = DIR_DOWNLOAD . $download_info['filename']; $mask = basename($download_info['mask']); if (!headers_sent()) { if (file_exists($file)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="' . ($mask ? $mask : basename($file)) . '"'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); readfile($file, 'rb'); //$this->model_account_download->updateRemaining($this->request->get['download_id']); exit; } else { exit('Error: Could not find file ' . $file . '!'); } } else { exit('Error: Headers already sent out!'); } } else { $this->redirect(HTTP_SERVER . 'index.php?route=account/download'); } } |
3. Теперь, непосредственно в теме, открываем файл catalog/view/theme/default/template/product/product.tpl и ищем строку с описанием товара (230 строка):
1 |
<div id="tabs" class="htabs"><a href="#tab-description"><?php echo $tab_description; ?></a> |
и перед этой строкой добавляем код:
1 2 3 4 5 6 7 8 9 10 11 |
<div class="product-info"> <?php if($downloads){ ?> <br> <?php foreach($downloads as $download){ ?> <a href="<?php echo $download['href']; ?>" title=""><?php echo $download['name']; ?><?php echo " (". $download['size'] .")";?></a><br> <?php } ?> <?php } ?> </div> |
Я лишь изменила класс для выводимых ссылок, так как вышеупомянутый в коде класс уже существует и в моем случае он портил верстку.
4. Для того же, чтобы покупатели могли совершать покупку того товара, к которому привязаны файлы, без регистрации, необходимо внести небольшие изменения в файл catalog/controller/checkout/login.php.
Находим 21 строку
1 |
$this->data['guest_checkout'] = ($this->config->get('config_guest_checkout') && !$this->config->get('config_customer_price') && !$this->cart->hasDownload()); |
и меняем ее на
1 |
$this->data['guest_checkout'] = ($this->config->get('config_guest_checkout') && !$this->config->get('config_customer_price') ); |
Теперь в файле catalog/controller/checkout/guest.php находим 180 строку:
1 |
if (!$this->config->get('config_guest_checkout') || $this->config->get('config_customer_price') || $this->cart->hasDownload()) { |
и меняем ее на
1 |
if (!$this->config->get('config_guest_checkout') ) { |
5. Внесем небольшое изменение для SeoPro. Если в Вашем магазине настроены ЧПУ, то данное действие обязательно, так как без него ссылка отобразится, но не будет доступна для скачивания — просто будет неактивна.
Открываем файл catalog/controller/common/seo_pro.php и после строк (132-135):
1 2 3 4 |
case 'product_id': case 'manufacturer_id': case 'category_id': case 'information_id': |
размещаем строку:
1 |
case ‘download_id’: |
Таким образом мы добавили в магазин возможность скачивания файлов без регистрации, без покупки товара и т.д. Теперь разместить ссылку на скачивание будь то прайса, каталога или еще какой документации, не составит труда.
Вид, добавленных ссылок товару, будет приблизительно таким:
Поработав же над стилями, им можно придать любой желаемый вид.
Если же у Вас проблема с загрузкой файлов в магазин (ну, ни в какую не хотят загружаться файлы!), то Вам сюда.
Приветствую! Сделал всё как тут описано и при попытке оформления заказа в гостевом режиме выдаёт ошибку:
Parse error: syntax error, unexpected T_PUBLIC in /public_html/catalog/controller/checkout/guest.php on line 364
Как исправить не подскажете? Спасибо!
Версия OpenCat 1.5.3.1?
Действия четвертого пункта выполнили? Именно он отвечает за гостевое формление заказа, учитывая добавленную возможность.
Спасибо большое) Долго искал как так сделать, в общем очень Вам благодарен.
И Вам спасибо за отзыв!
Супер! Как всегда РАБОТАЕТ!
Спасибо за такой нужны пост!!!
А где именно копать, чтоб подправить стили вывода ссылки?
понимаю что в stylesheet.css но где именно — не пойму…
Заранее спасибо!
Здравствуйте, Андрей. Разобрались с вопросом? Если нет, то можете дать ссылку на реализацию данной функции, постараюсь помочь. У меня же на данный момент нет этой функции в действии, не на чем проверить код.
Все сделал как написано, все отлично работает! настолько отлично, что добавленные файлы попали в индекс яндекса, но!
Файл из поиска доступен по 2 быстрым ссылкам: посмотреть и загрузить, кликаем и вместо посмотреть и загрузить файл, получаем скачивание файла: -index.php.
Подскажите пожалуйста, что можно сделать, чтобы все работало правильно, а в идеале, чтобы загруженный файл просто открывался в новом окне для просмотра.
Заранее спасибо!
Александр, Ваш коммент ко мне не дошел — возможно, Вы отправили какой-то код и движок его просто не передал. В любом случае, если еще интересует какой-то вопрос или имеется замечание, пишите заново, но учитывайте, что код в чистом виде не пересылается (заменяйте скобки звездочками, например).
Здравствуйте, что нужно сделать, чтобы не было ограничения по загрузке файла? напрмер я хочу залить архив около 100 мб, но не получается
Привет!
Не первый раз на твоих страницах нахожу годные решения, обычно все без проблем, а с файлами малость проблема возникла.
исходные данные:
ocStore 1.5.5.1.1
deadcow SEO 2.4
Включен просто SEO, не SEO Pro,
изменения в модель и контроллер внес, на странице товара все появилось, но не скачивается. При клике по ссылке, страница просто перегружается и все. Ошибок в логах системы не нашел.
Ссылка на страницу товара.
https://shop.egida-ross.com/ppk-rif-op8
Вероятно проблема в неправильном формировании адреса ссылки, но вот куда копать — не могу понять, со скачиванием файлов первый раз сталкиваюсь.
wbr
/Grizly
Только начала писать Вам ответ, да решила пройти еще раз по ссылке, а у Вас уже все работает. Отлично! Не расскажите как решили проблему?
Проблему решил переходом на SEO PRO.
Очевидно для работы со стандартным SEO, необходимо править формирование url в нем, но там возник конфликт с beop_all_clean_urls модом, в итоге все решилось на SEO PRO.
Изначально SEO PRO бал отключен в виду не совсем корректной работы.
Очевидно это было связано с кэшем, в процессе прикручивания поискового модуля кэш несколько раз чистил, ошибка ушла :)
wbr
/Grizly
Спасибо, что поделились решением. У меня, кстати, некогда была практически точь-в-точь такая же ситуация — не работала ссылка на скачивание файлов ил-за отсутствия seo pro. Удачной Вам торговли))
Добрый день.
У меня такая же проблема, как у Алексея и появилась она именно с переходом на Seo Pro.
Ссылка на скачивание размещена тут https://mercury-mag.com/filtry/masljanye-filtry/filtry-dlja-4-taktnyh-motorov/filtr-masljanyj-f8-f30.html, но файл не скачивается…
Как думаете, в чем проблема?
Заранее спасибо!
Здравствуйте, Сергей. Заметьте, у Алексея проблема как раз разрешилась при переходе на seo pro, а вот когда стоял стандартный seo, то были проблемы со скачиванием файла. У Вас seo pro? Почистите кеш (часто именно в нем загвоздка). Кстати, какая версия движка?
Спасибо за быстрый ответ!
Да, у меня точно SeoPro :)
А какой файл в кэше отвечает за функцию скачивания файлов? Или можно вообще все файлы удалить из папки cache (кроме index.html)?
Версия 1.5.5.1.1
Да, смело чистите всю папку system/cache, только не трогайте index.html. Иногда не мешает и кеш браузера очистить. К сожалению, на 1.5.5.1.1 еще не приходилось доделывать данный функционал, но благодаря Алексею знаем, что и для этой версии метод подходит.
Проблема решена (забыл сделать пункт 5).
Искренне прошу прощения у разработчика за глупый вопрос и отнятое время!
Ваши доработки очень помогают. Творите еще!
Ничего, никто не застрахован от подобного) — главное, что во всем разобрались. Удачи с магазином! И заходите еще!)
А как же вывести ссылки на файле в разделе категорий?
Автор данного решения показал что вывод берется из
<a href="» title=»»>
т.е. вставив этот код в нужном месте вы получите там прайс или файл.
Алексей, Ваш код не отобразился — необходимо код так сказать «экранировать».
как мне экранировать код что бы вывести тут ?
Здравствуйте, я все сделал, но не пойму как в опенкарте реализованная функция добавления товаров, как для каждого товара добавлять свои файлы?
Чтобы добавить файл товару, необходимо зайти в админку, в карточку товара, перейти по вкладке «Связи» и ниже, под добавлением категорий, есть поле «Загрузки», в нем выбирайте нужный файл. Предварительно, естественно, необходимо загрузить нужные файлы в магазин через Каталог/Загрузки.
Подскажите где мне искать проблему, если я не вижу на странице товара — ссылку на файл.
ocStore Version 1.5.3.1
Файл SEOPro в нужном месте был (catalog/controller/common/seo_pro.php), но не уверен, что модуль этот у меня установлен. В списке модулей его нет.
Не совсем понятно, с чем у Вас возникла проблема: не появляется ссылка для скачивания (пост то об этом) или сама страница с товаром не отображается?
не появляется ссылка, страница отображается спокойно
https://arhimed.net/index.php?route=product/product&path=567_612_610_616&product_id=688
https://arhimed.net/index.php?route=product/product&path=567_612&product_id=672
вот 2 странички, где использовал загрузку файлов. Но как клиент я их не вижу
Банальный вопрос, но Вы в Связях присоединили файл?
Весь метод добавления файла для скачивания, рассмотренный в статье, тестировался именно на ocstore 1.5.3.1.
Да присоединил файл, я понимаю, что ошибка у меня, вопрос у меня один в каком из шагов искать ошибку? может что то не так в моем шаблоне, может без SEO PRO это не работает (если так, то как понять, есть у меня SEO PRO или нет?)
Даже если бы у Вас была проблема с seo pro, то ссылка все равно бы отобразилась, может быть не скачивалась, но появилась бы. Кстати, глядя на Ваши ссылки, видно, что seo Вы не настраивали, так что 5 шаг Вам делать не нужно. А, вообще, не мешало бы настроить ЧПУ.
Вы третий шаг сделали верно — добавили код в свой шаблон?
3 шаг я сделал, проверю еще раз, могу я прислать Вам файл для проверки?
Ответила на почту.
Спасибо большое, все получилось все пошло, помогла найти ошибку статья из вашего соседнего поста. Можете подсказать https://arhimed.net/index.php?route=product/product&path=570_633&product_id=771 как сократить расстояние между картинкой и описанием, а то что то описание ушло вниз. Стало не читабельно.
Как я и говорила, Вам надо сменить класс для этого блока, назовите его не «product-info», а «product-file», к примеру. Блоку product-info задана высота (min-height: 320px), соответственно он такой высокий. В общем, поправьте стили и все станет на свои места.
Здравствуйте.Спасибо за ценные советы — многие использую, но с этим что-то пошло не так. Сделал, все как у вас написано — вот что выдало в шапке сайта Notice: Use of undefined constant ‘download_id’ — assumed ‘‘download_id’’ in /home/u151704/stelrad-spbru/www/catalog/controller/common/seo_pro.php on line 136. Убрал 136 строку «case ‘download_id’:» -все опять стало хорошо, появилась ссылка в карточке товара, но при клике просто обновляется страница. Не знаете, где копать?
Все, проблема решилась заменой ваших вариантов верхних запятых » ‘ «, на стандартные. Задам тогда уж еще вопрос, можно ли сделать не закачку файла по умолчанию, а открытие в новой вкладке? Буду признателен за ответ.
Здравствуйте. Похоже у меня такая же проблема как у Никиты, все добавил, и в нужную тему, пробный файл залил в загрузку и поставил галку на нем в товаре, но ссылка не появляется в товаре. Подскажите что можно сделать?
Изменяем пункт 3. Вставляем загрузки в табы
catalog/view/theme/default/template/product/product.tpl и ищем строку с описанием товара (230 строка):
После нее вставляем (вкладка будет отображаться после описания товара )
Ваш текст
опускаемся ниже и ищем строку и вставляем
<a href="» title=»»>
Все описанное работает на версии 1.5.5.1
Здравствуйте! А как сделать возможным добавления файла для скачивания в статью?
В редакторе можно прикрутить ссылку на скачивание файла.
Юля, добрый день! У меня чуть другая проблема, чем описана в этой статье, но где-то с ней пересекается. В описании товара использую табличку для расположения инфы. Мне надоело постоянно заниматься копипастом. Нельзя ли этот куда-нибудь в шаблон запихнуть, чтоб она при создании нового тоара по умолчанию там была?
СкрЫн проблемы: https://i64.fastpic.com/big/2014/0703/69/37d207aa52b0990cfcfde06b4a99b969.png
Код самой таблицы:
ИНФОРМАЦИЯ О ТОВАРЕ
О БРЕНДЕ
ОБЩИЕ ХАРАКТЕРИСТИКИ
Возраст: от лет
Артикул: 0000
Бренд: бренд
Страна-производитель: Китай
Размеры: 00 х 00 х 00 см.
Вес: 0 кг.
Можно просто в admin/view/template/catalog/product_form.tpl, на строках 53-56 дефолтного шаблона, найти следующий код
Вместо EXAMPLE — EXAMPLE разместите то, что Вам необходимо.
Вау, работает! А я то мучился, постоянно код копировал. Юля, спасибо Вам большое!
Не за что)
День добрый.
Замечательное решение! Но как быть, если хочется не только непосредственно в карточке товара ссылку давать, но и на странице категории?
Рядом с кратким описанием товара еще и ссылку на полное описание.
Все работает!!! Подскажите как сделать, чтобы без регистрации ссылка на файл была неактивна!?
Подскажите пожалуйста как убрать ошибку, уже всё пересмотрела нигде не нашла решение
Notice: Undefined index: ean in /home/mikolina/domains/parfum-kosmetik.in.ua/public_html/catalog/model/catalog/product.php on line 29Notice: Undefined index: jan in /home/mikolina/domains/parfum-kosmetik.in.ua/public_html/catalog/model/catalog/product.php on line 30Notice: Undefined index: isbn in /home/mikolina/domains/parfum-kosmetik.in.ua/public_html/catalog/model/catalog/product.php on line 31Notice: Undefined index: mpn in /home/mikolina/domains/parfum-kosmetik.in.ua/public_html/catalog/model/catalog/product.php on line 32
Заранее спасибо
У Вас в файле темы (product.tpl) указfys ean, jan, isbn, mpn, а в файле контроллера (product.php) — нет, поэтому движок сообщает об ошибке.
Вопрос может и туповат но все же актуален для меня! Все сделал как написано выше — но я не понял каким образом и откуда с админки вообще добавлять эти файлы которые потом можно скачивать со страницы товара? )
Файлы загружать через Каталог/Файлы для скачивания. К товару добавлять файлы через карточку товара в админке/Ссылки/Загрузки, начинаете вписывать название файла в поле и автоподбор Вам его отобразит, выбираете его и данный файл будет прикреплен к товару.
Добрый день.
Использовал Вашу инструкцию для rubber_ocshop_1_5_6_4.
Спасибо, загрузка работает для страницы товаров.
Правда, у меня задача загружать файлы со страницы категорий по каждому товару.
Это должен быть каталог производителей по брендам (бренд как товар).
Если можете, подскажите, пожалуйста, как применить Вашу инструкцию для загрузки файлов со страницы категорий.
С уважением. Сергей.
а вот как мне решить проблему,
1) у меня вообще закачиваются только тхт или пдф файлы.архивы и другие не поддерживает.как решить проблему с загрузкой файлов на с другим расширение.
2)как до так и после коррекции файлы не доступны для скачивания. вроде загружен,в папке донлоад есть.оформляю заказ как в платном варианте так и в бесплатном. все проходит ок.в конце сообщение
(Ваш заказ успешно сформирован!
Вы можете просматривать все ваши заказы в Личном кабинете в разделе История заказов.
Если в вашей покупке есть товары с файлами для скачивания, тогда вам нужно перейти в раздел «Файлы для скачивания» и скачать купленный товар.)
но после перехода в раздел «Файлы для скачивания» их там нет.так как не силен в этом движке,прошу помощи решения проблемы.так как на форуме не достучаться
у меня MaxyStore v.1.5.5.1 если что.
заранее спасибо
Для того, чтобы закачивались различные расширения, то в системе/настройки добавьте нужные.
Что же касается недоступности файлов после внесенных изменений, могу сделать вывод, что либо Вы допустили ошибку(и) при изменении кода, либо это Maxystore «рулит» (я с ним не работаю — ничего подсказать не могу).
Если на 100% убеждены в правильности своего кода, то можете написать автору данного метода — ссылка есть в записи.
Хм очень даже хорошее решение но!!!! Возникла проблема) а если на сайте есть файлы которые реально продаются?? они становятся доступны для скачивания без оплаты(( как сделать так, что бы устанавливался статус какие файлы можно скачивать без оплаты а какие нет
Здравствуйте, Юлия!
А не подскажете ли, как сделать так, чтобы в магазине электронных товаров ссылки оплаченных товаров появлялись в личном кабинете покупателя?
Уже что только не делал… Пробовал оформлять тестовые заказы через Onpay, Nextpay и «покупка бесплатного товара» через Free_checkout — оплата проходит, но ссылки на файлы так и не появляются… (все стандартные действия по настройкам в админке исполнены и проверены уже не раз..)
Спасибо!
Здравствуйте, Алекс,
по идее, эти ссылки и должны быть доступны покупателю в личном кабинете. Не появляются ссылки на файлы тех товаров, к которым они прикреплены? Странно, это стандартный функционал opencart. Не производили никаких правок кода в этом направлении? В админке/Система/Настройки/Опции отмечен пункт «Разрешить скачивание файлов»?
С настройками-то всё ок.)
После долгих плясок, вопрос решился удалением вкмода easy uploader
С ним удобно добавлять файлы, но вот почему-то отдачу загрузок он, оказалось, не любит..
Благодарю вас, Юлия за отклик!
Главное, что разобрались с корнем проблемы!
Здравствуйте, Юлия!
Всё получилось с загрузкой файлов на версии OC1.5.6, спасибо вам!
Здравствуйте . Не могу понять у меня вылетает ошибка: fError: Headers already sent out! .
Магазин ocstore 1.5.5.1.2 .
Проверьте свои файлы, которые правили, на кодировку, должна быть utf-8 без BOM. Также проверьте, чтобы в начале файла не было пробелов, отступов или посторонних знаков, кода.
не разобрались с ошибкой? у меня такая же, что то не пойму, кодировка вроде везде utf-8
https://rusjcam.com/index.php?route=product/product&path=59&product_id=35
ссылка на товар с файлом скачивания
Здравствуйте хочу добавить такую возможность подскажите как
https://tiande-sklad.com/
очень нужно выложить прайс на главную чтоб могли скачивать.
Здесь все просто, но не автоматизированно, конечно. Через загруженные файлы этого не сделать, данный функционал задуман для загружаемых файлов к товарам. Для того же, чтобы дать ссылку на скачивание прайса или любого другого файла, необходимо по ftp залить искомый файл в архиве, затем в нужном тексте или блоке (через админку, само собой) дать ссылку на этот файл, архивы браузерами не открывается, а скачиваются, таким образом прайс будет доступен для скачивания.
Добрый день!
Сделал все по инструкции, но ссылки не отображаются…
https://joxi.com/D2PBOlQHBM4ar3
В чем может быть проблема?
Здравствуйте! Помогла ваша статья, на ее основе сделал скачивание файлов в opencart 2.x может кому пригодится)
1. В конец файла catalog/model/catalog/product.php
вставляем эти 2 функции:
public function getDownloads($product_id) {
$query = $this->db->query(«SELECT * FROM » . DB_PREFIX . «product_to_download pd LEFT JOIN » . DB_PREFIX . «download d ON(pd.download_id=d.download_id) LEFT JOIN » . DB_PREFIX . «download_description dd ON(pd.download_id=dd.download_id) WHERE product_id = ‘» . (int)$product_id . «‘ AND dd.language_id = ‘» . (int)$this->config->get(‘config_language_id’).»‘»);
return $query->rows;
}
public function getDownload($product_id, $download_id) {
$download=»»;
if($download_id!=0)$download=» AND d.download_id=».(int)$download_id;
$query = $this->db->query(«SELECT * FROM » . DB_PREFIX . «product_to_download pd LEFT JOIN » . DB_PREFIX . «download d ON(pd.download_id=d.download_id) LEFT JOIN » . DB_PREFIX . «download_description dd ON(pd.download_id=dd.download_id) WHERE product_id = ‘» . (int)$product_id . «‘ «.$download.» AND dd.language_id = ‘» . (int)$this->config->get(‘config_language_id’).»‘»);
return $query->row;
}
2. Далее в
catalog/controller/product/product.php
ищем строчку и перед ней вставляем следующий код:
$data[‘downloads’] = array();
$results = $this->model_catalog_product->getDownloads($this->request->get[‘product_id’]);
// preType(DIR_DOWNLOAD);
foreach ($results as $result) {
if (file_exists(DIR_DOWNLOAD . $result[‘filename’])) {
$size = filesize(DIR_DOWNLOAD . $result[‘filename’]);
$i = 0;
$suffix = array(
‘B’,
‘KB’,
‘MB’,
‘GB’,
‘TB’,
‘PB’,
‘EB’,
‘ZB’,
‘YB’
);
while (($size / 1024) > 1) {
$size = $size / 1024;
$i++;
}
$data[‘downloads’][] = array(
‘date_added’ => date($this->language->get(‘date_format_short’), strtotime($result[‘date_added’])),
‘name’ => $result[‘name’],
‘size’ => round(substr($size, 0, strpos($size, ‘.’) + 4), 2) . $suffix[$i],
‘href’ => $this->url->link(‘product/product/download’, ‘product_id=’. $this->request->get[‘product_id’]. ‘&download_id=’ . $result[‘download_id’])
);
}
}
в этом же файле перед строчкой
public function review() {
вставляем следующий код
public function download() {
$this->load->model(‘catalog/product’);
if (isset($this->request->get[‘download_id’])) {
$download_id = $this->request->get[‘download_id’];
} else {
$download_id = 0;
}
if (isset($this->request->get[‘product_id’])) {
$product_id = $this->request->get[‘product_id’];
} else {
$product_id = 0;
}
$download_info = $this->model_catalog_product->getDownload($product_id, $download_id);
if ($download_info) {
$file = DIR_DOWNLOAD . $download_info[‘filename’];
$mask = basename($download_info[‘mask’]);
if (!headers_sent()) {
if (file_exists($file)) {
header(‘Content-Description: File Transfer’);
header(‘Content-Type: application/octet-stream’);
header(‘Content-Disposition: attachment; filename=»‘ . ($mask ? $mask : basename($file)) . ‘»‘);
header(‘Content-Transfer-Encoding: binary’);
header(‘Expires: 0′);
header(‘Cache-Control: must-revalidate, post-check=0, pre-check=0′);
header(‘Pragma: public’);
header(‘Content-Length: ‘ . filesize($file));
readfile($file, ‘rb’);
//$this->model_account_download->updateRemaining($this->request->get[‘download_id’]);
exit;
} else {
exit(‘Error: Could not find file ‘ . $file . ‘!’);
}
} else {
exit(‘Error: Headers already sent out!’);
}
} else {
$this->redirect(HTTP_SERVER . ‘index.php?route=account/download’);
}
}
3. Затем на странице товара:
catalog/view/theme/default/template/product/product.tpl
ищем строчку:
после нее вставляем следующий код:
Файлы для скачивания
4. Перед строчкой
вставляем следующий код:
<a href="» title=»» download >
5. Ну и на последок: заходим admin/controller/catalog/download.php
и изменяем следующую строчку:
$file = $filename . ‘.’ . md5(mt_rand());
на
$file = $filename; //. ‘.’ . md5(mt_rand());
И будет вас счастье)
html теги в коментах не отображаются: 3 и 4 пункт добавляю без тегов
3. Затем на странице товара:
catalog/view/theme/default/template/product/product.tpl
ищем строчку:
a href=»#tab-specification» data-toggle=»tab»>Файлы для скачивания</a
4. Перед строчкой
вставляем следующий код:
< a href="» download >
Александр, спасибо за инструкцию по opencart 2.x.
Но из-за запрета HTML в комментах много важной информации, которой Вы хотели поделиться, потерялось.
Прошу дополнить свою инструкцию в этих пунктах:
2. После какой строки вставлять код???
«Далее в
catalog/controller/product/product.php
ищем строчку и перед ней вставляем следующий код:»
3. Какой код вставлять после строки «a href=”#tab-specification” data-toggle=”tab”>Файлы для скачивания</a" ???
4. Перед какой строкой вставлять "» ???
5. В этом пункте нужно закомментировать «. ‘.’ . md5(mt_rand());» ???
Согласен с Дмитрием, хотелось бы уточнить последние пункты
Сегодня долго мучался с вашим вариантом и ничего не вышло из-за не внятного изложения как Вы это сделали, в итоге отличное решение для ocStore 2.1.0.1.1 нашёл тут: https://www.opencart.com/index.php?route=extension/extension/info&extension_id=24471&filter_search=Product%20Downloads%20addon&filter_license=0&filter_download_id=42
И танец с бубном закончился! Спасибо, что подняли эту важную тему в блоге.
Спасибо большое! А можно ли как то сделать чтоб ссылка на файл была видна только для определенной группы пользователей?
почему вы удалили мой вопрос?
пардон, какой то глюк был, не отображалось мое предыдущее сообщение
На хостинге вчера какие-то работы проводились и сайт работал не совсем адекватно)
Не знаете ответа на мой предыдущий вопрос, по поводу отображения разным пользователям? ))
Не вникала в этот вопрос, поэтому ответ дать не могу)
Спасибо элегантное решение. Уже на двух сайтах использую.
Спасибо за отзыв!
Прошу вас, напишите как сделать тоже самое на opencart 2.x. Описанный в комментариях способ не совсем понятен. Спасибо за вашу работу.
Низкий поклон за данный материал.
У меня была задача продавать выкройки и отдавать бесплатно.
С помощью этого материала задачу выполнила.
Бесплатные товары имеют цену ноль.
В catalog/view/theme/default/template/product/product.tpl
после строки
добавила проверку цены
и в самом конце
Теперь товары с нулевой ценой доступны для скачивания, а товары с реальной ценой нет