Opencart — Добавляем Возможность Скачивания Файлов Без Покупки Товара

Тема в разделе "Модули и дополнения", создана пользователем admin, 17 июн 2016.

  1. TopicStarter Overlay
    Offline

    admin Команда форума Администратор

    Сообщения:
    2.317
    Симпатии:
    75.744
    Репутация:
    170
    Итак, заголовок поста практически говорит сам за себя — сегодня мы поговорим о том, как позволить посетителям нашего магазина скачивать файлы до совершения покупок, оформления заказа и оплаты.

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

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

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

    Все изменения протестированы на стандартном шаблоне, версия OpenCart 1.5.3.1. [spacer size=»10″]

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

    Код:
    publicfunctiongetTotalProductSpecials(){

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

    Код:
    publicfunctiongetDownloads($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;
    }
    
    publicfunctiongetDownload($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($resultsas$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 строка, с учетом внесенных изменений) находим строку:

    Код:
    publicfunctionupload(){
    перед ней добавляем:

    Код:
    publicfunctiondownload(){
    
    $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"><ahref="#tab-description"><?phpecho$tab_description;?></a>
    и перед этой строкой добавляем код:

    Код:
    <div class="product-info">
    <?phpif($downloads){?>
    <br>
    
    <?phpforeach($downloadsas$download){?>
    
    <ahref="<?phpecho$download['href'];?>"title=""><?phpecho$download['name'];?><?phpecho" (".$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’:
    Таким образом мы добавили в магазин возможность скачивания файлов без регистрации, без покупки товара и т.д. Теперь разместить ссылку на скачивание будь то прайса, каталога или еще какой документации, не составит труда.

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

    files_download.jpg

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

    darthmo Пользователь

    Сообщения:
    42
    Симпатии:
    5
    Репутация:
    5
    @admin, Добрый день, не находили подобное решение пол 2.х?