<?php
$access = FALSE;
$do = $do == 'edit' ? 'edit' : 'add';
$max_size = include H . 'engine/includes/max_file_size.php';
Core::get('text.class', 'classes');
if ($id === FALSE)
{
$id = 0;
}
if ($admin)
{
/* Открыть доступ для модераторов и администраторов */
$access = TRUE;
}
if ($id !== 0 && $do == 'add' && $user_id)
{
$cat = $sql->query("SELECT `mod`, `count_arc` FROM `mod_lib` WHERE `id` = " . $id . " AND `type` = 'cat'")->fetch();
if ($cat !== FALSE)
{
if ($cat['mod'] == 1)
{
/* Открыть доступ для пользователей (для добавления статьи) */
$access = TRUE;
}
}
else
{
$error = 'Категория не найдена<br /><a href="index.php">В библиотеку</a>';
}
}
if ($access === TRUE && $user_id && !isset($error))
{
$title = isset($_POST['title']) ? $_POST['title'] : '';
$announce = isset($_POST['announce']) ? $_POST['announce'] : '';
$text = isset($_POST['text']) ? $_POST['text'] : '';
$tags = isset($_POST['tags']) ? $_POST['tags'] : '';
$delfile = searchWord(array_keys($_POST));
$form = '<form action="?act=articles&mod=form&do=' . ($do == 'add' ? 'add' : 'edit') . '&id=' . $id . '" method="post">' .
'<input type="hidden" name="title" value="' . htmlentities($title, ENT_QUOTES, 'UTF-8') . '" />' .
'<input type="hidden" name="announce" value="' . htmlentities($announce, ENT_QUOTES, 'UTF-8') . '" />' .
'<input type="hidden" name="text" value="' . htmlentities($text, ENT_QUOTES, 'UTF-8') . '" />' .
'<input type="hidden" name="tags" value="' . htmlentities($tags, ENT_QUOTES, 'UTF-8') . '" />' .
'<input type="submit" name="continue" value="Продолжить" /></form>';
$error = array();
if ($do == 'edit')
{
/* Получить данные статьи для редактировоания */
$arc = $sql->query("SELECT `name` FROM `mod_lib` WHERE `id` = '" . $id . "' AND `type` = 'arc'")->result();
if ($arc === FALSE)
{
$error[] = 'Статья не найдена<br />' . $form;
}
else
{
$title_old = my_esc($arc['name']);
}
}
if (empty($error))
{
if (!empty($_POST))
{
/* Удаляем файл */
if ($delfile)
{
$delfile = explode('_', $delfile);
$ext = array_pop($delfile);
$preview = FILESDIR . 'attach' . DIRECTORY_SEPARATOR . implode('_', $delfile) . '_preview.png';
$delfile = implode('_', $delfile) . '.' . $ext;
$filename = FILESDIR . 'attach' . DIRECTORY_SEPARATOR . $delfile;
if (!empty($_SESSION['files'][$delfile]))
{
unset($_SESSION['files'][$delfile]);
$_SESSION['libFiles'] -= 1;
}
elseif($sql->query("SELECT COUNT(*) FROM `mod_lib_files` WHERE `aid` = '" . $id . "' AND `name` = '" . my_esc($delfile) . "'")->result() > 0)
{
$sql->query("DELETE FROM `mod_lib_files` WHERE `aid` = '" . $id . "' AND `name` = '" . my_esc($delfile) . "'");
}
if (file_exists($preview))
{
unlink($preview);
}
if (file_exists($filename))
{
unlink($filename);
echo '<div class="err">Файл удален.<br />' . $form . '</div>';
}
else
{
$error[] = 'Файл не существует';
$error[] = $form;
}
}
/* Добавляем файл */
elseif(isset($_POST['addfile']))
{
/* Проверка на максимальное кол-во файлов */
if (!isset($_SESSION['libFiles']))
{
$_SESSION['libFiles'] = 0;
}
else
{
if ($_SESSION['libFiles'] == $libSet['files']['max_number'])
{
$error[] = 'Превышено максимально допустимое количество файлов для статьи.';
}
}
if (empty($error))
{
/* Проверка размера файла */
if ($_FILES['file']['size'] > $max_size)
{
$error[] = 'Размер файла не должен превышать  ' . text::size_data($max_size);
}
$fname = $_FILES['file']['name'];
$ext = pathinfo($fname, PATHINFO_EXTENSION);
if (!in_array($ext, $libSet['files']['extensions']))
{
$error[] = 'К отправке разрешены файлы имеющие одно из следущих расширений  ' . implode(', ', $libSet['files']['extensions']);
}
/* Проверка имени файла */
if (mb_strlen($fname) > 30)
{
$error[] = 'Длина имени файла не должна превышать 30 символов';
}
/*
if (preg_match("/[^\da-z_\-.]+/", $fname))
{
$error[] = 'В имени файла присутствуют недопустимые символы';
}
*/
$fname = FILESDIR . 'attach' . DIRECTORY_SEPARATOR . $fname_ext[0] . '.' . $ext;
/* Проверка файла на существование */
if (file_exists($fname))
{
$fname_ext[0] .= '_' . time();
$fname = FILESDIR . 'attach' . DIRECTORY_SEPARATOR . $fname_ext[0] . '.' . $ext;
}
}
if (empty($error))
{
/* Загружаем файл */
if (copy($_FILES['file']['tmp_name'], $fname) === TRUE)
{
/* Создаем превью для изображения */
if (isImage($_FILES['file']['type']) && extension_loaded('gd'))
{
$imageSize = getimagesize($fname);
$types = array(1 => 'gif', 2=> 'jpg', 3 => 'png');
$imageType = array_key_exists($imageSize[2], $types) ? $types[$imageSize[2]] : FALSE;
if ($imageType !== FALSE)
{
$width = $imageSize[0];
$height = $imageSize[1];
if ($width > 220 || $height > 176)
{
switch ($imageType)
{
case 'gif':
$image = imagecreatefromgif($fname);
break;
case 'jpg':
$image = imagecreatefromjpeg($fname);
break;
case 'png':
$image = imagecreatefrompng($fname);
break;
default:
}
$max = $width > $height ? 'w' : 'h';
$new_width = 176;
$new_height = 220;
if ($max == 'w' && $width > $new_width)
{
$new_height = intval(($new_width * $height) / $width);
}
if ($max == 'h' && $height > $new_height)
{
$new_width = intval(($new_height * $width) / $height);
}
$preview = imagecreate($new_width, $new_height);
imagecopyresized($preview, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
imagepng($preview, FILESDIR . 'attach' . DIRECTORY_SEPARATOR . $fname_ext[0] . '_preview.png');
}
}
}
$_SESSION['libFiles'] += 1;
$_SESSION['files'][$fname_ext[0] . '.' . $ext] = $_FILES['file']['type'];
echo '<div class="msg">Файл загружен ' . $form . '</div>';
}
else
{
$error[] = 'При загрузке файла произошла ошибка';
$error[] = $form;
}
}
else
{
$error[] = $form;
}
}
/* Сохраняем статью */
elseif(isset($_POST['submit']))
{
/* Проверка заголовка */
if (!empty($title))
{
$title = my_esc($title);
if (mb_strlen($title) > 255)
{
$error[] = 'Превышена допустимая длина заголовка';
}
$total_title = intval($sql->query("SELECT COUNT(*) FROM `mod_lib` WHERE `refid` = '" . $id . "' AND `name` = '" . $title . "' AND `type` = 'arc'")->result());
if (($total_title > 0 && $do == 'add') || ($do == 'edit' && $title != $title_old && $total_title))
{
$error[] = 'Статья с таким названием уже есть';
}
}
else
{
$error[] = 'Вы не ввели название';
}
/* Проверка анонса */
if (!empty($announce))
{
$announce = my_esc($announce);
if (mb_strlen($announce) > 255)
{
$error[] = 'Недопустимая длина анонса';
}
}
else
{
$error[] = 'Вы не ввели анонс';
}
/* Проверка текста статьи */
if (!empty($text))
{
$text = my_esc($text);
if (mb_strlen($text) > 16777215)
{
$error[] = 'Превышена допустимая длина текста';
}
}
else
{
$error[] = 'Вы не ввели текст';
}
/* Проверка меток */
if (!empty($tags))
{
$tags = explode(',', $tags);
$tags = array_unique($tags);
$tags = array_map('trim', $tags);
$tags = my_esc(implode(',', $tags));
if (mb_strlen($tags) > 255)
{
$error = 'Превышена допустимая длина меток';
}
}
/* Сохраняем статью */
if (empty($error))
{
if ($do == 'add')
{
/* Добавление */
$sql->query(
"INSERT INTO `mod_lib` SET " .
"`refid` = '" . $id . "'," .
"`name` = '" . $title . "'," .
"`text` = '" . $text . "'," .
"`announce` = '" . $announce . "'," .
"`tags` = '" . $tags . "', " .
"`type` = 'arc'," .
"`author_id` = '" . $user_id . "'," .
"`author_name` = '" . $user['nick'] . "',".
"`mod` = '" . ($moder > 0 ? '0' : '1') . "'," .
"`time` = '" . time() . "';"
);
$aid = mysqli_insert_id($sql->db);
if (file_exists(tmpDir . 'index_page.swc'))
unlink(tmpDir . 'index_page.swc');
Core::get('cache.class');
Cache::multi_delete('lib[cat='.$id, tmpDir);
/* Обновляем счетчик записей */
if (isset($cat))
{
$sql->query("UPDATE `mod_lib` SET `count_arc` = '" . ($cat['count_arc'] + 1) . "' WHERE `id` = '" . $id . "'");
}
}
else
{
/* Редактирование */
$sql->query(
"UPDATE `mod_lib` SET " .
"`name` = '" . $title . "', " .
"`text` = '" . $text . "', " .
"`announce` = '" . $announce . "', " .
"`tags` = '" . $tags . "', " .
"`edit_name` = '" . $user['nick'] . "', " .
"`edit_time` = '" . time() . "', " .
"`edit_id` = '" . $user_id . "' " .
"WHERE `id` = '" . $id . "'"
);
}
/* Добавляем файлы в базу */
if (!empty($_SESSION['files']))
{
$sql2 = "INSERT INTO `mod_lib_files` (`aid`, `name`) VALUES ";
$total = count($_SESSION['files']);
$i = 0;
foreach ($_SESSION['files'] as $name => $type)
{
if (file_exists(FILESDIR . 'attach' . DIRECTORY_SEPARATOR . $name))
{
$sql2 .= "('" . ($do == 'add' ? $aid : $id) . "', '" . my_esc($name) . "')" . ( ($i == ($total - 1)) ? ";" : "," );
$i++;
}
}
$sql->query($sql2);
}
unset($_SESSION['libFiles'], $_SESSION['files']);
/* Показываем сообщение о успешном сохранении */
if ($do == 'add')
{
if ($moder)
{
$message = 'Статья добавлена. <a href="?act=articles&mod=view&id=' . $aid . '">Продолжить</a>';
}
else
{
$message = 'Статья добавлена.  Она будет доступна после проверки модератором. <a href="?act=category&mod=view&id=' . $id . '">Продолжить</a>';
}
}
else
{
$message = 'Статья сохранена  <a href="?act=articles&mod=view&id=' . $id . '">Продолжить</a>';
}
echo '<div class="fmenu">' . 'Библиотека' . ' | ' . ($do == 'add' ? 'Добавить статью' : 'Редактировать статью') . '</div>' .
'<div class="msg">' . $message . '</div>' .
'<div class="post"><a href="?act=' .
($do == 'add' ? 'category' : 'articles') .
'&mod=view&id=' . $id . '">Назад</a></div>';
}
}
else
{
$error[] = 'Ошибка входящих данных<br /><a href="?act=articles&mod=form&id=' . $id .'">Продолжить</a>';
}
}
else
{
$error[] = 'Ошибка входящих данных<br /><a href="?act=articles&mod=form&id=' . $id .'">Продолжить</a>';
}
}
}
else
{
$error = 'Доступ запрещен';
}