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

File size: 10.83Kb
<?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_Controller extends Controller
{

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

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

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

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

    /**
     * Чтение книги
     */
    public function action_read_book()
    {
        $this->per_page = 300;

        # Обновляем количество просмотров
        if ($this->start == 0)
            $this->db->query("UPDATE #__lib_books SET `reads` = `reads` + 1 WHERE book_id = '" . intval($_GET['book_id']) . "'");

        if (!$book = $this->db->get_row("SELECT b.*, d.name AS directory_name,
			(SELECT COUNT(*) FROM #__comments_posts WHERE module = 'lib' AND item_id = b.book_id) AS comments
			FROM #__lib_books AS b LEFT JOIN #__lib_directories AS d USING(directory_id) WHERE b.book_id = '" . intval($_GET['book_id']) . "'"))
            a_error("Книга не найдена!");

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

        # Получаем навигацию
        $navigation = '<a href="' . a_url('lib') . '">Библиотека</a> ';
        if (!empty($namepath))
            $navigation .= '» ' . $namepath;
        if ($book['directory_id'] > 0)
            $navigation .= '» <a href="' . a_url('lib/list_books', 'directory_id=' . $book['directory_id']) . '">' . $book['directory_name'] . '</a>';

        # Получаем контент и делаем разбивку по страницам
        $text = file_get_contents(ROOT . 'files/lib' . $book['path_to_file'] . $book['book_id'] . '.txt');
        $ex = explode(' ', $text);
        $total = count($ex);
        $text_page = '';
        for ($i = $this->start; $i < $this->start + $this->per_page && $i <= $total; $i++) {
            $text_page .= $ex[$i] . ' ';
        }
        $text_page = htmlspecialchars(stripslashes($text_page));
        $text_page = nl2br($text_page);
        $text_page = main::bbcode($text_page);

        # Пагинация
        $pg_conf['base_url'] = a_url('lib/read_book', 'book_id=' . $book['book_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(
            'book' => $book,
            'text_page' => $text_page,
            'navigation' => $navigation,
            'pagination' => $pg->create_links()
        ));

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

    /**
     * Скачать книгу
     */
    public function action_download_book()
    {
        $this->per_page = 7;

        if (!$book = $this->db->get_row("SELECT b.* FROM #__lib_books AS b WHERE b.book_id = '" . intval($_GET['book_id']) . "'")) {
            a_error("Книга не найдена!");
        }

        $file_path = ROOT . 'files/lib' . $book['path_to_file'];
        $jar_path = ROOT . 'modules/lib/jar_data';

        # Подключаем библиотеки для работы с архивами
        a_import('libraries/pclzip.lib');

        switch ($_GET['type']) {
            case 'jar':
                $filename = main::detranslite($book['name']) . '.jar';
                $mime = 'application/java-archive';
                $tmp_dir = ROOT . 'tmp/' . main::get_unique_code(32);

                # Копируем основные файлы книги
                lib::r_copy($jar_path, $tmp_dir);

                #Правим манифест
                $manifest = file_get_contents($jar_path . '/META-INF/MANIFEST.MF');
                $manifest = str_replace('{NAME}', main::detranslite($book['name']), $manifest);
                file_put_contents($tmp_dir . '/META-INF/MANIFEST.MF', $manifest);

                # Добавляем книгу
                $book = file_get_contents($file_path . $book['book_id'] . '.txt');
                file_put_contents($tmp_dir . '/textfile.txt', main::wtext($book));

                # Создаем архив
                $archive = new PclZip($tmp_dir . '/tmp.jar');

                # Добавляем основные файлы книги
                $list = $archive->create($tmp_dir, PCLZIP_OPT_REMOVE_PATH, $tmp_dir);
                $content = file_get_contents($tmp_dir . '/tmp.jar');
                main::delete_dir($tmp_dir);
                break;
            case 'zip':
                $filename = main::detranslite($book['name']) . '.zip';
                $mime = 'application/zip';
                $tmp_name = ROOT . 'tmp/' . main::get_unique_code(32);
                $archive = new PclZip($tmp_name);
                $list = $archive->create($file_path . $book['book_id'] . '.txt',
                        PCLZIP_OPT_REMOVE_PATH, $file_path);
                $content = file_get_contents($tmp_name);
                unlink($tmp_name);
                break;
            case 'txt':
            default:
                $filename = main::detranslite($book['name']) . '.txt';
                $mime = 'text/plain';
                $content = file_get_contents($file_path . $book['book_id'] . '.txt');
                break;
        }

        header('Content-Type: ' . $mime);
        header('Content-Disposition: attachment; filename=' . $filename);
        header("Content-Transfer-Encoding: binary");
        header('Expires: 0');
        header('Pragma: no-cache');
        header("Content-Length: " . strlen($content));

        echo $content;
    }

    /**
     * Список книг и папок
     */
    public function action_list_books()
    {
        switch ($_GET['type']) {
            # Самые популярные
            case 'top':
                $sql = "SELECT *, (SELECT 'book') AS type FROM #__lib_books ORDER BY `reads` DESC LIMIT $this->start, $this->per_page";
                $navigation = '<a href="' . a_url('lib') . '">Библиотека</a>';
                $type = 'top';
                break;

            # Поиск
            case 'search':
                $sql = "SELECT *, (SELECT 'book') AS type FROM #__lib_books WHERE name LIKE '%" . a_safe($_GET['search_word']) . "%' ORDER BY `reads` DESC LIMIT $this->start, $this->per_page";
                $navigation = '<a href="' . a_url('lib') . '">Библиотека</a>';
                $type = 'search';
                break;

            # Обычный листинг
            default:
                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);

                # Получаем навигацию
                if ($directory_id > 0) {
                    $navigation = '<a href="' . a_url('lib') . '">Библиотека</a> ';
                    if (!empty($namepath))
                        $navigation .= '» ' . $namepath;
                    if ($directory['directory_id'] > 0)
                        $navigation .= '» <a href="' . a_url('lib/list_books', 'directory_id=' . $directory['directory_id']) . '">' . $directory['name'] . '</a>';
                }

                # Получаем список папок и файлов
                $sql = "SELECT SQL_CALC_FOUND_ROWS
		        			directory_id AS book_id,
		        			name,
		        			(SELECT 'directory') AS type,
		        			(SELECT 0) AS description,
						position,
						(SELECT 0) AS `reads`,
						(SELECT 0) AS time,
						(SELECT COUNT(*) FROM #__lib_books AS lb WHERE lb.path_to_file LIKE CONCAT('%/', ld.directory_id, '/%')) AS count_books,
						(SELECT COUNT(*) FROM #__lib_books AS lb WHERE lb.path_to_file LIKE CONCAT('%/', ld.directory_id, '/%') AND time > UNIX_TIMESTAMP() - 86400) AS new_books
		        			FROM #__lib_directories AS ld 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,
						`reads`,
						time,
						(SELECT 0) AS count_books,
						(SELECT 0) AS new_books
		        			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";

                $type = 'default_listing';
                break;
        }

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

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

        # Пагинация
        $pg_conf['base_url'] = a_url('lib/list_books', 'type=' . $_GET['type'] . '&amp;search_word=' . $_GET['search_word'] . '&amp;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,
            'type' => $type,
            'navigation' => $navigation,
            'pagination' => $pg->create_links(),
            'directory' => $directory
        ));

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

}

?>