View file modules/lib/controllers/lib_admin.php

File size: 14.68Kb
<?php
/**
 * Ant0ha's project
 *
 * @package
 * @author Anton Pisarenko <[email protected]>
 * @copyright Copyright (c) 2006 - 2010, Anton Pisarenko
 * @license http://ant0ha.ru/license.txt
 * @link http://ant0ha.ru
 */

defined('IN_SYSTEM') or die('<b>403<br />Запрет доступа!</b>');

//---------------------------------------------

/**
 * Контроллер управления библиотекой
 */
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));
	}
}
?>