Просмотр файла lib/includes/articles/save.php

Размер файла: 17.72Kb
  1. <?php
  2.  
  3. $access = FALSE;
  4. $do = $do == 'edit' ? 'edit' : 'add';
  5. $max_size = include H . 'engine/includes/max_file_size.php';
  6. Core::get('text.class', 'classes');
  7.  
  8. if ($id === FALSE)
  9. {
  10.  
  11. $id = 0;
  12.  
  13. }
  14.  
  15. if ($admin)
  16. {
  17.  
  18. /* Открыть доступ для модераторов и администраторов */
  19. $access = TRUE;
  20.  
  21. }
  22.  
  23. if ($id !== 0 && $do == 'add' && $user_id)
  24. {
  25.  
  26. $cat = $sql->query("SELECT `mod`, `count_arc` FROM `mod_lib` WHERE `id` = " . $id . " AND `type` = 'cat'")->fetch();
  27.  
  28. if ($cat !== FALSE)
  29. {
  30.  
  31. if ($cat['mod'] == 1)
  32. {
  33.  
  34. /* Открыть доступ для пользователей (для добавления статьи) */
  35. $access = TRUE;
  36.  
  37. }
  38.  
  39. }
  40. else
  41. {
  42.  
  43. $error = 'Категория не найдена<br /><a href="index.php">В библиотеку</a>';
  44.  
  45. }
  46.  
  47. }
  48.  
  49. if ($access === TRUE && $user_id && !isset($error))
  50. {
  51.  
  52. $title = isset($_POST['title']) ? $_POST['title'] : '';
  53. $announce = isset($_POST['announce']) ? $_POST['announce'] : '';
  54. $text = isset($_POST['text']) ? $_POST['text'] : '';
  55. $tags = isset($_POST['tags']) ? $_POST['tags'] : '';
  56. $delfile = searchWord(array_keys($_POST));
  57. $form = '<form action="?act=articles&amp;mod=form&amp;do=' . ($do == 'add' ? 'add' : 'edit') . '&amp;id=' . $id . '" method="post">' .
  58. '<input type="hidden" name="title" value="' . htmlentities($title, ENT_QUOTES, 'UTF-8') . '" />' .
  59. '<input type="hidden" name="announce" value="' . htmlentities($announce, ENT_QUOTES, 'UTF-8') . '" />' .
  60. '<input type="hidden" name="text" value="' . htmlentities($text, ENT_QUOTES, 'UTF-8') . '" />' .
  61. '<input type="hidden" name="tags" value="' . htmlentities($tags, ENT_QUOTES, 'UTF-8') . '" />' .
  62. '<input type="submit" name="continue" value="Продолжить" /></form>';
  63. $error = array();
  64.  
  65. if ($do == 'edit')
  66. {
  67.  
  68. /* Получить данные статьи для редактировоания */
  69. $arc = $sql->query("SELECT `name` FROM `mod_lib` WHERE `id` = '" . $id . "' AND `type` = 'arc'")->result();
  70. if ($arc === FALSE)
  71. {
  72.  
  73. $error[] = 'Статья не найдена<br />' . $form;
  74.  
  75. }
  76. else
  77. {
  78.  
  79. $title_old = my_esc($arc['name']);
  80.  
  81. }
  82.  
  83. }
  84.  
  85. if (empty($error))
  86. {
  87.  
  88. if (!empty($_POST))
  89. {
  90.  
  91. /* Удаляем файл */
  92. if ($delfile)
  93. {
  94.  
  95. $delfile = explode('_', $delfile);
  96. $ext = array_pop($delfile);
  97. $preview = FILESDIR . 'attach' . DIRECTORY_SEPARATOR . implode('_', $delfile) . '_preview.png';
  98. $delfile = implode('_', $delfile) . '.' . $ext;
  99. $filename = FILESDIR . 'attach' . DIRECTORY_SEPARATOR . $delfile;
  100.  
  101. if (!empty($_SESSION['files'][$delfile]))
  102. {
  103.  
  104. unset($_SESSION['files'][$delfile]);
  105. $_SESSION['libFiles'] -= 1;
  106.  
  107. }
  108. elseif($sql->query("SELECT COUNT(*) FROM `mod_lib_files` WHERE `aid` = '" . $id . "' AND `name` = '" . my_esc($delfile) . "'")->result() > 0)
  109. {
  110.  
  111. $sql->query("DELETE FROM `mod_lib_files` WHERE `aid` = '" . $id . "' AND `name` = '" . my_esc($delfile) . "'");
  112.  
  113. }
  114.  
  115. if (file_exists($preview))
  116. {
  117.  
  118. unlink($preview);
  119.  
  120. }
  121.  
  122. if (file_exists($filename))
  123. {
  124.  
  125. unlink($filename);
  126. echo '<div class="err">Файл удален.<br />' . $form . '</div>';
  127.  
  128. }
  129. else
  130. {
  131.  
  132. $error[] = 'Файл не существует';
  133. $error[] = $form;
  134.  
  135. }
  136.  
  137. }
  138. /* Добавляем файл */
  139. elseif(isset($_POST['addfile']))
  140. {
  141.  
  142. /* Проверка на максимальное кол-во файлов */
  143. if (!isset($_SESSION['libFiles']))
  144. {
  145.  
  146. $_SESSION['libFiles'] = 0;
  147.  
  148. }
  149. else
  150. {
  151.  
  152. if ($_SESSION['libFiles'] == $libSet['files']['max_number'])
  153. {
  154.  
  155. $error[] = 'Превышено максимально допустимое количество файлов для статьи.';
  156.  
  157. }
  158.  
  159. }
  160.  
  161. if (empty($error))
  162. {
  163.  
  164. /* Проверка размера файла */
  165. if ($_FILES['file']['size'] > $max_size)
  166. {
  167.  
  168. $error[] = 'Размер файла не должен превышать &#160;' . text::size_data($max_size);
  169.  
  170. }
  171.  
  172. $fname = $_FILES['file']['name'];
  173. $ext = pathinfo($fname, PATHINFO_EXTENSION);
  174.  
  175.  
  176. if (!in_array($ext, $libSet['files']['extensions']))
  177. {
  178.  
  179. $error[] = 'К отправке разрешены файлы имеющие одно из следущих расширений &#160' . implode(', ', $libSet['files']['extensions']);
  180.  
  181. }
  182.  
  183. /* Проверка имени файла */
  184. if (mb_strlen($fname) > 30)
  185. {
  186.  
  187. $error[] = 'Длина имени файла не должна превышать 30 символов';
  188.  
  189. }
  190. /*
  191. if (preg_match("/[^\da-z_\-.]+/", $fname))
  192. {
  193.  
  194. $error[] = 'В имени файла присутствуют недопустимые символы';
  195.  
  196. }
  197. */
  198. $fname = FILESDIR . 'attach' . DIRECTORY_SEPARATOR . $fname_ext[0] . '.' . $ext;
  199.  
  200. /* Проверка файла на существование */
  201. if (file_exists($fname))
  202. {
  203.  
  204. $fname_ext[0] .= '_' . time();
  205. $fname = FILESDIR . 'attach' . DIRECTORY_SEPARATOR . $fname_ext[0] . '.' . $ext;
  206.  
  207. }
  208.  
  209. }
  210.  
  211. if (empty($error))
  212. {
  213.  
  214. /* Загружаем файл */
  215. if (copy($_FILES['file']['tmp_name'], $fname) === TRUE)
  216. {
  217.  
  218. /* Создаем превью для изображения */
  219. if (isImage($_FILES['file']['type']) && extension_loaded('gd'))
  220. {
  221.  
  222. $imageSize = getimagesize($fname);
  223. $types = array(1 => 'gif', 2=> 'jpg', 3 => 'png');
  224. $imageType = array_key_exists($imageSize[2], $types) ? $types[$imageSize[2]] : FALSE;
  225. if ($imageType !== FALSE)
  226. {
  227.  
  228. $width = $imageSize[0];
  229. $height = $imageSize[1];
  230. if ($width > 220 || $height > 176)
  231. {
  232.  
  233. switch ($imageType)
  234. {
  235.  
  236. case 'gif':
  237. $image = imagecreatefromgif($fname);
  238. break;
  239. case 'jpg':
  240. $image = imagecreatefromjpeg($fname);
  241. break;
  242. case 'png':
  243. $image = imagecreatefrompng($fname);
  244. break;
  245. default:
  246.  
  247. }
  248.  
  249. $max = $width > $height ? 'w' : 'h';
  250. $new_width = 176;
  251. $new_height = 220;
  252.  
  253. if ($max == 'w' && $width > $new_width)
  254. {
  255.  
  256. $new_height = intval(($new_width * $height) / $width);
  257.  
  258. }
  259.  
  260. if ($max == 'h' && $height > $new_height)
  261. {
  262.  
  263. $new_width = intval(($new_height * $width) / $height);
  264.  
  265. }
  266.  
  267. $preview = imagecreate($new_width, $new_height);
  268. imagecopyresized($preview, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
  269. imagepng($preview, FILESDIR . 'attach' . DIRECTORY_SEPARATOR . $fname_ext[0] . '_preview.png');
  270.  
  271. }
  272.  
  273. }
  274.  
  275. }
  276.  
  277. $_SESSION['libFiles'] += 1;
  278. $_SESSION['files'][$fname_ext[0] . '.' . $ext] = $_FILES['file']['type'];
  279. echo '<div class="msg">Файл загружен ' . $form . '</div>';
  280.  
  281. }
  282. else
  283. {
  284.  
  285. $error[] = 'При загрузке файла произошла ошибка';
  286. $error[] = $form;
  287.  
  288. }
  289.  
  290. }
  291. else
  292. {
  293.  
  294. $error[] = $form;
  295.  
  296. }
  297.  
  298. }
  299. /* Сохраняем статью */
  300. elseif(isset($_POST['submit']))
  301. {
  302.  
  303. /* Проверка заголовка */
  304. if (!empty($title))
  305. {
  306.  
  307. $title = my_esc($title);
  308.  
  309. if (mb_strlen($title) > 255)
  310. {
  311.  
  312. $error[] = 'Превышена допустимая длина заголовка';
  313.  
  314. }
  315.  
  316. $total_title = intval($sql->query("SELECT COUNT(*) FROM `mod_lib` WHERE `refid` = '" . $id . "' AND `name` = '" . $title . "' AND `type` = 'arc'")->result());
  317.  
  318. if (($total_title > 0 && $do == 'add') || ($do == 'edit' && $title != $title_old && $total_title))
  319. {
  320.  
  321. $error[] = 'Статья с таким названием уже есть';
  322.  
  323. }
  324.  
  325. }
  326. else
  327. {
  328.  
  329. $error[] = 'Вы не ввели название';
  330. }
  331.  
  332. /* Проверка анонса */
  333. if (!empty($announce))
  334. {
  335.  
  336. $announce = my_esc($announce);
  337. if (mb_strlen($announce) > 255)
  338. {
  339.  
  340. $error[] = 'Недопустимая длина анонса';
  341.  
  342. }
  343.  
  344. }
  345. else
  346. {
  347.  
  348. $error[] = 'Вы не ввели анонс';
  349.  
  350. }
  351.  
  352. /* Проверка текста статьи */
  353. if (!empty($text))
  354. {
  355.  
  356. $text = my_esc($text);
  357.  
  358. if (mb_strlen($text) > 16777215)
  359. {
  360.  
  361. $error[] = 'Превышена допустимая длина текста';
  362.  
  363. }
  364.  
  365. }
  366. else
  367. {
  368.  
  369. $error[] = 'Вы не ввели текст';
  370.  
  371. }
  372.  
  373. /* Проверка меток */
  374. if (!empty($tags))
  375. {
  376.  
  377. $tags = explode(',', $tags);
  378. $tags = array_unique($tags);
  379. $tags = array_map('trim', $tags);
  380. $tags = my_esc(implode(',', $tags));
  381.  
  382. if (mb_strlen($tags) > 255)
  383. {
  384.  
  385. $error = 'Превышена допустимая длина меток';
  386.  
  387. }
  388.  
  389. }
  390.  
  391. /* Сохраняем статью */
  392. if (empty($error))
  393. {
  394.  
  395. if ($do == 'add')
  396. {
  397. /* Добавление */
  398. $sql->query(
  399. "INSERT INTO `mod_lib` SET " .
  400. "`refid` = '" . $id . "'," .
  401. "`name` = '" . $title . "'," .
  402. "`text` = '" . $text . "'," .
  403. "`announce` = '" . $announce . "'," .
  404. "`tags` = '" . $tags . "', " .
  405. "`type` = 'arc'," .
  406. "`author_id` = '" . $user_id . "'," .
  407. "`author_name` = '" . $user['nick'] . "',".
  408. "`mod` = '" . ($moder > 0 ? '0' : '1') . "'," .
  409. "`time` = '" . time() . "';"
  410. );
  411.  
  412. $aid = mysqli_insert_id($sql->db);
  413.  
  414. if (file_exists(tmpDir . 'index_page.swc'))
  415. unlink(tmpDir . 'index_page.swc');
  416. Core::get('cache.class');
  417. Cache::multi_delete('lib[cat='.$id, tmpDir);
  418. /* Обновляем счетчик записей */
  419. if (isset($cat))
  420. {
  421. $sql->query("UPDATE `mod_lib` SET `count_arc` = '" . ($cat['count_arc'] + 1) . "' WHERE `id` = '" . $id . "'");
  422. }
  423.  
  424. }
  425. else
  426. {
  427. /* Редактирование */
  428. $sql->query(
  429. "UPDATE `mod_lib` SET " .
  430. "`name` = '" . $title . "', " .
  431. "`text` = '" . $text . "', " .
  432. "`announce` = '" . $announce . "', " .
  433. "`tags` = '" . $tags . "', " .
  434. "`edit_name` = '" . $user['nick'] . "', " .
  435. "`edit_time` = '" . time() . "', " .
  436. "`edit_id` = '" . $user_id . "' " .
  437. "WHERE `id` = '" . $id . "'"
  438. );
  439.  
  440. }
  441.  
  442. /* Добавляем файлы в базу */
  443. if (!empty($_SESSION['files']))
  444. {
  445.  
  446. $sql2 = "INSERT INTO `mod_lib_files` (`aid`, `name`) VALUES ";
  447. $total = count($_SESSION['files']);
  448. $i = 0;
  449.  
  450. foreach ($_SESSION['files'] as $name => $type)
  451. {
  452.  
  453. if (file_exists(FILESDIR . 'attach' . DIRECTORY_SEPARATOR . $name))
  454. {
  455.  
  456. $sql2 .= "('" . ($do == 'add' ? $aid : $id) . "', '" . my_esc($name) . "')" . ( ($i == ($total - 1)) ? ";" : "," );
  457. $i++;
  458.  
  459. }
  460.  
  461. }
  462.  
  463. $sql->query($sql2);
  464.  
  465. }
  466.  
  467. unset($_SESSION['libFiles'], $_SESSION['files']);
  468.  
  469. /* Показываем сообщение о успешном сохранении */
  470. if ($do == 'add')
  471. {
  472.  
  473. if ($moder)
  474. {
  475.  
  476. $message = 'Статья добавлена.&#160;<a href="?act=articles&amp;mod=view&amp;id=' . $aid . '">Продолжить</a>';
  477.  
  478. }
  479. else
  480. {
  481.  
  482. $message = 'Статья добавлена.&#160; Она будет доступна после проверки модератором. <a href="?act=category&amp;mod=view&amp;id=' . $id . '">Продолжить</a>';
  483.  
  484. }
  485.  
  486. }
  487. else
  488. {
  489.  
  490. $message = 'Статья сохранена &#160;<a href="?act=articles&amp;mod=view&amp;id=' . $id . '">Продолжить</a>';
  491.  
  492. }
  493.  
  494. echo '<div class="fmenu">' . 'Библиотека' . ' | ' . ($do == 'add' ? 'Добавить статью' : 'Редактировать статью') . '</div>' .
  495. '<div class="msg">' . $message . '</div>' .
  496. '<div class="post"><a href="?act=' .
  497. ($do == 'add' ? 'category' : 'articles') .
  498. '&amp;mod=view&amp;id=' . $id . '">Назад</a></div>';
  499.  
  500. }
  501.  
  502. }
  503. else
  504. {
  505.  
  506. $error[] = 'Ошибка входящих данных<br /><a href="?act=articles&amp;mod=form&amp;id=' . $id .'">Продолжить</a>';
  507.  
  508. }
  509.  
  510. }
  511. else
  512. {
  513.  
  514. $error[] = 'Ошибка входящих данных<br /><a href="?act=articles&amp;mod=form&amp;id=' . $id .'">Продолжить</a>';
  515.  
  516. }
  517.  
  518. }
  519.  
  520. }
  521. else
  522. {
  523.  
  524. $error = 'Доступ запрещен';
  525.  
  526. }