ModX — Сниппет для скачивания файла со статистикой

На днях искал решение для ModX Evolution, с помощью которого можно организовать скачивание файлов через промежуточную страницу. Вроде такой, как на варезниках, с паузой в 5 сек и без прямых ссылок на файл. Готового решения даже близко не было, пришлось писать собственное.

Основные требования к функционалу:

  • доступ к файлу только через скрипт, никаких прямых ссылок
  • файл отдается через промежуточную страницу с задержкой 5 сек
  • вести подсчет количества закачек
  • поддержка докачки

Итак, для начала надо создать TV-параметр типа file, название пусть будет тоже file. Сюда будет вводится путь к файлу, поэтому его нужно привязать к шаблону, который выводит страницу с описанием программы.

Далее для счетчика закачек создадим в базе данных таблицу modx_downloads с полями:

После этого созданим сниппет getFile, который и будет обрабатывать закачку:

Создадим еще один сниппет getFileUrl, вспомогательный, который будет выводить ссылку на закачку:

При наличии GET-параметра go=true файл отдается сразу, без задержки.

Создадим шаблон download, который должен иметь примерно такой вид:

И наконец, создаем страницу download, через которую и будет отдаваться файл. Нужно присвоить ей шаблон download, скинуть галки «Доступен для поиска» и «Кешируемый», а в контент вставить вызов сниппета getFile:

Теперь достаточно создать документ, залить файл, и в контенте разместить ссылку на скачивание файла, которая должна иметь вид ([docid] — id страницы программы):

При нажатии на ссылку открывается страница download.html, идет пауза 5 сек, и открывается окно сохранения файла.

Если возникнет желание адаптировать это решение для ModX Revo, то вам пригодятся Шпаргалки для ModX Revolution.

Копия этой статьи также размещена на сайте русского сообщества ModX.

  • sharkbait

    thanks for sharing! 🙂

  • sashbats

    Здравствуйте,
    Спасибо за сниппет. Установил, все работает. Но во время скачивания файла блокируется перезоды по сайту, те пользователь должен ждать завершения закачки, и только потом може попасть на другую страницу (или же открыть в другом браузере). Так и задумано, или я что-то напутал или установки МОДх или сервера

    • Нет, там ничего не блокируется. Разве что нет автоматического перехода назад после закачки, поэтому так кажется.

  • sashbats

    Я отрываю шаблон download в новой вкладке. И даже если во время скачивания переключаюсь на вкладку-родитель, то не могу двигаться по сайту. проверил и в мозиле и в хроме ((
    В чем может быть дело?

    • Не знаю, вряд ли это связано со сниппетом. Проверил у себя в проекте — такой проблемы нет.

  • sashbats

    Хорошо, спасибо — буду искать…

  • Сергей

    А как можно сделать, чтобы перед запросом на скачивание юзер заполнил форму (например — наименование, почта, телефон)

    • Neolot

      Нужно сделать еще один шаблон, с формой, а после отправки формы отправлять на download

  • Спасибо огромнейшие, вес работает на ура

  • mic

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

    это связано с настройками хостинга?

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

  • mic

    это в хроме
    в мозиле и эксплоере после 5сек или при нажатии ссылки на скачку пишет нет такой страницы.

  • foller

    Очень нужное решение, спасибо. Не могу понять в чём проблема, при вызове сниппета [!getFile!] (так же и кэшируемого) на странице download отображается просто пустая страница, а без вызова нормально. Всё переделывал в точности как у Вас — та же история, пустая страница.

    • Где-то ошибка в коде, проверьте еще раз

  • foller

    Да была банальная ошибка в коде (при копировании с сообщества). Теперь столкнулся с тем, что файл не отдаётся ни через 5с, ни с помощью getFileUrl, просто происходит refresh страницы. Ссылка на страницу download такая http://mysite.com/index.php?id=181, пробовал подставлять её в getFileUrl — не помогает. И ещё вопрос, как вывести статистику скачиваний, например, в описание файла?

    • foller

      Исправил ссылку на страницу с файлом (отключил TransAlias) на [html]http://yoursite.com/download.html?id=[docid][/html], при нажатии открывается страница download.html, но окно сохранения файла не открывается, в чём может быть дело?

  • Serxio

    Подскажите, как все-таки сделать, чтобы возле ссылки отображалось кол-во скачиваний?
    Я в этой cms, еще не совсем разобрался, как это можно сделать

  • Badha

    добрый день.
    а что нужно сделать, чтоб он работал на modx REVO?