FileDownload R – это сниппет, в котором будет отражаться список файлов из каталога пользователя.
Этот сниппет – полная перезапись FileDownload Кайла Джаббера (Kyle Jabber) для MODX Evolution.
Версия для Revolution была создана Goldsky.
Этот сниппет не показывает реальный путь к ссылке, вместо этого используется хешированная ссылка.
Самое главное, что Вы можете сохранить файлы/каталоги вне корневого каталога документов, а сценарий сделает все остальное.
Счетчик загрузки хранится в пользовательской базе данных.
Начиная с версии 1.0.0-pl, этот пакет так же содержит плагин для добавления разработчиком дополнительных функций для процесса загрузки.
FileDownload MODX Revolution
Параметры полностью заимствованы из версии для Evolution с некоторыми изменениями, поэтому пользователь Evolution с легкостью сможет понять особенности использования.
Основные положения использования
[[!FileDownload?]
Имя |
Описание |
Пример |
Значение по умолчанию |
Опции |
getDir |
|
&getDir=`[[++core_path]]downloads,[[++base_path]]assets/downloads, assets/files` |
пусто |
строка |
getFile |
|
&getFile=`assets/files/readme.txt,[[++core_path]]downloads/readyou.doc,[[++base_path]]assets/downloads/book1.xlsx` |
Пусто |
строка |
userGroups |
Сделает ссылку активной для пользователей, принадлежащих к указанным группам. Множество групп можно указать при помощи списка, разделенного запятыми. |
&userGroups=`Administrator, Registered Member` |
Пусто |
строка |
extShown |
Разделенные запятыми расширения файлов для отображения файлов в данном расширении. |
&extShown=`zip,php,txt` |
Пусто |
строка |
extHidden |
Разделенные запятыми расширения файлов для файлов, котрые должны быть скрытыми. Это действие заменит значения extShown |
&extHidden=`zip,php,txt` |
Пусто |
строка |
toArray |
|
&toArray=`1` |
0 |
bool: 0/1 |
downloadByOther |
Прекратите загрузку при помощи этого сниппета, чтобы выбрать другой способ |
&downloadByOther=`1` |
0 |
bool: 0/1 |
Примечание
Вам нужно воспользоваться всплывающим окном javascript, чтобы принудить программу загрузки заполнить форму перед началом загрузки.
Затем, при помощи AJAX подтвердите форму и примите результаты.
Если результаты верны, AJAX вызывает API загрузки и начинает ее.
Чанк файла
Вам необходимо создать чанк для строки файла.
Например: jsDownload chunk
<tr[[+fd.class]]> <td style="width:16px;"><img src="[[+fd.image]]" alt="[[+fd.image]]" /></td> <td> <a href="javascript:void(0);" rel="#formLink" id="[[+fd.hash]]" >[[+fd.filename]] </a> <span style="font-size:80%">([[+fd.count]] downloads)</span> </td> <td>[[+fd.sizeText]]</td> <td>[[+fd.date]]</td> </tr> [[-- This is the description row if the &chkDesc=`chunkName` is provided --]] [[+fd.description:notempty=`<tr> <td></td> <td colspan="3">[[+fd.description]]</td> </tr>`:default=``]]
HTML
#downloaderForm – это базовая HTML форма с полями.
В этом примере я так же использую оверлей и контрольное устройство из jQuerytools (расположены прямо под вызовом сниппета).
Итак, вызов сниппета будет выглядеть так:
[[!FileDownload? &getDir=`assets/downloads` &tplFile=`jsDownload` &downloadByOther=`1` ]] <div class="form_overlay" id="formLink"> <h2>Contact Form</h2> <form action="[[~[[*id]]]]" method="post" class="form" id="downloaderForm"> <input type="hidden" name="nospam:blank" value="" /> <input type="hidden" name="link" value="" /> <label for="name">Name:</label> <input type="text" name="name" id="name" value="" required="required" /> <label for="email">Email:</label> <input type="email" name="email" id="email" value="" required="required" /> <label for="phone">Phone:</label> <input type="number" name="phone" id="phone" value="" required="required" /> <label for="country">Country:</label> <input type="text" name="country" id="country" value="" required="required" /> <div class="form-buttons"> <button type="submit">Send Contact Inquiry</button> <button type="reset">Reset</button> </div> </form> </div> <pre>} <p>javascript</p> <pre><code>$(function(){ var c = 'assets/components/yourpackage/c.php?'; createForm(); function createForm() { $(".fd-file a[rel]").each(function(i) { var self = $(this); self.overlay({ effect: 'apple', onLoad: function() { var id = self.attr('id'); $("#downloaderForm input[name=link]").val(id); }, onBeforeClose: function(){ $(".error").hide(); $("#downloaderForm input").each(function(){ $(this).removeClass('invalid'); }); $("#downloaderForm input[name=link]").val(''); clearForm($("#downloaderForm")); } }); }); $("#downloaderForm").validator().submit(function(e){ var form = $(this); if (!e.isDefaultPrevented()) { $.post(c + 'action=web/form/add&ctx=web&' + form.serialize(), function(data) { if (data && data.success === true) { clearForm(form); $(".fd-file a[rel]").each(function(i) { $(this).overlay().close(); }); fileDownload(c + 'action=web/file/get&ctx=web&link=' + data.link); $(".fd-file a[rel]").each(function(i) { var self = $(this); self.off(); var link = self.attr('id'); self.attr('onclick', 'fileDownload("' + c + 'action=web/file/get&ctx=web&link=' + link+'")'); }); } else { form.data("validator").invalidate(data); } }, "json"); e.preventDefault(); } }); } function clearForm(form) { form.find(':input').each(function() { switch(this.type) { case 'password': case 'select-multiple': case 'select-one': case 'text': case 'email': case 'number': case 'textarea': $(this).val(''); break; case 'checkbox': case 'radio': this.checked = false; } }); } }); function fileDownload(link) { $('<iframe/>',{ src: link }).hide().appendTo($('body')); }
А соединитель будет выглядеть так:
<?php /** * FileDownload R's AJAX connector file */ $validActions = array( 'web/file/get', 'web/form/add' ); if (!empty($_REQUEST['action']) && in_array($_REQUEST['action'], $validActions)) { @session_cache_limiter('public'); define('MODX_REQP', false); } require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/config.core.php'; require_once MODX_CORE_PATH . 'config/' . MODX_CONFIG_KEY . '.inc.php'; require_once MODX_CONNECTORS_PATH . 'index.php'; $corePath = $modx->getOption('filedownload.core_path', null, $modx->getOption('core_path') . 'components/filedownload/'); require_once $corePath . 'models/filedownload/filedownload.class.php'; $modx->filedownload = new FileDownload($modx); $modx->lexicon->load('filedownload:default'); if (in_array($_REQUEST['action'], $validActions)) { $version = $modx->getVersionData(); if (version_compare($version['full_version'], '2.1.1-pl') >= 0) { if ($modx->user->hasSessionContext($modx->context->get('key'))) { $_SERVER['HTTP_MODAUTH'] = $_SESSION["modx.{$modx->context->get('key')}.user.token"]; } else { $_SESSION["modx.{$modx->context->get('key')}.user.token"] = 0; $_SERVER['HTTP_MODAUTH'] = 0; } } else { $_SERVER['HTTP_MODAUTH'] = $modx->site_id; } $_REQUEST['HTTP_MODAUTH'] = $_SERVER['HTTP_MODAUTH']; } /* handle request */ $path = $modx->getOption('core_path') . 'components/yourpackage/processors/'; $modx->request->handleRequest(array( 'processors_path' => $path, 'location' => '', ));
Процессор
core/components/yourpackage/processors/web/file/get/
<?php if (!$modx->loadClass('FileDownload', $modx->getOption('core_path') . 'components/filedownload/models/', true, true)) { $modx->log(modX::LOG_LEVEL_ERROR, '[FileDownload] Could not load FileDownload class.'); return ''; } $fdl = $modx->getService('fdl' , 'FileDownload' , $modx->getOption('core_path') . 'components/filedownload/models/filedownload/' ); $configs = array(); $configs['countDownloads'] = true; $fdl->setConfigs($configs); $downloadFile = $fdl->downloadFile($scriptProperties['link']); // <== THIS IS WHERE YOU DOWNLOAD THE FILE if (!$downloadFile) { $output = array('success' => FALSE); } else { $output = array('success' => TRUE); } return json_encode($output);
Соль для хеша
Имя | Описание | Значение по умолчанию | Опции |
saltText | Этот текст будет добавлен к хешированной ссылке файла, чтобы скрыть прямой путь. | FileDownload | строка |
Ссылка – это хешированный текст текста соли, контекста и имени файла. Поэтому если через некоторое время Вы измените значение saltText, это действие не заблокирует появление контекста на странице, но база данных начнет отсчет с нуля, так как не будет найдено начальное хешированное значение.
Дополнительно
Имя | Описание | Пример | Значение по умолчанию | Опции |
noDownload | Показывает список файлов без ссылок загрузки. Примечание: отличается от версии Evolution. | &noDownload=`1` | 0 | bool: 0/1 |
browseDirectories | Позволяет пользователю просматривать подкаталоги указанного каталога с параметрами &getDir | &browseDirectories=`1` | 0 | bool:0/1 |
chkDesc | Позволяет добавлять описания к списку файлов, включенных в чанк. | &chkDesc=`fileDesc` | fileDescription (описание файла) | Имя чанка |
dateFormat | Форматирование PHP данных для списка | &dateFormat=`m/d/Y` | Y-m-d | строка |
countDownloads | Трекинг загрузки | &countDownloads=`1` | 0 | bool: 0/1 |
imgTypes | Имя чанка для определения взаимосвязи расширения файла и картинки | &imgTypes=`fdImages` | fdImages | Имя чанка |
imgLocat | Путь к картинке для установления связи с каждым из расширений файлов. | &imgLocat=`assets/filetypes` | assets/components/filedownload/img/filetype | Доступный путь |
Сортировка
Имя | Описание | Пример | Значение по умолчанию | Опции |
sortBy | Упорядочение сортировки. Опции: имя файла|расширение|размер|размер текста|тип|дата|описание|единица счёта | &sortBy=`path` | Filename (имя файла) | строка |
sortByCaseSensitive | Чувствительная к регистру опция для сортировки | &sortByCaseSensitive=`1` | 0 | bool: 0/1 |
sortOrder | Сортировка файлов в восходящем или нисходящем порядке | &sortOrder=`desc` | asc | asc/desc |
sortOrderNatural | Сортировка файлов в естественном порядке | &sortOrderNatural=`1` | 1 | bool: 0/1 |
groupByDirectory | Если в параметрах getDir указаны множественные каталоги, эта опция сгруппируют файлы для каждого каталога | &groupByDirectory=`1` | 0 | bool: 0/1 |
Множественное упорядочение сортировки используется при следующих сортировках:
Сортировка файлов: имя файла
Каталоги загрузки: направление, имя файла
Группировка по каталогу: путь, направление, имя файла
Пример
[[!FileDownload? &getDir=`[[++core_path]]downloads-from-core/land rover, assets/downloads` &browseDirectories=`1` &groupByDirectory=`1` ]]
Шаблон
Имя | Описание | Пример | Значение по умолчанию | Опции |
tplDir | Шаблон строки катаога | &tplDir=`tpl-dir` | tpl-dir | chunk's name/ @Bindings (Имя чанка/ @привязки) |
tplFile | Шаблон строки файла | &tplFile=`tpl-file` | tpl-file | chunk's name/ @Bindings (Имя чанка/ @привязки) |
tplGroupDir | Так выглядит шаблон пути каталга, если &groupByDirectory (группировка по каталогу) включена | &tplGroupDir=`tpl-group` | tpl-group-dirchunk's name | chunk's name/ @Bindings (Имя чанка/ @привязки) |
tplWrapper | Это шаблон контейнера для всех результатов сниппета | &tplWrapper=`tplWrapper` | tpl-wrapper | chunk's name/ @Bindings (Имя чанка/ @привязки) |
tplWrapperDir | Это шаблон контейнера для папок (дополнительно) | &tplWrapperDir=`tplWrapperDir` | chunk's name/ @Bindings (Имя чанка/ @привязки) | |
tplWrapperFile | Это шаблон контейнера для файлов (дополнительно) | &tplWrapperFile=`tplWrapperFile` | chunk's name/ @Bindings (Имя чанка/ @привязки) | |
tplIndex | Сгенерированный индекс. Html-файл, чтобы скрыть доступ к каталогу от прямого доступа по сети | &tplIndex=`tpl-index` | tpl-index | chunk's name/ @Bindings (Имя чанка/ @привязки) |
tplNotAllowed | Шаблон для запрещенного доступа. Может быть использован [[!Login]] | &tplNotAllowed=`tpl-notAllowed` | @FILE: [[++core_path]]components/filedownload/elements/chunks/tpl-notallowed.chunk.tpl | chunk's name/ @Bindings (Имя чанка/ @привязки) |
tplWrapperDir и tplWrapperFile (1.0.0-rc.5) – различные упаковщики для папок и файлов. В них могут быть различные заголовки. В упаковщиках установлены чанки по умолчанию {core_path}components/filedownload/elements/chunks/, где tpl-wrapper-dir.chunk.tpl и tpl-wrapperfile.chunk.tpl, соответственно.
Чтобы использовать эти упаковщики, tplWrapperтак же должен быть изменен.
FileDownload R имеет директиву @BINDING для шаблна:
- @CODE|@INLINE
- @FILE
- @CHUNK (или отсутсвует) – по умолчанию
[[!FileDownload? &getDir=`assets/downloads` &tplFile=`@CODE: <tr[[+fd.class]]> <td> <span class="fd-icon"> <img src="[[+fd.image]]" alt="" /> </span> <a href="[[+fd.url]]">[[+fd.filename]]</a> <span style="font-size:80%">([[+fd.count]] downloads)</span> </td> <td>[[+fd.sizeText]]</td> <td>[[+fd.date]]</td> </tr>` ]]
[[!FileDownload? &getDir=`assets/downloads` &browseDirectories=`1` &tplWrapper=`` &tplWrapperDir=`tpl-wrapper-dir` &tplWrapperFile=`tpl-wrapper-file` ]]
Заголовки
Имя | Описание | Значение по умолчанию | Опции |
fileCss | Каскадный стиль заголовка страницы | assets/components/filedownload/css/fd.css | web path (каналы службы web) |
fileJs | Javascript файл для заголовка страницы | assets/components/filedownload/js/fd.js | web path (каналы службы web) |
Стили
Имя | Описание | Пример | Значение по умолчанию | Опции |
cssAltRow | Указывает класс, который будет применен к каждому файлу/каталогу, чтобы применить стиль к | fd-altRow | Имя CSS класса | |
cssDir | Имя класса для всех каталогов | fd-dir | ||
cssExtension | Если установить это значение на «1», то класс будет применяться к каждому файлу, согласно его расширению | &cssExtension=`1` | 0 | bool: 0/1 |
cssExtensionPrefix | Перфикс для имени класса | fd- | строка | |
cssExtensionSuffix | Суффикс для имени класса | null | строка | |
cssFile | Имя класса для всех файлов | &cssFile=`files` | fd-file | Имя класса |
cssFirstDir | Имя класса для первого каталога | fd-firstDir | Имя CSS класса | |
cssFirstFile | Имя класса для первого файла | fd-firstFile | Имя CSS класса | |
cssGroupDir | Имя класса каталога для мульти-каталоговой группировки | fd-group-dir | Имя CSS класса | |
cssLastDir | Имя класса для последнего каталога | fd-lastDir | Имя CSS класса | |
cssLastFile | Имя класса для последнего файла | fd-lastFile | Имя CSS класса | |
cssPath | Указывает имя класса, который будет применен к пути во время использования каталога загрузки | fd-path | Имя CSS класса |
FileDownloadLink MODX Revolution
FileDownloadLink – это сниппет для единичного доступного для скачивания файла.
Он обеспечивает ссылку на файл прямого доступа.
Но в этом случае FileDownloadLink скрывает реальный путь файла хешированной ссылкой, отслеживает операции во время загрузки.
Основные положения использования:
[[!FileDownloadLink?]]<strong></strong> <strong></strong>
Главное
Имя | Описание | Пример | Значение по умолчанию | Опции |
getFile | Можно указать только один путь файла для этого параметра | &getFile=`assets/files/readme.txt` | пусто | строка |
userGroups | Сделает ссылку для скачивания активной только для пользователей, принадлежащих к указанным группам. Множество групп можно указать списком, разделенным запятыми. | &userGroups=`Administrator, Registered Member` | пусто | строка |
toArray | Возвращает результаты предыдущего массива. | &toArray=`1` | 0 | bool: 0/1 |
Соль для хеша
Имя | Описание | Значение по умолчанию | Опции |
saltText | Этот текст будет добавлен к хешированной ссылке файла, чтобы скрыть прямой путь. | FileDownload | строка |
Ссылка – это хешированный текст текста соли, контекста и имени файла. Поэтому если через некоторое время Вы измените значение saltText, это действие не заблокирует появление контекста на странице, но база данных начнет отсчет с нуля, так как не будет найдено начальное хешированное значение.
Дополнительно
Имя | Описание | Пример | Значение по умолчанию | Опции |
noDownload | Показывает список файлов без ссылок загрузки. Примечание: отличается от версии Evolution. | &noDownload=`1` | 0 | bool: 0/1 |
chkDesc | Позволяет добавлять описания к списку файлов, включенных в чанк. | &chkDesc=`fileDesc` | fileDescription | Имя чанка |
dateFormat | Форматирование PHP данных для списка | &dateFormat=`m/d/Y` | Y-m-d | строка |
countDownloads | Трекинг загрузки | &countDownloads=`1` | 0 | bool: 0/1 |
imgTypes | Имя чанка для определения взаимосвязи расширения файла и картинки | &imgTypes=`fdImages` | fdImages | Имя чанка |
imgLocat | Путь к картинке для установления связи с каждым из расширений файлов. | &imgLocat=`assets/filetypes` | assets/components/filedownload/img/filetype | Доступный путь |
Шаблон
Шаблон для этого сниппета – это обычная гипер-ссылка с подстановщиками FileDownloadLink. Это не чанк и не шаблон файла.
Если Вы хотите просмотреть доступные подстановщики, просто запустите параметр &toArray=`1`.
Имя | Описание | Пример | Значение по умолчанию | Опции |
tplCode | Шабон файла | &tplCode=`<a href="[[+link]]">[[+filename]]</a>` | <a href="[[+link]]">[[+filename]]</a> | HTML код |
Заголовки
Имя | Описание | Значение по умолчанию | Опции |
fileCss | Каскадный стиль заголовка страницы | assets/components/filedownload/css/fd.css | web path (каналы службы web) |
fileJs | Javascript файл для заголовка страницы | assets/components/filedownload/js/fd.js | web path (каналы службы web) |
Пример
[[!FileDownloadLink? &getFile=`[[++core_path]]downloads/Document1.doc` &tplCode=` <a href="[[+link]]" title="[[+filename]]"> <span class="gradient curve-four" style="display: block; text-align: center;"> <img src="[[+image]]" alt="" />Download this Document1.doc<hr /> [[+date]] ([[+count]] downloads) </span> </a>` &dateFormat=`d-m-Y` &toArray=`0` ]]
Плагины
События
Так как это небольшой сценарий, в нем довольно мало событий. Но все же иногда некоторые из них бываю очень полезны:
- OnLoad
Как только загружается сценарий, триггер этого события вызывает все плагины, между которыми нужно установить зависимость
- BeforeDirOpen
Перед сканированием/открытием папки
- AfterDirOpen
После сканирования/открытия папки
- BeforeFileDownload
Перед загрузкой файла
- AfterFileDownload
После загрузки файла
Полное руководство, включая доступные свойства и ожидаемые результаты, описаны в файле core/components/filedownload/plugins/filedownloadplugin.events.php
Невозможно найти форматер исходного кода для языка: php. Доступные языки: actionscript, html, java, javascript, none, sql, xhtml, xml
<!--?php = array( 'OnLoad' =--> array( 'properties' => array(), 'returnType' => array( NULL ) ), 'BeforeDirOpen' => array( 'properties' => array( 'dirPath' ), 'returnType' => array( NULL, FALSE, 'continue' ) ), 'AfterDirOpen' => array( 'properties' => array( 'dirPath', 'contents' ), 'returnType' => array( NULL, FALSE, 'continue' ) ), 'BeforeFileDownload' => array( 'properties' => array( 'hash', 'ctx', 'filePath', 'count' ), 'returnType' => array( NULL, FALSE ) ), 'AfterFileDownload' => array( 'properties' => array( 'hash', 'ctx', 'filePath', 'count' ), 'returnType' => array( NULL ) ), ); return $events;
Свойства
&plugins
Для запуска плагина Вам нужно запустить его внутри сниппета в формате JSON:
[ [!FileDownload? &getDir=`assets/files` &plugins=`[{"name":"[[++core_path]]components/filedownload/plugins/<a class="myClass" href="http://www.modx.cc/documentation/additions/formit/">formit</a>.formsave.plugin.php","event":"OnLoad","strict":true},{"name":"[[++core_path]]components/filedownload/plugins/<a class="myClass" href="http://www.modx.cc/documentation/additions/formit/">formit</a>.formsave.plugin.php","event":"AfterFileDownload"},{"name":"FileDownloadEmailPlugin","event":"AfterFileDownload"}]` &emailProps=`{ "emailTpl":"FileDownloadEmailChunk", "emailSubject":"New Downloader", "emailTo":"your@email.com", "emailCC":"your@other.email.com", "emailBCC":"your@secret.email.com", "emailBCCName":"secret" }` ] ]
В этом примере я использую 2 плагина по умолчанию - FormSave и Email (как сниппет), которые оба зависят от дополнения FormIt.
Эти плагины выполнят следующие действия:
OnLoad
Проверяет, доступны ли FormSave и Formit. Если они не доступны, останавливает операцию.
AfterFileDownload
После загрузки файла сохраняет информацию в FormSave и отсылает письмо с предоставленным чанком на заданный адрес.
Свойства письма используют свойства Formit, так как оно привязано к нему.
Структура JSON:
Имя
Имя сниппета или пути файла для плагина
Событие
Имя события, к которому нужно применить действие
Строгость (дополнительно)
Булевский тип (Верно/Неверно) устанавливает плагины в строгий режим – если результат НЕВЕРНО, сценарий останавливает процесс. Подобная остановка процесса доступна только в некоторых событиях, поэтому, пожалуйста, прочтите о триггерах событий выше.
Множественные плагины и события нужно запускать неоднократно, так как у них различные статусы строгости.
APIs
Список APIs, которые можно использовать внутри сценария плагина:
Имя | Метод | Описание |
$modx | all modx's methods | Например, MODX по умолчанию |
$fileDownload | getConfig($key) getConfigs() | Для просмотра свойств сценария (&emailProps) |
$plugin | getProperties() getAllEvents() getAppliedEvents() | Показывает пользовательские свойства плагина Показывает все триггеры события Показывает события, примененные к указанному плагину во время выполнения процесса |
Теперь можете использовать всю свою фантазию, чтобы добавить новые свойства этому сниппету.