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.