Контактная информация

По всем интересующим вас вопросам связывайтесь при помощи контактной информации приведенной на этой странице!

skype: metsof
email: accusser@gmail.com

В социальных сетях...

Форма обратной связи

Авторизация

Дополнение FileDownload R MODX Revolution для скачивания файлов

Сайдбар

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

Показывает пользовательские свойства плагина

Показывает все триггеры события

Показывает события, примененные к указанному плагину во время выполнения процесса

Теперь можете использовать всю свою фантазию, чтобы добавить новые свойства этому сниппету.