View file mc-master/modules/lib/controllers/lib_admin.php

File size: 16.52Kb
<?php

/**
 * MobileCMS
 *
 * Open source content management system for mobile sites
 *
 * @author MobileCMS Team <[email protected]>
 * @copyright Copyright (c) 2011-2019, MobileCMS Team
 * @link https://mobilecms.pro Official site
 * @license MIT license
 */


/**
 * Контроллер управления библиотекой
 */
class Lib_Admin_Controller extends Controller
{

    /**
     * Уровень пользовательского доступа
     */
    public $access_level = 8;

    /**
     * Тема
     */
    public $template_theme = 'admin';

    /**
     * Construct
     */
    public function __construct()
    {
        parent::__construct();

        # Хелпер библиотеки
        a_import('modules/lib/helpers/lib');
    }

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

    /**
     * Загрузка книг
     */
    public function action_add_books()
    {
        # Получем данные о папке для загрузки
        if (empty($_GET['directory_id']) OR ! is_numeric($_GET['directory_id']))
            $directory_id = 0;
        else
            $directory_id = intval($_GET['directory_id']);

        if ($directory_id != 0 && !$directory = $this->db->get_row("SELECT * FROM #__lib_directories WHERE directory_id = '" . $directory_id . "'")) {
            a_error('Папка для загрузки не найдена!');
        }

        # Определяем как загружать
        switch ($_GET['type']) {
            case 'textes':
                $type = 'textes';
                break;
            case 'import':
                $type = 'import';
                break;
            case 'upload':
            default:
                $type = 'upload';
                break;
        }

        if (isset($_POST['submit'])) {
            main::is_demo();
            if (!$this->error) {
                # Определяем путь для загрузки
                $directory_path = lib::get_path($directory_id, $this->db);
                $realpath = lib::get_realpath($directory_path);
                $path_to_file = ($realpath != '' ? $realpath . '/' : '') . ($directory_id == 0 ? '' : $directory_id . '/');

                $c = 0;
                for ($i = 1; $i <= 10; $i++) {
                    if (!empty($_POST['name_' . $i])) {
                        # Добавляем файл в базу
                        $this->db->query("INSERT INTO #__lib_books SET
	    					directory_id = '$directory_id',
	    					name = '" . a_safe($_POST['name_' . $i]) . "',
	    					path_to_file = '/" . $path_to_file . "',
	    					time = UNIX_TIMESTAMP()
						");

                        $book_id = $this->db->insert_id();

                        switch ($type) {
                            # Загрузка из текста
                            case 'textes':
                                if (!empty($_POST['text_' . $i])) {
                                    file_put_contents(ROOT . 'files/lib/' . $path_to_file . $book_id . '.txt', $_POST['text_' . $i]);
                                    $c++;
                                }
                                break;
                            # Импорт
                            case 'import':
                                if (!empty($_POST['link_' . $i])) {
                                    copy($_POST['link_' . $i], ROOT . 'files/lib/' . $path_to_file . $book_id . '.txt');
                                    $c++;
                                }
                                break;
                            # Upload
                            case 'upload':
                            default:
                                if (!empty($_FILES['file_' . $i]['tmp_name'])) {
                                    copy($_FILES['file_' . $i]['tmp_name'], ROOT . 'files/lib/' . $path_to_file . $book_id . '.txt');
                                    $c++;
                                }
                                break;
                        }
                    }
                }

                a_notice('Загружено книг: ' . $c, a_url('lib/admin/list_books', 'directory_id=' . $directory_id));
            }
        }
        if (!isset($_POST['submit']) OR $this->error) {
            $this->tpl->assign(array(
                'error' => $this->error,
                'type' => $type
            ));

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

    /**
     * Список книг и папок
     */
    public function action_list_books()
    {
        $this->per_page = 20;

        if (empty($_GET['directory_id']) OR ! is_numeric($_GET['directory_id']))
            $directory_id = 0;
        else
            $directory_id = intval($_GET['directory_id']);

        if ($directory_id != 0 && !$directory = $this->db->get_row("SELECT * FROM #__lib_directories WHERE directory_id = '$directory_id'")) {
            a_error('Папка не найдена!');
        } else {
            # Определяем папка с файлами или папками
            if ($this->db->get_one("SELECT directory_id FROM #__lib_directories WHERE parent_id = $directory_id")) {
                $files_directory = FALSE;
                $this->per_page = 100;
            } else {
                $files_directory = TRUE;
            }
        }

        $directory_path = lib::get_path($directory_id, $this->db);
        $namepath = lib::get_namepath($directory_path, '/', TRUE);

        # Получаем список папок и файлов
        $sql = "SELECT SQL_CALC_FOUND_ROWS
        			directory_id AS book_id,
        			name,
        			(SELECT 'directory') AS type,
        			(SELECT 0) AS description,
                    position
        			FROM #__lib_directories WHERE parent_id = '$directory_id' " . PHP_EOL;
        $sql .= "UNION ALL " . PHP_EOL;
        $sql .= "SELECT
        			book_id,
        			name,
        			(SELECT 'book') AS type,
        			description,
                    (SELECT 0) AS position
        			FROM #__lib_books WHERE directory_id = '$directory_id' " . PHP_EOL;

        $sql .= "ORDER BY type DESC, position ASC, book_id DESC LIMIT $this->start, $this->per_page";

        $result = $this->db->query($sql);
        $total = $this->db->get_one("SELECT FOUND_ROWS()");

        $min_p = $this->db->get_one("SELECT MIN(position) FROM #__lib_directories WHERE parent_id = '$directory_id'");
        $max_p = $this->db->get_one("SELECT MAX(position) FROM #__lib_directories WHERE parent_id = '$directory_id'");

        $books = array();
        while ($book = $this->db->fetch_array($result)) {
            if ($book['type'] == 'directory') {
                if ($book['position'] != $min_p)
                    $book['up'] = '<a href="' . a_url('lib/admin/directory_up', 'directory_id=' . $book['book_id']) . '">up</a>';
                else
                    $book['up'] = 'up';

                if ($book['position'] != $max_p)
                    $book['down'] = '<a href="' . a_url('lib/admin/directory_down', 'directory_id=' . $book['book_id']) . '">down</a>';
                else
                    $book['down'] = 'down';
            } else {
                $book['up'] = '-';
                $book['down'] = '-';
            }

            $books[] = $book;
        }

        # Пагинация
        $pg_conf['base_url'] = a_url('lib/admin/list_books', 'directory_id=' . intval($_GET['directory_id']) . '&amp;start=');
        $pg_conf['total_rows'] = $total;
        $pg_conf['per_page'] = $this->per_page;

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

        $this->tpl->assign(array(
            'books' => $books,
            'total' => $total,
            'namepath' => $namepath,
            'pagination' => $pg->create_links(),
            'directory' => $directory
        ));

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

    /**
     * Создание / редактирование папки
     */
    public function action_directory_edit()
    {
        if (is_numeric($_GET['directory_id'])) {
            $directory_id = intval($_GET['directory_id']);
            if (!$directory = $this->db->get_row("SELECT * FROM #__lib_directories WHERE directory_id = '$directory_id'")) {
                a_error('Папка не найдена!');
            }
            $parent_directory = $this->db->get_row("SELECT * FROM #__lib_directories WHERE directory_id = '" . $directory['parent_id'] . "'");
            $action = 'edit';
        } else {
            if ($_GET['parent_id'] != '' && !$parent_directory = $this->db->get_row("SELECT * FROM #__lib_directories WHERE directory_id = '" . intval($_GET['parent_id']) . "'"))
                a_error('Папка предок не найдена!');
            $directory = array();
            $action = 'add';
        }

        if (isset($_POST['submit'])) {
            main::is_demo();
            if (empty($_POST['name'])) {
                $this->error .= 'Укажите название папки!<br />';
            }

            if (!$this->error) {
                # Создаем нувую папку
                if ($action == 'add') {
                    # Получаем позицию папки
                    $position = $this->db->get_one("SELECT MAX(position) FROM #__lib_directories WHERE parent_id = '" . $parent_directory['directory_id'] . "'") + 1;

                    $this->db->query("INSERT INTO #__lib_directories SET
	           			name = '" . a_safe($_POST['name']) . "',
	           			parent_id = '" . @$parent_directory['directory_id'] . "',
	           			position = '$position'
           			");

                    $directory_id = $this->db->insert_id();

                    # Создаем папку в файловой системе
                    # Получаем директорию для папки
                    $directory_path = lib::get_path($directory_id, $this->db);
                    $realpath = lib::get_realpath($directory_path);

                    mkdir(ROOT . 'files/lib/' . $realpath . '/' . $directory_id);
                    chmod(ROOT . 'files/lib/' . $realpath . '/' . $directory_id, 0777);

                    a_notice('Папка успешно создана!', a_url('lib/admin/list_books', 'directory_id=' . $parent_directory['directory_id']));
                } elseif ($action == 'edit') {
                    # Изменяем имя папки
                    $this->db->query("UPDATE #__lib_directories SET
	           			name = '" . a_safe($_POST['name']) . "'
	           			WHERE
	           			directory_id = '" . $directory_id . "'
	           		");

                    a_notice('Папка успешно изменена!', a_url('lib/admin/list_books', 'directory_id=' . $parent_directory['directory_id']));
                }
            }
        }
        if (!isset($_POST['submit']) || $this->error) {
            $this->tpl->assign(array(
                'error' => $this->error,
                'directory' => $directory,
                'action' => $action
            ));
            $this->tpl->display('directory_edit');
        }
    }

    /**
     * Увеличение позиции папки
     */
    public function action_directory_up()
    {
        main::is_demo();
        if (!$directory = $this->db->get_row("SELECT * FROM #__lib_directories WHERE directory_id = " . intval($_GET['directory_id'])))
            a_error('Папка не найдена!');

        # Меняем позиции
        $this->db->query("UPDATE #__lib_directories SET position = " . $directory['position'] . " WHERE parent_id = '" . $directory['parent_id'] . "' AND position = " . ($directory['position'] - 1));
        $this->db->query("UPDATE #__lib_directories SET position = " . ($directory['position'] - 1) . " WHERE directory_id = " . intval($_GET['directory_id']));

        header("Location: " . a_url('lib/admin', 'directory_id=' . $directory['parent_id'], TRUE));
        exit;
    }

    /**
     * Уменьшение позиции папки
     */
    public function action_directory_down()
    {
        main::is_demo();
        if (!$directory = $this->db->get_row("SELECT * FROM #__lib_directories WHERE directory_id = " . intval($_GET['directory_id'])))
            a_error('Папка не найдена!');

        # Меняем позиции
        $this->db->query("UPDATE #__lib_directories SET position = " . $directory['position'] . " WHERE parent_id = '" . $directory['parent_id'] . "' AND position = " . ($directory['position'] + 1));
        $this->db->query("UPDATE #__lib_directories SET position = " . ($directory['position'] + 1) . " WHERE directory_id = " . intval($_GET['directory_id']));

        header("Location: " . a_url('lib/admin', 'directory_id=' . $directory['parent_id'], TRUE));
        exit;
    }

    /**
     * Удаление книги
     */
    public function action_book_delete()
    {
        main::is_demo();
        if (!$book = $this->db->get_row("SELECT * FROM #__lib_books WHERE book_id = '" . intval($_GET['book_id']) . "'"))
            a_error("Книга не найдена!");

        # Удаляем книгу из ФС
        unlink(ROOT . 'files/lib' . $book['path_to_file'] . $book['book_id'] . '.txt');

        # Удаляем книгу из БД
        $this->db->query("DELETE FROM #__lib_books WHERE book_id = '" . $book['book_id'] . "'");

        a_notice('Книга удалена!', a_url('lib/admin/list_books', 'directory_id=' . $book['directory_id']));
    }

    /**
     * Удаление папки
     */
    public function action_directory_delete()
    {
        main::is_demo();
        $directory_id = intval($_GET['directory_id']);

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

        if ($this->db->get_one("SELECT directory_id FROM #__lib_directories WHERE parent_id = '$directory_id'") OR
                $this->db->get_one("SELECT book_id FROM #__lib_books WHERE directory_id = '$directory_id'")) {
            a_error('Папку не возможно удалить, так как она не пуста!');
        }

        # Удаление из ФС
        $directory_path = lib::get_path($directory_id, $this->db);
        $realpath = lib::get_realpath($directory_path);
        rmdir(ROOT . 'files/lib/' . $realpath . '/' . $directory_id);

        # Удаление папки из базы
        $this->db->query("DELETE FROM #__lib_directories WHERE directory_id = '$directory_id'");

        # Меняем позиции
        $this->db->query("UPDATE #__lib_directories SET position = position - 1 WHERE parent_id = '" . $directory['parent_id'] . "' AND position > '" . $directory['position'] . "'");

        a_notice('Папка успешно удалена!', a_url('lib/admin/list_books', 'directory_id=' . $directory['parent_id']));
    }

    /**
     * Удаление всех файлов в папке
     */
    public function action_directory_clear()
    {
        main::is_demo();
        $directory_id = empty($_GET['directory_id']) ? 0 : intval($_GET['directory_id']);

        # Получаем информацию о папке
        if ($directory_id !== 0 && !$this->db->get_one("SELECT directory_id FROM #__lib_directories WHERE directory_id = '" . intval($directory_id) . "'")) {
            a_error('Папка не найдена!');
        }

        # Удаляем файлы из ФС
        $result = $this->db->query("SELECT * FROM #__lib_books WHERE directory_id = '$directory_id'");
        while ($book = $this->db->fetch_array($result)) {
            # Удаляем книгу из ФС
            unlink(ROOT . 'files/lib' . $book['path_to_file'] . $book['book_id'] . '.txt');
            # Удаляем книгу из БД
            $this->db->query("DELETE FROM #__lib_books WHERE book_id = '" . $book['book_id'] . "'");
        }

        a_notice('Папка успешно очищена', a_url('lib/admin/list_books', 'directory_id=' . $directory_id));
    }

}

?>