Как добавить загрузки к товару в opencart 1.5.1.3

Зачастую появляется необходимость добавить загружаемые файлы к товару в магазине. Это могут быть различные инструкции, схемы, какие-то дополнительные материалы и т.д. В OpenCart механизм привязки загрузок к товару в админке уже реализован. Вот только смысл его в том что работает это дело только из личного кабинета и загрузка сама по себе и является товаром.

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

1. В файле модели catalog/model/catalog/product.php находим строку

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 находим

$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'])
                    );
                }
            }
            ///////////////////////////////////////

в этом же файле ищем строчку

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/ВАША_ТЕМА/template/product/product.tpl ищем

<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>

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

В файле catalog/controller/checkout/login.php ищем строку

$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 ищем строку

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

и заменяем ее на

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

Вот собственно и все. Для большего понимания смысла смотрим видео

Прошу извинить за временами замучанный голос или если где туплю немножко :) Еще не совсем отоспался после рыбалки. Кстати, нами был пойман хороший такой толстолобик весом в 20 кг :)

PS: Вы также можете скачать готовый файл для VQMOD.