OpenCart — добавляем возможность скачивания файлов без покупки товара | Collection




OpenCart — добавляем возможность скачивания файлов без покупки товара

Автор: jul
| Май 12, 2013 | Раздел:
OpenCart

| Комментариев: 6


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

OpenCart,  как довольно приличный магазинный движок, позволяет загружать различные файлы и продавать их как информационный товар. То есть покупатель покупает этот самый файл и в своем личном кабинете может его скачать после оплаты.  Но порой необходимо реализовать нечто иное. Например, магазин имеет своей направленностью не информационные товары, а вполне себе физические, имеющие потребность в инструкции, аннотации и т.д. Как же позволить покупателю, прежде чем он совершит покупку, скачать инструкцию? Что уж говорить о прайсах, pdf документах и прочей информационной документации…

Вот и у меня, благодаря заказчику, появилась надобность в реализации подобного функционала. И, к счастью, велосипед изобретать не пришлось — случайно увидела способ добавления загрузки и скачивания файлов из карточки товара на сайте FineSites. Огромная благодарность автору Serg за подробную и толковую инструкцию.

Что ж, если и Вам интересен этот вопрос, присоединяйтесь, открывайте свои редакторы и принимайтесь вносить изменения, которые принесут желаемый результат.

Все изменения протестированы на стандартном шаблоне, версия OpenCart 1.5.3.1.

1. Открываем файл catalog/model/catalog/product.php и ищем строку (приблизительно 497 строка):

public function getTotalProductSpecials() {

И перед ней размещаем код:

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 строку:

$this->model_catalog_product->updateViewed($this->request->get['product_id']);

и опять таки, перед ней размещаем код:

/////////////////////////////////////
$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 строка, с учетом внесенных изменений) находим строку:

public function upload() {

перед ней добавляем:

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 строка):

<div id="tabs" class="htabs"><a href="#tab-description"><?php echo $tab_description; ?></a>

и перед этой строкой добавляем код:

<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 строку

$this->data['guest_checkout'] = ($this->config->get('config_guest_checkout') && !$this->config->get('config_customer_price') && !$this->cart->hasDownload());

и меняем ее на

$this->data['guest_checkout'] = ($this->config->get('config_guest_checkout') && !$this->config->get('config_customer_price') );

Теперь в файле catalog/controller/checkout/guest.php находим 180 строку:

if (!$this->config->get('config_guest_checkout') || $this->config->get('config_customer_price') || $this->cart->hasDownload()) {

и меняем ее на

if (!$this->config->get('config_guest_checkout') ) {

5. Внесем небольшое изменение для SeoPro. Если в Вашем магазине настроены ЧПУ, то данное действие обязательно, так как без него ссылка отобразится, но не будет доступна для скачивания — просто будет неактивна.

Открываем файл catalog/controller/common/seo_pro.php и после строк (132-135):

case 'product_id':
 case 'manufacturer_id':
 case 'category_id':
 case 'information_id':

размещаем строку:

case ‘download_id’:

Таким образом мы добавили в магазин возможность скачивания файлов без регистрации, без покупки товара и т.д. Теперь разместить ссылку на скачивание будь то прайса, каталога или еще какой документации, не составит труда.

Вид, добавленных ссылок товару, будет приблизительно таким:

Поработав же над стилями, им можно придать любой желаемый вид.

Также Вам могут быть интересны следующие статьи:

Комментариев: 6. Добавьте свой комментарий

  1. 4 июля 2013 |
    Денис пишет: Ответить
    Приветствую! Сделал всё как тут описано и при попытке оформления заказа в гостевом режиме выдаёт ошибку:

    Parse error: syntax error, unexpected T_PUBLIC in /public_html/catalog/controller/checkout/guest.php on line 364

    Как исправить не подскажете? Спасибо!

    • 7 июля 2013 |
      jul пишет: Ответить
      Версия OpenCat 1.5.3.1?
      Действия четвертого пункта выполнили? Именно он отвечает за гостевое формление заказа, учитывая добавленную возможность.

  2. 12 августа 2013 |
    Борис пишет: Ответить
    Спасибо большое) Долго искал как так сделать, в общем очень Вам благодарен.

    • 13 августа 2013 |
      jul пишет: Ответить
      И Вам спасибо за отзыв!

  3. 15 августа 2013 |
    Андрей пишет: Ответить
    Супер! Как всегда РАБОТАЕТ!
    Спасибо за такой нужны пост!!!
    А где именно копать, чтоб подправить стили вывода ссылки?
    понимаю что в stylesheet.css но где именно — не пойму…
    Заранее спасибо!

    • 18 августа 2013 |
      jul пишет: Ответить
      Здравствуйте, Андрей. Разобрались с вопросом? Если нет, то можете дать ссылку на реализацию данной функции, постараюсь помочь. У меня же на данный момент нет этой функции в действии, не на чем проверить код.

Вступайте в беседу!

Имя

Email

Сайт

Комментарий

Уведомлять меня о новых записях почтой.


http://jul-collection.com/opencart-dobavlyaem-vozmozhnost-skachivaniya-faylov-bez-pokupki-tovara.html

Губарь Маргарита Александровна