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

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