Просмотр файла app/Controllers/Admin/NewsController.php

Размер файла: 6.75Kb
  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5. namespace App\Controllers\Admin;
  6.  
  7. use App\Classes\Validator;
  8. use App\Models\News;
  9. use App\Models\Setting;
  10. use App\Models\User;
  11. use Exception;
  12. use Illuminate\Http\Request;
  13.  
  14. class NewsController extends AdminController
  15. {
  16. /**
  17. * Конструктор
  18. */
  19. public function __construct()
  20. {
  21. parent::__construct();
  22.  
  23. if (! isAdmin(User::ADMIN)) {
  24. abort(403, __('errors.forbidden'));
  25. }
  26. }
  27.  
  28. /**
  29. * Главная страница
  30. *
  31. * @return string
  32. */
  33. public function index(): string
  34. {
  35. $news = News::query()
  36. ->orderByDesc('created_at')
  37. ->with('user')
  38. ->paginate(setting('postnews'));
  39.  
  40. return view('admin/news/index', compact('news'));
  41. }
  42.  
  43. /**
  44. * Редактирование новости
  45. *
  46. * @param int $id
  47. * @param Request $request
  48. * @param Validator $validator
  49. *
  50. * @return string
  51. */
  52. public function edit(int $id, Request $request, Validator $validator): string
  53. {
  54. /** @var News $news */
  55. $news = News::query()->find($id);
  56. $page = int($request->input('page', 1));
  57.  
  58. if (! $news) {
  59. abort(404, __('news.news_not_exist'));
  60. }
  61.  
  62. if ($request->isMethod('post')) {
  63. $title = $request->input('title');
  64. $text = $request->input('text');
  65. $image = $request->file('image');
  66. $closed = empty($request->input('closed')) ? 0 : 1;
  67. $top = empty($request->input('top')) ? 0 : 1;
  68.  
  69. $validator->equal($request->input('token'), $_SESSION['token'], __('validator.token'))
  70. ->length($title, 3, 50, ['title' => __('validator.text')])
  71. ->length($text, 5, 10000, ['text' => __('validator.text')]);
  72.  
  73. $rules = [
  74. 'maxsize' => setting('filesize'),
  75. 'minweight' => 100,
  76. ];
  77.  
  78. $validator->file($image, $rules, ['image' => __('validator.image_upload_failed')], false);
  79.  
  80. if ($validator->isValid()) {
  81. // Удаление старой картинки
  82. if ($image) {
  83. deleteFile(HOME . $news->image);
  84. $file = $news->uploadFile($image, false);
  85. }
  86.  
  87. $news->update([
  88. 'title' => $title,
  89. 'text' => $text,
  90. 'closed' => $closed,
  91. 'top' => $top,
  92. 'image' => $file['path'] ?? $news->image,
  93. ]);
  94.  
  95. clearCache(['statNews', 'lastNews']);
  96. setFlash('success', __('news.news_success_edited'));
  97. redirect('/admin/news/edit/' . $news->id . '?page=' . $page);
  98. } else {
  99. setInput($request->all());
  100. setFlash('danger', $validator->getErrors());
  101. }
  102. }
  103.  
  104. return view('admin/news/edit', compact('news', 'page'));
  105. }
  106.  
  107. /**
  108. * Создание новости
  109. *
  110. * @param Request $request
  111. * @param Validator $validator
  112. *
  113. * @return string
  114. */
  115. public function create(Request $request, Validator $validator): string
  116. {
  117. if ($request->isMethod('post')) {
  118. $title = $request->input('title');
  119. $text = $request->input('text');
  120. $image = $request->file('image');
  121. $closed = empty($request->input('closed')) ? 0 : 1;
  122. $top = empty($request->input('top')) ? 0 : 1;
  123.  
  124. $validator->equal($request->input('token'), $_SESSION['token'], __('validator.token'))
  125. ->length($title, 3, 50, ['title' => __('validator.text')])
  126. ->length($text, 5, 10000, ['text' => __('validator.text')]);
  127.  
  128. $rules = [
  129. 'maxsize' => setting('filesize'),
  130. 'minweight' => 100,
  131. ];
  132.  
  133. $validator->file($image, $rules, ['image' => __('validator.image_upload_failed')], false);
  134.  
  135. if ($validator->isValid()) {
  136. if ($image) {
  137. $file = (new News())->uploadFile($image, false);
  138. }
  139.  
  140. /** @var News $news */
  141. $news = News::query()->create([
  142. 'user_id' => getUser('id'),
  143. 'title' => $title,
  144. 'text' => $text,
  145. 'closed' => $closed,
  146. 'top' => $top,
  147. 'image' => $file['path'] ?? null,
  148. 'created_at' => SITETIME,
  149. ]);
  150.  
  151. // Выводим на главную если там нет новостей
  152. if ($top && empty(setting('lastnews'))) {
  153. Setting::query()->where('name', 'lastnews')->update(['value' => 1]);
  154. clearCache('settings');
  155. }
  156.  
  157. clearCache(['statNews', 'lastNews']);
  158. setFlash('success', __('news.news_success_added'));
  159. redirect('/admin/news/edit/' . $news->id);
  160. } else {
  161. setInput($request->all());
  162. setFlash('danger', $validator->getErrors());
  163. }
  164. }
  165.  
  166. return view('admin/news/create');
  167. }
  168.  
  169. /**
  170. * Пересчет комментариев
  171. *
  172. * @param Request $request
  173. *
  174. * @return void
  175. */
  176. public function restatement(Request $request): void
  177. {
  178. if (! isAdmin(User::BOSS)) {
  179. abort(403, __('errors.forbidden'));
  180. }
  181.  
  182. if ($request->input('token') === $_SESSION['token']) {
  183. restatement('news');
  184.  
  185. setFlash('success', __('main.success_recounted'));
  186. } else {
  187. setFlash('danger', __('validator.token'));
  188. }
  189.  
  190. redirect('/admin/news');
  191. }
  192.  
  193. /**
  194. * Удаление новостей
  195. *
  196. * @param int $id
  197. * @param Request $request
  198. * @param Validator $validator
  199. *
  200. * @return void
  201. * @throws Exception
  202. */
  203. public function delete(int $id, Request $request, Validator $validator): void
  204. {
  205. $page = int($request->input('page', 1));
  206.  
  207. /** @var News $news */
  208. $news = News::query()->find($id);
  209.  
  210. if (! $news) {
  211. abort(404, __('news.news_not_exist'));
  212. }
  213.  
  214. $validator->equal($request->input('token'), $_SESSION['token'], __('validator.token'));
  215.  
  216. if ($validator->isValid()) {
  217. deleteFile(HOME . $news->image);
  218.  
  219. $news->comments()->delete();
  220. $news->delete();
  221.  
  222. setFlash('success', __('news.news_success_deleted'));
  223. } else {
  224. setFlash('danger', $validator->getErrors());
  225. }
  226.  
  227. redirect('/admin/news?page=' . $page);
  228. }
  229. }