<?php
/**
* MobileCMS
*
* Open source content management system for mobile sites
*
* @author MobileCMS Team <[email protected]>
* @copyright Copyright (c) 2011, MobileCMS Team
* @link http://mobilecms.ru Official site
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*/
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']) .'&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));
}
}
?>