Uploadify в ModX

В ModX есть полноценный файловый менеджер, который обладает единственным минусом – неудобной загрузкой файлов.

Это становиться настоящей проблемой если создаваемый сайт предполагает необходимость загружать сразу много файлов.

Эту проблему и буду лечить прикрутив Uploadify, для тех кто не знает, это плагин для jQuery, позволяющий загружать сразу много файлов, используется в Wordpress по умолчанию.

Для начала необходимо скачать сам Uploadify.

Далее создадим папку /assets/modules/uploadify куда и сложим скачанный плагин.

Теперь необходимо найти где в ModX спрятан файловый менеджер и заменить его форму загрузки файлов нашим плагином.

Все что касается файлового менеджера ModX, лежит в файле /manager/actions/files.dynamic.php.

В нем в районе 520-й строки объявляется форма загрузки файлов, которую мы в первую очередь прячем, добавляя стиль display:none.

<form enctype="multipart/form-data" action="index.php?a=31" method="post" style="display:none"></form>

Далее перед этой формой вставляем следующий код:

<link href="<?php echo $modx->config['base_url']?>assets/modules/uploadify/jquery.uploadify-v2.1.0/uploadify.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="<?php echo $modx->config['base_url']?>assets/modules/uploadify/jquery.uploadify-v2.1.0/swfobject.js"></script>
<script type="text/javascript" src="<?php echo $modx->config['base_url']?>assets/js/jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="<?php echo $modx->config['base_url']?>assets/modules/uploadify/jquery.uploadify-v2.1.0/jquery.uploadify.v2.1.0.min.js"></script>
<script type="text/javascript">
var fileCount = 0;
$(document).ready(function() {
    $("#uploadify").uploadify({
        'uploader'       : '<?php echo $modx->config['base_url']?>assets/modules/uploadify/jquery.uploadify-v2.1.0/uploadify.swf',
        'script'         : '<?php echo $modx->config['base_url']?>assets/modules/uploadify/uploadify.php',
        'cancelImg'      : '<?php echo $modx->config['base_url']?>assets/modules/uploadify/jquery.uploadify-v2.1.0/cancel.png',
        'folder'         : '<?php echo $modx->config['base_url']?><?php echo substr($startpath, $len, strlen($startpath))=='' ? '/' : substr($startpath, $len, strlen($startpath))?>',
        'queueID'        : 'fileQueue',
        'auto'           : true,
        'multi'          : true,
                'onSelectOnce'   : function(e, data) { fileCount = data.fileCount; },
                'onAllComplete'  : function(e, data) { if(data.filesUploaded == fileCount) setTimeout('location=location',500); }
    });
});
</script>
<div id="fileQueue"></div><input type="file" name="uploadify" id="uploadify" />

Собственно это стандартное включение плагина Uplodify на страницу, не напутайте с путями к файлам Uploadify.

Есть один момент, который стоит оговорить отдельно, дело в том что файловый менеджер ModX аж никак не Ajax’ый, поэтому мы вешаем простенький код на событие onAllComplete, которое просто перезагружает страницу, чтобы показать пользователю загруженные файлы.

Осталось реализовать обработку пересылаемых файлов, для этого был создан файл /assetss/modules/uploadify/uploadify.php с следующим кодом:

<?php
if (!empty($_FILES)) {
    $tempFile = $_FILES['Filedata']['tmp_name'];
    $targetPath = $_SERVER['DOCUMENT_ROOT'] . $_REQUEST['folder'] . '/';
    $targetFile =  str_replace('//','/',$targetPath) . $_FILES['Filedata']['name'];

    $i = 1;
    while(file_exists($targetFile)) {
        $targetFile = str_replace('//','/',$targetPath) . $i++ . '-' . $_FILES['Filedata']['name'];
    }

    if(move_uploaded_file($tempFile,$targetFile)) {
        echo "1";
        @chmod($targetFile, 0777);
    }
    else {
        echo "Error moving file " . $tempFile . ' to ' . $targetFile;
    }
}

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