Просмотр файла app/modules/news/index.php

Размер файла: 15.84Kb
  1. <?php
  2. App::view($config['themes'].'/index');
  3.  
  4. $id = param('id');
  5.  
  6. switch ($act):
  7. ############################################################################################
  8. ## Главная страница ##
  9. ############################################################################################
  10. case 'index':
  11. show_title('Новости сайта');
  12.  
  13. if (is_admin([101, 102])){
  14. echo '<div class="form"><a href="/admin/news">Управление новостями</a></div>';
  15. }
  16.  
  17. $total = DB::run() -> querySingle("SELECT count(*) FROM `news`;");
  18. $page = App::paginate(App::setting('postnews'), $total);
  19.  
  20. $config['description'] = 'Список новостей (Стр. '.$page['current'].')';
  21.  
  22. if ($total > 0) {
  23. $querynews = DB::run() -> query("SELECT * FROM `news` ORDER BY `time` DESC LIMIT ".$page['offset'].", ".$config['postnews'].";");
  24.  
  25. while ($data = $querynews -> fetch()) {
  26. echo '<div class="b">';
  27. echo $data['closed'] == 0 ? '<i class="fa fa-plus-square-o"></i> ' : '<i class="fa fa-minus-square-o"></i> ';
  28. echo '<b><a href="/news/'.$data['id'].'">'.$data['title'].'</a></b><small> ('.date_fixed($data['time']).')</small></div>';
  29.  
  30. if (!empty($data['image'])) {
  31. echo '<div class="img"><a href="/uploads/news/'.$data['image'].'">'.resize_image('uploads/news/', $data['image'], 75, ['alt' => $data['title']]).'</a></div>';
  32. }
  33.  
  34. if(stristr($data['text'], '[cut]')) {
  35. $data['text'] = current(explode('[cut]', $data['text'])).' <a href="/news/'.$data['id'].'">Читать далее &raquo;</a>';
  36. }
  37.  
  38. echo '<div>'.App::bbCode($data['text']).'</div>';
  39. echo '<div style="clear:both;">Добавлено: '.profile($data['author']).'<br />';
  40. echo '<a href="/news/'.$data['id'].'/comments">Комментарии</a> ('.$data['comments'].') ';
  41. echo '<a href="/news/'.$data['id'].'/end">&raquo;</a></div>';
  42. }
  43.  
  44. App::pagination($page);
  45. } else {
  46. show_error('Новостей еще нет!');
  47. }
  48.  
  49. echo '<i class="fa fa-rss"></i> <a href="/news/rss">RSS подписка</a><br />';
  50. echo '<i class="fa fa-comment"></i> <a href="/news/allcomments">Комментарии</a><br />';
  51. break;
  52.  
  53. ############################################################################################
  54. ## Чтение новости ##
  55. ############################################################################################
  56. case 'view':
  57.  
  58. $data = DB::run() -> queryFetch("SELECT * FROM `news` WHERE `id`=? LIMIT 1;", [$id]);
  59.  
  60. if (!empty($data)) {
  61.  
  62. if (is_admin()){
  63. echo '<div class="form"><a href="/admin/news?act=edit&amp;id='.$id.'">Редактировать</a> / ';
  64. echo '<a href="/admin/news?act=del&amp;del='.$id.'&amp;token='.$_SESSION['token'].'" onclick="return confirm(\'Вы действительно хотите удалить данную новость?\')">Удалить</a></div>';
  65. }
  66.  
  67. $config['newtitle'] = $data['title'];
  68. $config['description'] = strip_str($data['text']);
  69.  
  70. echo '<div class="b"><i class="fa fa-file-o"></i> ';
  71. echo '<b>'.$data['title'].'</b><small> ('.date_fixed($data['time']).')</small></div>';
  72.  
  73. if (!empty($data['image'])) {
  74.  
  75. echo '<div class="img"><a href="/uploads/news/'.$data['image'].'">'.resize_image('uploads/news/', $data['image'], 75, ['alt' => $data['title']]).'</a></div>';
  76. }
  77.  
  78. $data['text'] = str_replace('[cut]', '', $data['text']);
  79. echo '<div>'.App::bbCode($data['text']).'</div>';
  80. echo '<div style="clear:both;">Добавлено: '.profile($data['author']).'</div><br />';
  81.  
  82. if ($data['comments'] > 0) {
  83. echo '<div class="act"><i class="fa fa-comment"></i> <b>Последние комментарии</b></div>';
  84.  
  85. $querycomm = DB::run() -> query("SELECT * FROM `comments` WHERE relate_type=? AND `relate_id`=? ORDER BY `time` DESC LIMIT 5;", ['news', $id]);
  86. $comments = $querycomm -> fetchAll();
  87. $comments = array_reverse($comments);
  88.  
  89. foreach ($comments as $comm) {
  90. echo '<div class="b">';
  91. echo '<div class="img">'.user_avatars($comm['user']).'</div>';
  92.  
  93. echo '<b>'.profile($comm['user']).'</b>';
  94. echo '<small> ('.date_fixed($comm['time']).')</small><br />';
  95. echo user_title($comm['user']).' '.user_online($comm['user']).'</div>';
  96.  
  97. echo '<div>'.App::bbCode($comm['text']).'<br />';
  98.  
  99. if (is_admin() || empty($config['anonymity'])) {
  100. echo '<span class="data">('.$comm['brow'].', '.$comm['ip'].')</span>';
  101. }
  102.  
  103. echo '</div>';
  104. }
  105.  
  106. if ($data['comments'] > 5) {
  107. echo '<div class="act"><b><a href="/news/'.$data['id'].'/comments">Все комментарии</a></b> ('.$data['comments'].') ';
  108. echo '<a href="/news/'.$data['id'].'/end">&raquo;</a></div><br />';
  109. }
  110. }
  111.  
  112. if (empty($data['closed'])) {
  113.  
  114. if (empty($data['comments'])){
  115. show_error('Комментариев еще нет!');
  116. }
  117.  
  118. if (is_user()) {
  119. echo '<div class="form"><form action="/news/'.$id.'/create?read=1" method="post">';
  120. echo '<input type="hidden" name="token" value="'.$_SESSION['token'].'">';
  121. echo '<textarea id="markItUp" cols="25" rows="5" name="msg"></textarea><br />';
  122. echo '<input type="submit" value="Написать" /></form></div>';
  123.  
  124. echo '<br />';
  125. echo '<a href="/rules">Правила</a> / ';
  126. echo '<a href="/smiles">Смайлы</a> / ';
  127. echo '<a href="/tags">Теги</a><br /><br />';
  128. } else {
  129. show_login('Вы не авторизованы, чтобы добавить сообщение, необходимо');
  130. }
  131. } else {
  132. show_error('Комментирование данной новости закрыто!');
  133. }
  134. } else {
  135. show_error('Ошибка! Выбранная вами новость не существует, возможно она была удалена!');
  136. }
  137.  
  138. echo '<i class="fa fa-arrow-circle-left"></i> <a href="/news">К новостям</a><br />';
  139. break;
  140.  
  141. ############################################################################################
  142. ## Комментарии ##
  143. ############################################################################################
  144. case 'comments':
  145. $datanews = DB::run() -> queryFetch("SELECT * FROM `news` WHERE `id`=? LIMIT 1;", [$id]);
  146.  
  147. if (!empty($datanews)) {
  148.  
  149. $total = DB::run() -> querySingle("SELECT count(*) FROM `comments` WHERE relate_type=? AND `relate_id`=?;", ['news', $id]);
  150. $page = App::paginate(App::setting('postnews'), $total);
  151.  
  152. $config['newtitle'] = 'Комментарии - '.$datanews['title'];
  153. $config['description'] = 'Комментарии - '.$datanews['title'].' (Стр. '.$page['current'].')';
  154.  
  155. echo '<h1><a href="/news/'.$datanews['id'].'">'.$datanews['title'].'</a></h1>';
  156.  
  157. if ($total > 0) {
  158.  
  159. $is_admin = is_admin();
  160. if ($is_admin) {
  161. echo '<form action="/news/'.$id.'/delete?page='.$page['current'].'" method="post">';
  162. echo '<input type="hidden" name="token" value="'.$_SESSION['token'].'">';
  163. }
  164.  
  165. $querycomm = DB::run() -> query("SELECT * FROM `comments` WHERE relate_type=? AND `relate_id`=? ORDER BY `time` ASC LIMIT ".$page['offset'].", ".$config['postnews'].";", ['news', $id]);
  166.  
  167. while ($data = $querycomm -> fetch()) {
  168.  
  169. echo '<div class="b" id="comment_'.$data['id'].'"">';
  170. echo '<div class="img">'.user_avatars($data['user']).'</div>';
  171.  
  172. if ($is_admin) {
  173. echo '<span class="imgright"><input type="checkbox" name="del[]" value="'.$data['id'].'" /></span>';
  174. }
  175.  
  176. echo '<b>'.profile($data['user']).'</b>';
  177. echo '<small> ('.date_fixed($data['time']).')</small><br />';
  178. echo user_title($data['user']).' '.user_online($data['user']).'</div>';
  179.  
  180. echo '<div>'.App::bbCode($data['text']).'<br />';
  181.  
  182. if (is_admin() || empty($config['anonymity'])) {
  183. echo '<span class="data">('.$data['brow'].', '.$data['ip'].')</span>';
  184. }
  185.  
  186. echo '</div>';
  187. }
  188.  
  189. if ($is_admin) {
  190. echo '<span class="imgright"><input type="submit" value="Удалить выбранное" /></span></form>';
  191. }
  192.  
  193. App::pagination($page);
  194. }
  195.  
  196. if (empty($datanews['closed'])) {
  197.  
  198. if (!$total) {
  199. show_error('Комментариев еще нет!');
  200. }
  201.  
  202. if (is_user()) {
  203. echo '<div class="form"><form action="/news/'.$id.'/create" method="post">';
  204. echo '<input type="hidden" name="token" value="'.$_SESSION['token'].'">';
  205. echo '<textarea id="markItUp" cols="25" rows="5" name="msg"></textarea><br />';
  206. echo '<input type="submit" value="Написать" /></form></div>';
  207.  
  208. echo '<br />';
  209. echo '<a href="/rules">Правила</a> / ';
  210. echo '<a href="/smiles">Смайлы</a> / ';
  211. echo '<a href="/tags">Теги</a><br /><br />';
  212. } else {
  213. show_login('Вы не авторизованы, чтобы добавить сообщение, необходимо');
  214. }
  215. } else {
  216. show_error('Комментирование данной новости закрыто!');
  217. }
  218. } else {
  219. show_error('Ошибка! Выбранная новость не существует, возможно она была удалена!');
  220. }
  221.  
  222. echo '<i class="fa fa-arrow-circle-left"></i> <a href="/news">К новостям</a><br />';
  223. break;
  224.  
  225. ############################################################################################
  226. ## Добавление комментариев ##
  227. ############################################################################################
  228. case 'create':
  229.  
  230. $msg = check(Request::input('msg'));
  231. $token = check(Request::input('token'));
  232. $page = abs(intval(Request::input('page', 1)));
  233.  
  234. if (is_user()) {
  235.  
  236. $data = DB::run() -> queryFetch("SELECT * FROM `news` WHERE `id`=? LIMIT 1;", [$id]);
  237.  
  238. $validation = new Validation();
  239.  
  240. $validation -> addRule('equal', [$token, $_SESSION['token']], 'Неверный идентификатор сессии, повторите действие!')
  241. -> addRule('equal', [is_flood($log), true], 'Антифлуд! Разрешается комментировать раз в '.flood_period().' сек!')
  242. -> addRule('not_empty', $data, 'Выбранной новости не существует, возможно она было удалена!')
  243. -> addRule('string', $msg, 'Слишком длинный или короткий комментарий!', true, 5, 1000)
  244. -> addRule('empty', $data['closed'], 'Комментирование данной новости запрещено!');
  245.  
  246. if ($validation->run()) {
  247.  
  248. $msg = antimat($msg);
  249.  
  250. DB::run() -> query("INSERT INTO `comments` (relate_type, relate_category_id, `relate_id`, `text`, `user`, `time`, `ip`, `brow`) VALUES (?, ?, ?, ?, ?, ?, ?, ?);", ['news', 0, $id, $msg, $log, SITETIME, App::getClientIp(), App::getUserAgent()]);
  251.  
  252. DB::run() -> query("DELETE FROM `comments` WHERE relate_type=? AND `relate_id`=? AND `time` < (SELECT MIN(`time`) FROM (SELECT `time` FROM `comments` WHERE relate_type=? AND `relate_id`=? ORDER BY `time` DESC LIMIT ".$config['maxkommnews'].") AS del);", ['news', $id, 'news', $id]);
  253.  
  254. DB::run() -> query("UPDATE `news` SET `comments`=`comments`+1 WHERE `id`=?;", [$id]);
  255. DB::run() -> query("UPDATE `users` SET `allcomments`=`allcomments`+1, `point`=`point`+1, `money`=`money`+5 WHERE `login`=?", [$log]);
  256.  
  257. notice('Комментарий успешно добавлен!');
  258.  
  259. if (isset($_GET['read'])) {
  260. redirect('/news/'.$id);
  261. }
  262.  
  263. redirect('/news/'.$id.'/end');
  264.  
  265. } else {
  266. show_error($validation->getErrors());
  267. }
  268. } else {
  269. show_login('Вы не авторизованы, чтобы добавить сообщение, необходимо');
  270. }
  271.  
  272. echo '<i class="fa fa-arrow-circle-up"></i> <a href="/news/'.$id.'/comments?page='.$page.'">Вернуться</a><br />';
  273. echo '<i class="fa fa-arrow-circle-left"></i> <a href="/news">К новостям</a><br />';
  274. break;
  275.  
  276. ############################################################################################
  277. ## Удаление комментариев ##
  278. ############################################################################################
  279. case 'delete':
  280.  
  281. $token = check(Request::input('token'));
  282. $del = intar(Request::input('del'));
  283. $page = abs(intval(Request::input('page', 1)));
  284.  
  285. if (is_admin()) {
  286. if ($token == $_SESSION['token']) {
  287. if (!empty($del)) {
  288.  
  289. $del = implode(',', $del);
  290.  
  291. $delcomments = DB::run() -> exec("DELETE FROM `comments` WHERE relate_type='news' AND `relate_id`=".$id." AND `id` IN (".$del.");");
  292.  
  293. DB::run() -> query("UPDATE `news` SET `comments`=`comments`-? WHERE `id`=?;", [$delcomments, $id]);
  294.  
  295. notice('Выбранные комментарии успешно удалены!');
  296. redirect('/news/'.$id.'/comments?page='.$page);
  297.  
  298. } else {
  299. show_error('Ошибка! Отстутствуют выбранные комментарии для удаления!');
  300. }
  301. } else {
  302. show_error('Ошибка! Неверный идентификатор сессии, повторите действие!');
  303. }
  304. } else {
  305. show_error('Ошибка! Удалять комментарии могут только модераторы!');
  306. }
  307.  
  308. echo '<i class="fa fa-arrow-circle-up"></i> <a href="/news/'.$id.'/comments?page='.$page.'">Вернуться</a><br />';
  309. echo '<i class="fa fa-arrow-circle-left"></i> <a href="/news">К новостям</a><br />';
  310. break;
  311.  
  312. ############################################################################################
  313. ## Переадресация на последнюю страницу ##
  314. ############################################################################################
  315. case 'end':
  316.  
  317. $query = DB::run() -> queryFetch("SELECT count(*) as `total_comments` FROM `comments` WHERE relate_type=? AND `relate_id`=? LIMIT 1;", ['news', $id]);
  318.  
  319. if (!empty($query)) {
  320. $total_comments = (empty($query['total_comments'])) ? 1 : $query['total_comments'];
  321. $end = ceil($total_comments / $config['postnews']);
  322.  
  323. redirect('/news/'.$id.'/comments?page='.$end);
  324.  
  325. } else {
  326. show_error('Ошибка! Данной новости не существует!');
  327. }
  328.  
  329. echo '<i class="fa fa-arrow-circle-left"></i> <a href="/news">К новостям</a><br />';
  330. break;
  331.  
  332. endswitch;
  333.  
  334. App::view($config['themes'].'/foot');