Вход Регистрация
Файл: mc-2.7.0/modules/downloads/controllers/downloads.php
Строк: 573
<?php

/**
 * MobileCMS
 *
 * Open source content management system for mobile sites
 *
 * @author MobileCMS Team <support@mobilecms.pro>
 * @copyright Copyright (c) 2011-2019, MobileCMS Team
 * @link https://mobilecms.pro Official site
 * @license MIT license
 */
// Папка с файлами загрузок
define('DOWNLOADS_DIRECTORY''files/downloads/');
// Максимальный размер файла для скачивания через force_download
define('FORCE_DOWNLOAD_MAX_FILESIZE'0);

/**
 * Контроллер пользовательской части загруз-центра
 */
class Downloads_Controller extends Controller {

    
/**
     * Construct
     */
    
public function __construct() {
        
parent::__construct();
        if (isset(
$_GET['preview'])) {
            if (
$_GET['preview'] == || $_GET['preview'] == 20 || $_GET['preview'] == 60 || $_GET['preview'] == 100)
                
$_SESSION['downloads_preview'] = $_GET['preview'];
        }
        if (isset(
$_GET['order_by'])) {
            if (
$_GET['order_by'] == 'name' || $_GET['order_by'] == 'time' || $_GET['order_by'] == 'downloads')
                
$_SESSION['order_by'] = $_GET['order_by'];
        }
        
# Хелпер загрузок
        
a_import('modules/downloads/helpers/downloads');
    }

    
/**
     * Метод по умолчанию
     */
    
public function action_index() {
        
$this->action_list_files();
    }

    
/**
     * Выбор превьюшек
     */
    
public function change_previews() {
        
$this->tpl->display('preview');
        exit;
    }

    
/**
     * Листинг файлов
     */
    
public function action_list_files() {
        if (!isset(
$_SESSION['downloads_preview']))
            
$_SESSION['downloads_preview'] = 60;

        if (empty(
$_GET['directory_id']) OR ! is_numeric($_GET['directory_id'])) {
            
$directory_id 0;
        } else {
            
$directory_id intval($_GET['directory_id']);
            if (!
$directory $this->db->get_row("SELECT * FROM #__downloads_directories WHERE directory_id = '$directory_id'")) {
                
a_error('Папка не найдена!');
            }
        }

        switch (
$_GET['action']) {
            
# Поиск файлов
            
case 'search':
                
$action 'search';
                
$title 'Результаты поиска';
                
$sql "SELECT SQL_CALC_FOUND_ROWS
                        file_id,
                        name,
                        'file' AS type,
                        file_ext,
                        0 AS count_files,
                        0 AS new_day,
                        real_name,
                        filesize,
                        time,
                        path_to_file,
                        downloads,
                        screen1,
                        about,
                        previews,
                        (SELECT 0) AS position
                        FROM #__downloads_files
                        WHERE status = 'active' AND
                        name LIKE '%" 
a_safe($_GET['search_word']) . "%' ";

                if (
$directory_id != 0)
                    
$sql .= " AND path_to_file LIKE '%/" $directory_id "/%' ";
                if (empty(
$_GET['search_word']))
                    
$sql .= " AND 1 = 0 ";

                
$sql .= " LIMIT $this->start$this->per_page";
                break;

            
# Список новых файлов
            
case 'new_files':
                
$action 'new_files';
                
$title 'Новые файлы';
                
$sql "SELECT SQL_CALC_FOUND_ROWS
                        file_id,
                        name,
                        'file' AS type,
                        file_ext,
                        0 AS count_files,
                        0 AS new_day,
                        real_name,
                        filesize,
                        time,
                        path_to_file,
                        downloads,
                        screen1,
                        about,
                        previews,
                        (SELECT 0) AS position
                        FROM #__downloads_files
                        WHERE status = 'active' AND 1 = 1 "
;

                if (
$directory_id != 0)
                    
$sql .= " AND path_to_file LIKE '%/" $directory_id "/%' ";

                
$sql .= " ORDER BY time DESC ";
                
$sql .= " LIMIT $this->start$this->per_page";
                break;

            
# Список папок и файлов
            
default:
                
$action 'list';
                
$title 'Загрузки' . (!empty($directory['name']) ? ' | ' $directory['name'] : '');
                
# Определяем папка с файлами или папками
                
if ($this->db->get_one("SELECT file_id FROM #__downloads_files WHERE directory_id = $directory_id AND real_name != ''")) {
                    
$is_files_directory true;
                    
$this->per_page $this->config['downloads']['files_per_page'];
                } else {
                    
$is_files_directory false;
                    
$this->per_page $this->config['downloads']['directories_per_page'];
                }

                
$this->tpl->assign('is_files_directory'$is_files_directory);

                if (
$directory['images'] == 'yes' && !isset($_GET['preview']) && !isset($_GET['start'])) {
                    
$this->change_previews();
                }

                
$directory_path downloads::get_path($directory_id$this->db);
                
$namepath downloads::get_namepath($directory_path' » ');


                
# Получаем список папок и файлов
                
$sql "SELECT SQL_CALC_FOUND_ROWS
                        dd.directory_id AS file_id,
                        dd.name,
                        'directory' AS type,
                        'directory' AS file_ext,
                        0 AS real_name,
                        0 AS filesize,
                        0 AS time,
                        0 AS path_to_file,
                        0 AS downloads,
                        0 AS screen1,
                        0 AS about,
                        0 AS previews,
                        dd.position
                        FROM #__downloads_directories AS dd
                        WHERE dd.parent_id = '
$directory_id'" PHP_EOL;
                
$sql .= "UNION ALL" PHP_EOL;
                
$sql .= "SELECT
                        file_id,
                        name,
                        'file' AS type,
                        file_ext,
                        real_name,
                        filesize,
                        time,
                        path_to_file,
                        downloads,
                        screen1,
                        about,
                        previews,
                        (SELECT 0) AS position
                        FROM #__downloads_files
                        WHERE
                        directory_id = '
$directory_id' AND
                        status = 'active' AND
                        real_name != ''" 
PHP_EOL;

                
$sql .= "ORDER BY type ASC, ";

                
# Сортировка
                
if ($is_files_directory) {
                    switch (
$_SESSION['order_by']) {
                        case 
'name':
                            
$sql .= "name ASC ";
                            break;
                        case 
'downloads':
                            
$sql .= "downloads DESC ";
                            break;
                        default:
                            
$sql .= "time DESC ";
                            break;
                    }
                } else {
                    
$sql .= "position ASC ";
                }

                
$sql .= " LIMIT $this->start$this->per_page";
                break;
        }

        
# Работаем с кешем
        
if ($action == 'list' && !$is_files_directory && $this->config['downloads']['cache_time'] > 0) {
            
$using_cache true;

            
$cache_key 'downloads_' $directory_id '_' $this->start;
            
$files $this->cache->get($cache_key$this->config['downloads']['cache_time'] * 60);
        }

        if (empty(
$files)) {
            
$result $this->db->query($sql);
            
$total $this->db->get_one("SELECT FOUND_ROWS()");

            
$files = array();
            while (
$file $this->db->fetch_array($result)) {
                
# Получаем счетчики файлов в папках
                
if ($file['type'] == 'directory') {
                    
$counts $this->db->get_row("SELECT
                        COUNT(CASE WHEN status = 'active' THEN 1 END) AS count_files,
                        COUNT(CASE WHEN time > UNIX_TIMESTAMP( ) - 86400 THEN 1 END) AS new_day
                        FROM #__downloads_files
                        WHERE path_to_file LIKE '%/" 
$file['file_id'] . "/%'
                    "
);

                    
$file['count_files'] = $counts['count_files'];
                    
$file['new_day'] = $counts['new_day'];
                }

                
$files[] = $file;
            }

            
$files['total'] = $total;

            if (
$using_cache)
                
$this->cache->set($cache_key$files);
        }

        
# Пагинация
        
$http_query http_build_query(array(
            
'directory_id' => $_GET['directory_id'],
            
'action' => $_GET['action'],
            
'search_word' => $_GET['search_word']
                ), 
'''&amp;');

        
$pg_conf['base_url'] = $_GET['directory_id'] == a_url('downloads/list_files'$http_query '&amp;start='true) : a_url('downloads/list_files'$http_query '&amp;start=');
        
$pg_conf['total_rows'] = $files['total'];
        
$pg_conf['per_page'] = $this->per_page;

        
a_import('libraries/pagination');
        
$pg = new CI_Pagination($pg_conf);

        
# Удаляем лишние данные
        
unset($files['total']);

        
$this->tpl->assign(array(
            
'files' => $files,
            
'total' => $total,
            
'action' => $action,
            
'title' => $title,
            
'navigation' => $namepath,
            
'pagination' => $pg->create_links(),
            
'directory' => $directory,
            
'_config' => $this->config['downloads'],
        ));

        
$this->tpl->display('list_files');
    }

    
/**
     * Форма поиска
     */
    
public function action_search_form() {
        if (empty(
$_GET['directory_id']) || !is_numeric($_GET['directory_id'])) {
            
$directory_id 0;
        } else {
            
$directory_id intval($_GET['directory_id']);

            if (!
$directory $this->db->get_row("SELECT * FROM #__downloads_directories WHERE directory_id = '$directory_id'"))
                
a_error('Папка не найдена');
        }

        
$directory_path downloads::get_path($directory['directory_id'], $this->db);
        
$navigation downloads::get_namepath($directory_path' &raquo; ');

        if (
$directory['directory_id'] > 0)
            
$navigation .= (!empty($navigation) ? ' &raquo; ' '') . '<a href="' URL 'downloads/' $directory['directory_id'] . '">' $directory['name'] . '</a>';

        if (
$_GET['send']) {
            if (empty(
$_GET['search_word']))
                
$this->error .= 'Укажите запрос<br />';

            if (!
$this->error) {
                
header('Location: ' a_url('downloads/list_files''action=search&directory_id=' . ($directory_id $directory_id '') . '&search_word=' urlencode($_GET['search_word'])));
                exit;
            }
        }

        
$this->tpl->assign(array(
            
'error' => $this->error,
            
'directory' => $directory,
            
'directory_id' => $directory_id,
            
'navigation' => $navigation,
        ));

        
$this->tpl->display('search_form');
    }

    
/**
     * Скачивание файла
     */
    
public function action_download_file() {
        
$file_id intval($_GET['file_id']);

        if (!
$file $this->db->get_row("SELECT * FROM #__downloads_files WHERE file_id = '$file_id'"))
            
a_error('Файл не найден!');

        
# Обновляем количество закачек файла
        
$this->db->query("UPDATE #__downloads_files SET downloads = downloads + 1 WHERE file_id = '$file_id'");

        if (!
file_exists(ROOT $file['path_to_file'] . '/' $file['real_name']))
            
a_error('Файл отсутствует!');

        if (
$file['filesize'] > FORCE_DOWNLOAD_MAX_FILESIZE) {
            
header('location: ' URL $file['path_to_file'] . '/' $file['real_name']);
            exit;
        } else {
            
$file_content file_get_contents(ROOT $file['path_to_file'] . '/' $file['real_name']);
            
downloads::force_download($file['real_name'], $file_content$file_id '_' $CONFIG['downloads_prefix'] . '_'FALSE);
        }
    }

    
/**
     * Получение jad из jar
     */
    
public function action_get_jad() {
        if (!
$file $this->db->get_row("SELECT * FROM #__downloads_files WHERE file_id = '" intval($_GET['file_id']) . "'"))
            
a_error("Файл не найден!");

        if (
is_numeric($_GET['add_file'])) {
            if (!empty(
$file['add_file_real_name_' $_GET['add_file']])) {
                
$jar_name $file['add_file_real_name_' $_GET['add_file']];
                
$file_ext array_pop(explode('.'$jar_name));
            } else
                
a_error("Дополнительный файл не найтен!");
        } else {
            
$jar_name $file['real_name'];
            
$file_ext $file['file_ext'];
        }

        if (
$file_ext != 'jar')
            
a_error("Это не JAR файл!");

        
# Увеличиваем количество скачиваний файла
        
$this->db->query("UPDATE a_downloads_files SET downloads = downloads + 1 WHERE file_id = '" $file['file_id'] . "'");

        if (!
class_exists('PclZip'))
            
a_import('libraries/pclzip.lib');
        
a_import('libraries/j2me_tools');

        
$jar_path ROOT $file['path_to_file'] . '/' $jar_name;
        
$jar_url URL $file['path_to_file'] . '/' $jar_name;
        
$jad_contents j2me_tools::get_jad($jar_path$jar_url);

        
header('Content-type: text/vnd.sun.j2me.app-descriptor;charset=UTF-8');
        echo 
$jad_contents;
    }

    
/**
     * Просмотр деталей файла
     */
    
public function action_view_file() {
        
# Инфо о файле
        
if (!$file $this->db->get_row("SELECT *,
             (SELECT username FROM #__users AS u WHERE u.user_id = df.user_id) AS username,
             (SELECT COUNT(*) FROM #__comments_posts WHERE module = 'downloads' AND item_id = df.file_id) comments
             FROM #__downloads_files AS df WHERE df.file_id = '" 
intval($_GET['file_id']) . "'"))
            
a_error('Файл не найден!');

        
$directory $this->db->get_row("SELECT * FROM #__downloads_directories WHERE directory_id = '" $file['directory_id'] . "'");
        if (
$this->db->get_one("SELECT id FROM a_rating_logs WHERE ip = '" a_safe($_SERVER['REMOTE_ADDR']) . "' AND module = 'downloads' AND item_id = '" $file['file_id'] . "'"))
            
$file['rated'] = true;
        else
            
$file['rated'] = false;

        
# Получаем скриншоты файла
        
$file['screens'] = '';
        if (!empty(
$file['screen1']) && empty($_GET['s']))
            
$file['screens'] .= '<img src="' URL $file['path_to_file'] . '/' $file['screen1'] . '" alt="" /><br />';
        elseif (!empty(
$file['screen2']) && $_GET['s'] == 2)
            
$file['screens'] .= '<img src="' URL $file['path_to_file'] . '/' $file['screen2'] . '" alt="" /><br />';
        elseif (!empty(
$file['screen3']) && $_GET['s'] == 3)
            
$file['screens'] .= '<img src="' URL $file['path_to_file'] . '/' $file['screen3'] . '" alt="" /><br />';

        if (!empty(
$file['screen2'])) {
            
$file['screens'] .= empty($_GET['s']) ? '<b>1</b>' '<a href="' a_url('downloads/view_file''file_id=' $file['file_id']) . '">1</a>';
            
$file['screens'] .= ', ' . (($_GET['s'] == 2) ? '<b>2</b>' '<a href="' a_url('downloads/view_file''file_id=' $file['file_id'] . '&amp;s=2') . '">2</a>');
            if (!empty(
$file['screen3']))
                
$file['screens'] .= ', ' . (($_GET['s'] == 3) ? '<b>3</b>' '<a href="' a_url('downloads/view_file''file_id=' $file['file_id'] . '&amp;s=3') . '">3</a>');
        }

        if (!empty(
$file['screens']))
            
$file['screens'] .= '<br /><br />';

        
$file['about'] = nl2br(main::bbcode($file['about']));
        
$file['rating_stars'] = file_get_contents(URL 'main/rating?rate=' $file['rating']);

        
$directory_path downloads::get_path($file['directory_id'], $this->db);
        
$navigation downloads::get_namepath($directory_path' » ');

        if (
$directory['directory_id'] > 0)
            
$navigation .= (!empty($navigation) ? ' » ' '') . '<a href="' a_url('downloads''directory_id=' $directory['directory_id']) . '">' $directory['name'] . '</a>';

        
$this->tpl->assign(array(
            
'file' => $file,
            
'directory' => $directory,
            
'navigation' => $navigation
        
));

        
$this->tpl->display('view_file');
    }

    
/**
     * Изменение рейтинга файла
     */
    
public function action_rating_change() {
        if (!
$file $this->db->get_row("SELECT file_id, user_id FROM a_downloads_files WHERE file_id = '" intval($_GET['file_id']) . "'"))
            
a_error("Файл не найден!");

        if (
$this->db->get_one("SELECT id FROM a_rating_logs WHERE module = 'downloads' AND ip = '" a_safe($_SERVER['REMOTE_ADDR']) . "' AND item_id = '" $file['file_id'] . "'"))
            
a_error("Вы голосовали за данный файл ранее!");

        if (
$file['user_id'] == USER_ID)
            
a_error("Голосовать за свой файл нельзя!");

        
$est intval($_GET['est']);
        if (
$est != && $est != && $est != && $est != && $est != 5)
            
a_error("Оценка не определена!");

        
# Увеличиваем количество голосов
        
$this->db->query("UPDATE a_downloads_files SET
            rating = (rating * rating_voices + 
$est) / (rating_voices + 1),
            rating_voices = rating_voices + 1
            WHERE file_id = '" 
$file['file_id'] . "'
        "
);

        
# Добавляем голос в логи
        
$this->db->query("INSERT INTO a_rating_logs SET
            module = 'downloads',
            ip = '" 
a_safe($_SERVER['REMOTE_ADDR']) . "',
            item_id = '" 
$file['file_id'] . "',
            time = UNIX_TIMESTAMP()
        "
);

        
a_notice("Оценка принята!"URL 'downloads/view/' $file['file_id']);
    }

    
/**
     * Управление файлами пользователей
     */
    
public function action_user_files() {
        
// Запрет выгрузки гостям
        
if (USER_ID == -1)
            
a_error('Для выгрузки файлов на сайт необходимо <a href="' a_url('user/login') . '">войти</a> или <a href="' a_url('user/registration') . '">зарегистрироваться</a>');

        
// Запрет выгрузки файлов пользователями
        
if ($this->config['downloads']['user_upload'] == 0)
            
a_error('Выгрузка файлов на сайт пользователями запрещена');

        
// Проверка действия
        
if ($_GET['action'] != 'add' && $_GET['action'] != 'edit' && $_GET['action'] != 'delete')
            
a_error('Не выбрано действие');

        
// Проверка директории
        
if ($_GET['action'] == 'add' && !$directory $this->db->get_row("SELECT * FROM #__downloads_directories WHERE directory_id = '" intval($_GET['directory_id']) . "' AND user_files = 'yes'"))
            
a_error('Папка не найдена, либо не предназначена для выгрузки файлов пользователями в нее');

        switch (
$_GET['action']) {
            case 
'add':
                
$action 'add';
                
$title 'Добавление файла';

                
$directory_path downloads::get_path($directory['directory_id'], $this->db);
                
$navigation downloads::get_namepath($directory_path' &raquo; ');

                if (
$directory['directory_id'] > 0)
                    
$navigation .= (!empty($navigation) ? ' &raquo; ' '') . '<a href="' URL 'downloads/' $directory['directory_id'] . '">' $directory['name'] . '</a>';

                
// Обработка формы выгрузки файла
                
if ($_POST['submit']) {
                    
// Фильтрация данных
                    
$name htmlspecialchars(trim($_POST['name']));
                    
$about htmlspecialchars(trim($_POST['about']));

                    
// Массивс информацией о файле
                    
$file = array();

                    
// Проверка корректности данных
                    
if (!empty($name) && main::strlen($name) > 32)
                        
$this->error .= 'Имя файла не должно быть длинее 32 символов<br />';

                    if (!empty(
$about) && main::strlen($about) > 5000)
                        
$this->error .= 'Описание не должно быть длинее 5000 символов<br />';

                    
// Получение информации о файле
                    
if (!empty($_FILES['file_upload']['tmp_name'])) {
                        
$type 'upload';
                        
$file['real_name'] = $_FILES['file_upload']['name'];
                        
$file['file_ext'] = array_pop(explode('.'$file['real_name']));
                        
$file['filesize'] = filesize($_FILES['file_upload']['tmp_name']);
                    } else if (!empty(
$_POST['file_import']) && $_POST['file_import'] != 'http://') {
                        
$type 'import';
                        
$file['real_name'] = basename($_POST['file_import']);
                        
$file['file_ext'] = array_pop(explode('.'$file['real_name']));
                        
$file['filesize'] = downloads::get_filesize($_POST['file_import']);
                    } else {
                        
$this->error 'Укажите загружаемый файл<br />';
                    }

                    
// Проверка типа файла
                    
if (!strstr(';' $this->config['downloads']['allowed_filetypes'] . ';'';' $file['file_ext'] . ';') && $type) {
                        
$this->error .= 'Вы пытаетесь загрузить запрещенный тип файла<br />';
                    }

                    
// Проверка размера файла
                    
if (($file['filesize'] > $this->config['downloads']['max_filesize'] * 1048576) || $file['filesize'] === FALSE) {
                        
$this->error .= 'Размер загружаемого файла превышает допустимый размер (' $this->config['downloads']['max_filesize'] . ' Mb)<br />';
                    }

                    
// Сохранение файла
                    
if (!$this->error) {
                        
// Получение ID файла
                        
$this->db->query("INSERT INTO #__downloads_files SET file_id = 'NULL'");
                        
$file_id $this->db->insert_id();

                        
$directory_path downloads::get_path($directory['directory_id'], $this->db);
                        
$realpath downloads::get_realpath($directory_path);
                        
$realpath = ($realpath != '' $realpath '/' '') . ($directory['directory_id'] == '' $directory['directory_id'] . '/');

                        
// Создание папки для файла
                        
mkdir(ROOT DOWNLOADS_DIRECTORY $realpath $file_id);
                        
chmod(ROOT DOWNLOADS_DIRECTORY $realpath $file_id0777);

                        
$path_to_file DOWNLOADS_DIRECTORY . ($realpath != '' $realpath '') . $file_id;

                        if (
$type == 'upload') {
                            
$file_path ROOT $path_to_file '/' $_FILES['file_upload']['name'];
                            
copy($_FILES['file_upload']['tmp_name'], $file_path);
                        } else {
                            
$file_path ROOT $path_to_file '/' basename($_POST['file_import']);
                            
copy($_POST['file_import'], $file_path);
                        }

                        
// Работа со скриншотом к основному файлу
                        
if (!empty($_FILES['screen1']['tmp_name'])) {
                            
$screen_path ROOT $path_to_file '/' $_FILES['screen1']['name'];

                            if (
copy($_FILES['screen1']['tmp_name'], $screen_path)) {
                                if (
$this->config['downloads']['screens_width'] > 0) {
                                    
main::image_resize($screen_path$screen_pathintval($this->config['downloads']['screens_width']));
                                }

                                
$file['screen1'] = $_FILES['screen1']['name'];
                            }
                        } else if (!empty(
$_POST['screen1']) && $_POST['screen1'] != 'http://') {
                            
$import_file_path fm::get_real_file_path($_POST['screen_1']);
                            
$import_file_name basename($import_file_path);
                            
$screen_path ROOT $path_to_file '/' $import_file_name;

                            if (
copy($import_file_path$screen_path)) {
                                if (
$this->config['downloads']['screens_width'] > 0) {
                                    
main::image_resize($screen_path$screen_pathintval($this->config['downloads']['screens_width']));
                                }

                                
$file['screen1'] = $import_file_name;
                            }
                        }

                        
$file['name'] = $_POST['name'];
                        
$file['about'] = $_POST['about'];
                        if (
$this->config['downloads']['moderation'] == 1) {
                            
$file['status'] = 'moderate';
                        } else {
                            
$file['status'] = 'active';
                        }
                        
$file['user_id'] = USER_ID;
                        
$file['path_to_file'] = $path_to_file;
                        
$file['directory_id'] = $directory['directory_id'];

                        
// Выполнение действий над определенными типами файлов
                        
$file downloads::filetype_actions($file);

                        
// Изменение файла в базе
                        
downloads::update_file($this->db$file_id$file);

                        
a_notice($this->config['downloads']['moderation'] == 'Файл успешно загружен. Он будет доступен для скачиваниями другими пользователями после прохождения модерации' 'Файл успешно загружен'URL 'downloads/view/' $file_id);
                    }
                }
                break;

            case 
'edit':
                
$action 'edit';
                
$title 'Изменение файла';

                
// Проверка файла
                
if (!$file $this->db->get_row("SELECT * FROM #__downloads_files WHERE file_id = '" intval($_GET['file_id']) . "' AND user_id = '" USER_ID "' AND path_to_file != ''"))
                    
a_error('Файл не найден');

                
$directory $this->db->get_row("SELECT * FROM #__downloads_directories WHERE directory_id = '$file[directory_id]'");

                
$directory_path downloads::get_path($directory['directory_id'], $this->db);
                
$navigation downloads::get_namepath($directory_path' &raquo; ');

                if (
$directory['directory_id'] > 0)
                    
$navigation .= (!empty($navigation) ? ' &raquo; ' '') . '<a href="' URL 'downloads/' $directory['directory_id'] . '">' $directory['name'] . '</a>';

                
// Обработка формы выгрузки файла
                
if ($_POST['submit']) {
                    
// Фильтрация данных
                    
$name htmlspecialchars(trim($_POST['name']));
                    
$about htmlspecialchars(trim($_POST['about']));

                    
// Проверка корректности данных
                    
if (!empty($name) && main::strlen($name) > 32) {
                        
$this->error .= 'Имя файла не должно быть длинее 32 символов<br />';
                    }

                    if (!empty(
$about) && main::strlen($about) > 5000) {
                        
$this->error .= 'Описание не должно быть длинее 5000 символов<br />';
                    }

                    
// Получение информации о файле
                    
if (!empty($_FILES['file_upload']['tmp_name'])) {
                        @
unlink(ROOT $file['path_to_file'] . '/' $file['real_name']);
                        
$type 'upload';
                        
$file['real_name'] = $_FILES['file_upload']['name'];
                        
$file['file_ext'] = array_pop(explode('.'$file['real_name']));
                        
$file['filesize'] = filesize($_FILES['file_upload']['tmp_name']);
                    } else if (!empty(
$_POST['file_import']) && $_POST['file_import'] != 'http://') {
                        @
unlink(ROOT $file['path_to_file'] . '/' $file['real_name']);
                        
$type 'import';
                        
$file['real_name'] = basename($_POST['file_import']);
                        
$file['file_ext'] = array_pop(explode('.'$file['real_name']));
                        
$file['filesize'] = downloads::get_filesize($_POST['file_import']);
                    }

                    
// Проверка типа файла
                    
if (!strstr(';' $this->config['downloads']['allowed_filetypes'] . ';'';' $file['file_ext'] . ';') && $type) {
                        
$this->error .= 'Вы пытаетесь загрузить запрещенный тип файла<br />';
                    }

                    
// Проверка размера файла
                    
if (($file['filesize'] > $this->config['downloads']['max_filesize'] * 1048576) || $file['filesize'] === FALSE) {
                        
$this->error .= 'Размер загружаемого файла превышает допустимый размер (' $this->config['downloads']['max_filesize'] . ' Mb)<br />';
                    }

                    
// Сохранение файла
                    
if (!$this->error) {
                        
// Получение ID файла
                        
$file_id $file['file_id'];

                        
$path_to_file $file['path_to_file'];

                        if (
$type && $type == 'upload') {
                            
$file_path ROOT $path_to_file '/' $_FILES['file_upload']['name'];
                            
copy($_FILES['file_upload']['tmp_name'], $file_path);
                        } elseif (
$type && $type == 'import') {
                            
$file_path ROOT $path_to_file '/' basename($_POST['file_import']);
                            
copy($_POST['file_import'], $file_path);
                        }

                        
// Работа со скриншотом к основному файлу
                        
if (!empty($_FILES['screen1']['tmp_name'])) {
                            @
unlink(ROOT $path_to_file '/' $file['screen1']);

                            
$screen_path ROOT $path_to_file '/' $_FILES['screen1']['name'];

                            if (
copy($_FILES['screen1']['tmp_name'], $screen_path)) {
                                if (
$this->config['downloads']['screens_width'] > 0) {
                                    
main::image_resize($screen_path$screen_pathintval($this->config['downloads']['screens_width']));
                                }

                                
$file['screen1'] = $_FILES['screen1']['name'];
                            }
                        } else if (!empty(
$_POST['screen1']) && $_POST['screen1'] != 'http://') {
                            @
unlink(ROOT $path_to_file '/' $file['screen1']);

                            
$import_file_path fm::get_real_file_path($_POST['screen_1']);
                            
$import_file_name basename($import_file_path);
                            
$screen_path ROOT $path_to_file '/' $import_file_name;

                            if (
copy($import_file_path$screen_path)) {
                                if (
$this->config['downloads']['screens_width'] > 0) {
                                    
main::image_resize($screen_path$screen_pathintval($this->config['downloads']['screens_width']));
                                }

                                
$file['screen1'] = $import_file_name;
                            }
                        }

                        
$file['name'] = $_POST['name'];
                        
$file['about'] = $_POST['about'];
                        if (
$this->config['downloads']['moderation'] == 1) {
                            
$file['status'] = 'moderate';
                        } else {
                            
$file['status'] = 'active';
                        }
                        
$file['user_id'] = USER_ID;
                        
$file['path_to_file'] = $path_to_file;
                        
$file['directory_id'] = $directory['directory_id'];

                        
// Выполнение действий над определенными типами файлов
                        
$file downloads::filetype_actions($file);

                        
// Изменение файла в базе
                        
downloads::update_file($this->db$file_id$file);

                        
a_notice($this->config['downloads']['moderation'] == 'Файл успешно изменен. Он будет доступен для скачиваниями другими пользователями после прохождения модерации' 'Файл успешно загружен'URL 'downloads/view/' $file_id);
                    }
                }
                break;

            case 
'delete':
                
$action 'delete';
                
$title 'Удаление файла';

                
// Проверка файла
                
if (!$file $this->db->get_row("SELECT * FROM #__downloads_files WHERE file_id = '" intval($_GET['file_id']) . "' AND user_id = '" USER_ID "' AND path_to_file != ''"))
                    
a_error('Файл не найден');

                if (!empty(
$_GET['confirm'])) {
                    
// Удаление папки из ФС
                    
main::delete_dir(ROOT $file['path_to_file']);

                    
// Удаление файла из БД
                    
$this->db->query("DELETE FROM #__downloads_files WHERE file_id = '" $file['file_id'] . "'");

                    
a_notice('Файл успешно удален'URL 'downloads/' $file['directory_id']);
                } else {
                    
a_confirm('Вы подтверждаете удаление данного файла?'a_url('downloads/user_files''action=delete&amp;file_id=' $file['file_id'] . '&amp;confirm=ok'), URL 'downloads/view/' $file['file_id']);
                }
                break;
        }

        
$this->tpl->assign(array(
            
'error' => $this->error,
            
'directory' => $directory,
            
'action' => $action,
            
'title' => $title,
            
'file' => $file,
            
'navigation' => $navigation,
        ));

        
$this->tpl->display('user_files');
    }

    
/**
     * Файлы и комментарии пользователя
     */
    
public function action_my() {
        
// Запрет доступа гостям
        
if (USER_ID == -1)
            
a_error('Для доступа к странице необходимо <a href="' a_url('user/login') . '">войти</a> или <a href="' a_url('user/registration') . '">зарегистрироваться</a>');

        
// Проверка действия
        
if ($_GET['action'] != 'files' && $_GET['action'] != 'comments')
            
a_error('Не выбрано действие');

        switch (
$_GET['action']) {
            case 
'files':
                
$action 'files';
                
$title 'Мои файлы';

                
$result $this->db->query("SELECT * FROM #__downloads_files WHERE user_id = '" USER_ID "' ORDER BY time DESC LIMIT $this->start$this->per_page");
                
$total $this->db->get_one("SELECT COUNT(*) FROM #__downloads_files WHERE user_id = '" USER_ID "'");

                
$files = array();
                while (
$file $this->db->fetch_array($result)) {
                    
$files[] = $file;
                }

                
$files['total'] = $total;

                
$pg_conf['base_url'] = a_url('downloads/my''action=files&amp;start=');
                
$pg_conf['total_rows'] = $files['total'];
                
$pg_conf['per_page'] = $this->per_page;

                
a_import('libraries/pagination');
                
$pg = new CI_Pagination($pg_conf);

                
// Удаляем лишние данные
                
unset($files['total']);

                
$this->tpl->assign(array(
                    
'title' => $title,
                    
'action' => $action,
                    
'pagination' => $pg->create_links(),
                    
'total' => $total,
                    
'files' => $files,
                    
'start' => $this->start,
                    
'_config' => $this->config['downloads'],
                ));

                
$this->tpl->display('my_files');
                break;

            case 
'comments':
                break;
        }
    }

}

?>
Онлайн: 4
Реклама