:::: МЕНЮ ::::

OpenCart 2.3.x — вывод ссылки на скачивание файла в карточке товара и в разделе товаров

Недавно пришлось модернизировать один инет-магазин на движке OpenCart 2.3.0.2 (rs.4).

Нужно было вывести ссылку на скачивание файла в карточке товара, например, инструкция в формате PDF.

Нашел в интернете инструкцию (автору, как обычно — респект), но мне ее пришлось немного поправить. По-этому предлагаю данный вариант, который я использовал на версии OpenCart 2.3.0.2.

1. Открываем файл catalog/model/catalog/product.php и ищем строку

public function getTotalProductSpecials() {

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

2. Теперь открываем файл catalog/controller/product/product.php и ищем строку

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

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

3. В этом же файле, находим строку

public function review() {

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

4. Теперь, непосредственно в теме, открываем файл catalog/view/theme/default/template/product/product.tpl и в любом месте (я выбрал место перед ценой), вставляем код:

В итоге вот, что получилось

opencart-skachat-pdf

 

UPD 14/05/18: вывод прямой ссылки на скачивание.

Как говорится, по многочисленным просьбам — выводим прямую ссылку на скачивание.

Дописываем п.2 catalog/controller/product/product.php

Дописываем п.4 catalog/view/theme/default/template/product/product.tpl

 

UPD 26/12/18: ссылка на скачивание файла в разделе товаров

1. Открываем файл catalog/model/catalog/category.php и ищем функцию

public function getTotalCategoriesByCategoryId($parent_id = 0) {

после этой функции вставляем

2. Открываем файл catalog/controller/product/category.php и ищем строку

foreach ($results as $result) {

2.1. перед этой строкой вставляем

2.2. после этой строкой вставляем

3. Открываем файл catalog/view/theme/default/template/product/category.tpl и ищем строку

и после нее вставляем

Untitled-261218


84 Комментариев

  • Ответить Ростислав |

    Очень пригодился ваш код, спасибо!
    Только для seo pro изменил ссылку в контроллере такого вида
    ‘href’ => $this->url->link(‘account/download/download’. ‘&download_id=’ . $result['download_id'])
    и прописать в таблице url_alias account/download/download => downloads

  • Ответить Максим |

    А что значит и прописать в таблице url_alias account/download/download => downloads ? это где надо сделать не совсем понял

  • Ответить Максим |

    У меня формируется ссылка типа сайт/tufli_3/?download_id=1

    но скачивания не происходит. не пойму пока почему(

    • Ответить Damon |

      Смириться и принять OpenCart какой он есть — ужасный. Точнее, не он сам ужасен, а все те «дописки» и плагины, которые пишут вольные разработчики. Главное каждый обвиняет другого, но только не свой плагин, типа, «У вас же все работало, пока не установили новый плагин?!». Был у меня один сайт, на котором, я так и не смогу подружить три плагина. Один работает нормал. Добавил второй, пришлось подпилить первый. Ну а третий поломал первые два :))

  • Ответить Михаил |

    А как реализовать чтобы была не ссылка на скачивание того же PDF а просто путь до него? Хочу в fancybox в модальном окне открывалось для чтения.

      • Ответить Александр |

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

        • Ответить Damon |

          1. Заходим в админку
          2. Создаем файл для загрузки: Каталог \ Загрузки \ Добавить. Даем имя и загружаем файл.
          3. Прикрепляем файл к товару: Каталог \ Товары \ Редактировать. Вкладка Связи. Пункт Загрузки. Кликаем в поле ввода и начинаем вводить имя из п.2. После того, как появились варианты с выбором, выбираем нужный файл.
          4. Готово.

      • Ответить Владимир |

        Добрый день.
        Подскажите пожалуйста, как вы вывели ссылку на скачивание в категории товаров?
        Спасибо!!!

          • Владимир |

            Добрый день.
            Да, подскажите пожалуйста, как вы это сделали?

          • Damon |

            Не вопрос. Только надо мне вспомнить, что я там кодил. До пятницы постараюсь рассказать.

          • Damon |

            Инструкция для версии 1.5

            Итак:
            1. /catalog/controller/product/category.php

            ищем строку

            if ($result['image']) {

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

            2. /catalog/model/catalog/category.php

            ищем функцию

            добавляем сразу после нее

            3. /catalog/view/theme/default/template/product/category.tpl

            3.1. ищем строку

            < ?php echo $product['description']; ?>

            сразу после нее добавляем

            3.2. ищем строку

            добавляем после нее

            4. Обновляем кэш и бегом проверять в раздел с товарами

          • Владимир |

            Добрый день!
            Спасибо большое!!!
            Только у меня нет html +=, это же в category.tpl ?
            Там нет.

          • Владимир |

            И вот что в итоге — Notice: Indirect modification of overloaded property ControllerProductCategory::$data has no effect in /system/storage/modification/catalog/controller/product/category.php on line 217

          • Владимир |

            Notice: Indirect modification of overloaded property ControllerProductCategory::$data has no effect in /system/storage/modification/catalog/controller/product/category.php on line 217 Parse error: syntax error, unexpected ‘?’ in /system/storage/modification/catalog/view/theme/default/template/product/category.tpl on line 118

          • Damon |

            Да, посмотрел сейчас и сдается мне, что файлы вы мне прислали от версии 2.3, так?
            Дело в том, что у меня сейчас под рукой нет движка 2.3 и попробовать не на чем

          • Владимир |

            Давайте это сделаю я и пришлю на почту все доступы?

  • Ответить Alexandr |

    Что то у меня ошибку бьет

    public function getTotalProductSpecials() {Warning: Cannot modify header information — headers already sent by (output started at /home/c/cd19979/test231/public_html/system/storage/modification/catalog/model/catalog/product.php:1) in /home/c/cd19979/test231/public_html/catalog/controller/extension/module/viewed.php on line 32

    вероятно это из за модуля Complete SEO, но честно говоря без понятия, еще протестирую на голом openart 2.3.0.2

  • Ответить Марианна |

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

    • Ответить Damon |

      Я подозреваю, что PDF у вас открывается в браузере, а не предлагает сохранить на диск, так?
      Если это так, то просто в браузере измените ассоциацию с PDF файлами. Выберите Открыть в приложении.

  • Ответить Марианна |

    по вашей ссылки где два варианта открыть или скачать без настройки этого в браузере работает. вот я и интересовалась как сделать ту ссылку при нажатии на которую идет сразу скачка.

    • Ответить Damon |

      Марианна, дайте ссылку на сайт, где можно посмотреть, что у вас там происходит не так.

  • Ответить Ирина |

    На сайте вы находитесь с помощью какого-то БРАУЗЕРА. Как он настроен, так и будет действовать. Какой-то сразу скачает, а какой-то (как в вашем случае) откроет для просмотра.
    В этом случае есть возможность скачать:
    - найти пиктограмму (типа дискетки), при наведении на которую всплывет подсказка «СКАЧАТЬ»
    - нажать Ctrl + s
    ——
    P.S. Это не я такая умная, а внуки рассказали, а им нянечка…Сохранить PDF Edge

  • Ответить Марианна |

    вы издевайтесь? на примере ссылке все работает без каких либо настроек браузера! я без вас знаю как сохранить, но это не каждому человеку объяснить который будет качать инструкцию с сайта.

  • Ответить Ирина |

    Может быть тогда файлы предоставлять архивом, а не PDF?
    Архивы сразу качаются.
    Это не проблема ОпенКарта / программирования / администрирования.

  • Ответить Павел |

    У Вас опубликовано решение для вывода ссылки на файл для скачивания в самой карточке товара. А как можно вывести ссылку для скачивания у товара, но уже на странице категории? Т..е на странице списка товаров?

          • Сергей |

            Подскажите, когда примерно ожидать инструкции по данному способу? :) Спасибо!

          • Damon |

            Сергей, пробуйте.
            Если не затруднит, отпишитесь потом, получилось ли

          • Сергей |

            Спасибо за реализацию, но, к сожалению, у меня не получилось. После внесения всех изменений, формируется ссылка вида site.ru/download/install.pdf.yQspqmahNa18No2A7MG4karZw4n2jORP но при попытке перейти по ней выдает ошибку 404. Вероятно потому, что фактически в коре сайта нет папки download и должен сработать редирект, но он не настроен. Может SEO PRO этому как-то мешает, но предыдущий формат ссылок работает…

        • Ответить Damon |

          Павел, Сергей, приветствую! Вы просили вывод ссылки на странице товаров.
          Сорри за ожидание. Конечно же можно все вывести. Вот, что получилось
          https://opencart.damonlsd.ru/opencart/index.php?route=product/category&path=20_27
          Это товары в категории
          У одного товара есть инструкция для скачивания, у другого товара ее нет.
          Ну и выводим ссылку на скачивание.

          Посмотрите, если подойдет, то будем в коде ковыряться :)

          • Сергей |

            Damon, наверное, не в ты ветку нажал ответ, извините :)

            У меня проблема возникла по части Вашей дополненной инструкции, чтобы файл был доступен по ссылке, вида site.ru/download/file.pdf

            Все сделал по новой инструкции, но не получилось. Ещё раз продублирую сообщение с описанием проблемы, заранее большое спасибо за ответ:
            «Спасибо за реализацию, но, к сожалению, у меня не получилось. После внесения всех изменений, формируется ссылка вида site.ru/download/install.pdf.yQspqmahNa18No2A7MG4karZw4n2jORP но при попытке перейти по ней выдает ошибку 404. Вероятно потому, что фактически в корне сайта нет папки download и должен сработать редирект, но он не работает. Может SEO PRO этому как-то мешает, но предыдущий формат ссылок работает…»

          • Damon |

            У вас точно в корне сайта нет папки download?
            А если не секрет, то куда у вас подобные файлы попадают?

          • Сергей |

            Посмотрел, файлы сохраняются в /system/storage/download

          • Damon |

            Поправил код из пункта «Дописываем п.2 catalog/controller/product/product.php».
            Можете брать из него код и заменить у себя на сервере.
            Дело в том, что в версии 1.5 был один путь до папки с файлами, а в версии 2.3 уже другой.

  • Ответить vikaharkov |

    У меня версия ОК 2.3.0.2
    Вставляю коды все, но ничего не вышло — белая страница открывается.
    Сначала никак не реагирует, а после добавления первой части
    «Дописываем п.2 catalog/controller/product/product.php»
    появляется белая страница при открытии карточки товара.

    Помогите разобраться пожалуйста

  • Ответить R2D2 |

    Доброе утро! Подскажите по поводу прямой ссылки на скачивание товара, делаю сайт на OS 2.3.0.2.3 этот код нужно дополнительно вставить к первоначальному или как то по другому. Спасибо за разъяснения.

  • Ответить R2D2 |

    Еще такой вопрос если я хочу прямую ссылку на скачивание и делаю как у вас то у меня вылезает следующее: Parse error: syntax error, unexpected ‘ ‘ (T_STRING) in D:\Openserver\OpenServer\domains\holodtorgprom.ru\catalog\controller\product\product.php on line 488. Как можно решить этот вопрос очень нужно. Спасибо. Если делаю все по первому варианту все получается а прямая ссылка нет.

  • Ответить Виктор |

    Готовый ocmod

    Скачивание файлов в карточке товара
    save pdf to product.tpl
    2.3.0.2
    Напишите что-нибудь
    #

    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;
    }
    /// скачивание файлов в карточке товара
    ]]>

    model_catalog_product->updateViewed($this->request->get['product_id']);]]>
    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++;
    }

    $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'])
    );
    }
    }
    /// скачивание файлов в карточке товара
    ]]>

    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’);
    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’);
    }
    }
    /// скачивание файлов в карточке товара
    ]]>

    <!— Для добавления в карточку товара использовать код

    Скачать: <a href="» title=»">

    —>

  • Ответить R2D2 |

    Извините еще один вопрос, если скачать нужно до 5 позиций, как их разместить один по одним. Спасибо.

  • Ответить R2D2 |

    Добрый вечер! Направляю для просмотра изображение полученных результатов. Подскажите где копать дальше. Вставлял все Ваши файлы один под одним. файл

  • Ответить R2D2 |

    Доброе утро! Посмотрите пожалуйста прикрепленный файл выше, все делаю, как у вас, но получается вот такая абракадабра. Подскажите где копать дальше.

  • Ответить Alexander |

    На текущий момент наполняю сайт, решил проверить вашу инструкцию сделал все что описано а поле так и не появилось( может подскажите в чем может быть косяк?

    ревилайн.бел/irrigatory/portativnye-cat/irrigator-revyline-rl-200.html

    кратинка

  • Ответить Леонид |

    Здравствуйте!
    UPD 26/12/18: ссылка на скачивание файла в разделе товаров
    На 3ю версию — не пробовали? У меня никак не получается…

  • Ответить Леонид |

    Спасибо, разобрался, прописал только в TWIG
    {% for download in downloads %}
    {% if download['product_id'] == product['product_id'] %}
    {% что хотим сделать, скачать, посмотреть и т.п. %}
    {% endif %}
    {% endfor %}

Оставить комментарий

  • Вставить изображение