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

Размер файла: 10.57Kb
  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5. namespace App\Controllers\Admin;
  6.  
  7. use App\Classes\Validator;
  8. use App\Models\Sticker;
  9. use App\Models\StickersCategory;
  10. use App\Models\User;
  11. use Exception;
  12. use Illuminate\Database\Capsule\Manager as DB;
  13. use Illuminate\Http\Request;
  14.  
  15. class StickerController extends AdminController
  16. {
  17. /**
  18. * Конструктор
  19. */
  20. public function __construct()
  21. {
  22. parent::__construct();
  23.  
  24. if (! isAdmin(User::ADMIN)) {
  25. abort(403, __('errors.forbidden'));
  26. }
  27. }
  28.  
  29. /**
  30. * Главная страница
  31. *
  32. * @return string
  33. */
  34. public function index(): string
  35. {
  36. $categories = StickersCategory::query()
  37. ->selectRaw('sc.id, sc.name, count(s.id) cnt')
  38. ->from('stickers_categories as sc')
  39. ->leftJoin('stickers as s', 's.category_id', 'sc.id')
  40. ->groupBy('sc.id')
  41. ->orderBy('sc.id')
  42. ->get();
  43.  
  44. return view('admin/stickers/index', compact('categories'));
  45. }
  46.  
  47. /**
  48. * Просмотр стикеров по категориям
  49. *
  50. * @param int $id
  51. *
  52. * @return string
  53. */
  54. public function category(int $id): string
  55. {
  56. $category = StickersCategory::query()->where('id', $id)->first();
  57.  
  58. if (! $category) {
  59. abort(404, __('stickers.category_not_exist'));
  60. }
  61.  
  62. $stickers = Sticker::query()
  63. ->where('category_id', $id)
  64. ->orderBy(DB::connection()->raw('CHAR_LENGTH(code)'))
  65. ->orderBy('name')
  66. ->with('category')
  67. ->paginate(setting('stickerlist'));
  68.  
  69. return view('admin/stickers/category', compact('category', 'stickers'));
  70. }
  71.  
  72. /**
  73. * Создание категории
  74. *
  75. * @param Request $request
  76. * @param Validator $validator
  77. *
  78. * @return void
  79. */
  80. public function create(Request $request, Validator $validator): void
  81. {
  82.  
  83. $name = $request->input('name');
  84.  
  85. $validator->equal($request->input('token'), $_SESSION['token'], __('validator.token'))
  86. ->length($name, 3, 50, ['name' => __('validator.text')]);
  87.  
  88. if ($validator->isValid()) {
  89. /** @var StickersCategory $category */
  90. $category = StickersCategory::query()->create([
  91. 'name' => $name,
  92. 'created_at' => SITETIME,
  93. ]);
  94.  
  95. setFlash('success', __('stickers.category_success_created'));
  96. redirect('/admin/stickers/' . $category->id);
  97. } else {
  98. setInput($request->all());
  99. setFlash('danger', $validator->getErrors());
  100. }
  101.  
  102. redirect('/admin/stickers');
  103. }
  104.  
  105. /**
  106. * Редактирование категории
  107. *
  108. * @param int $id
  109. * @param Request $request
  110. * @param Validator $validator
  111. *
  112. * @return string
  113. */
  114. public function edit(int $id, Request $request, Validator $validator): string
  115. {
  116. $category = StickersCategory::query()->find($id);
  117.  
  118. if (! $category) {
  119. abort(404, __('stickers.category_not_exist'));
  120. }
  121.  
  122. if ($request->isMethod('post')) {
  123. $name = $request->input('name');
  124.  
  125. $validator->equal($request->input('token'), $_SESSION['token'], __('validator.token'))
  126. ->length($name, 3, 50, ['name' => __('validator.text')]);
  127.  
  128. if ($validator->isValid()) {
  129. $category->update([
  130. 'name' => $name,
  131. 'updated_at' => SITETIME,
  132. ]);
  133.  
  134. setFlash('success', __('stickers.category_success_changed'));
  135. redirect('/admin/stickers');
  136. } else {
  137. setInput($request->all());
  138. setFlash('danger', $validator->getErrors());
  139. }
  140. }
  141.  
  142. return view('admin/stickers/edit_category', compact('category'));
  143. }
  144.  
  145. /**
  146. * Удаление категории
  147. *
  148. * @param int $id
  149. * @param Request $request
  150. * @param Validator $validator
  151. *
  152. * @throws Exception
  153. */
  154. public function delete(int $id, Request $request, Validator $validator): void
  155. {
  156. /** @var StickersCategory $category */
  157. $category = StickersCategory::query()->find($id);
  158.  
  159. if (! $category) {
  160. abort(404, __('stickers.category_not_exist'));
  161. }
  162.  
  163. $validator->equal($request->input('token'), $_SESSION['token'], __('validator.token'));
  164.  
  165. $sticker = Sticker::query()->where('category_id', $category->id)->first();
  166. if ($sticker) {
  167. $validator->addError(__('stickers.category_has_stickers'));
  168. }
  169.  
  170. if ($validator->isValid()) {
  171. $category->delete();
  172.  
  173. setFlash('success', __('stickers.category_success_deleted'));
  174. } else {
  175. setFlash('danger', $validator->getErrors());
  176. }
  177.  
  178. redirect('/admin/stickers');
  179. }
  180.  
  181. /**
  182. * Добавление стикера
  183. *
  184. * @param Request $request
  185. * @param Validator $validator
  186. *
  187. * @return string
  188. */
  189. public function createSticker(Request $request, Validator $validator): string
  190. {
  191. $cid = int($request->input('cid'));
  192.  
  193. $categories = StickersCategory::query()->get();
  194.  
  195. if ($categories->isEmpty()) {
  196. abort('default', __('stickers.empty_categories'));
  197. }
  198.  
  199. if (! is_writable(UPLOADS . '/stickers')) {
  200. abort('default', __('main.directory_not_writable'));
  201. }
  202.  
  203. if ($request->isMethod('post')) {
  204. $code = utfLower($request->input('code'));
  205. $sticker = $request->file('sticker');
  206.  
  207. $validator->equal($request->input('token'), $_SESSION['token'], __('validator.token'))
  208. ->length($code, 2, 20, ['code' => __('stickers.sticker_length')])
  209. ->regex($code, '|^:+[a-яa-z0-9_\-/\(\)]+$|i', ['code' => __('stickers.sticker_requirements')]);
  210.  
  211. $category = StickersCategory::query()->where('id', $cid)->first();
  212. $validator->notEmpty($category, ['category' => __('stickers.category_not_exist')]);
  213.  
  214. $duplicate = Sticker::query()->where('code', $code)->first();
  215. $validator->empty($duplicate, ['code' => __('stickers.sticker_exists')]);
  216.  
  217. $rules = [
  218. 'maxsize' => setting('stickermaxsize'),
  219. 'maxweight' => setting('stickermaxweight'),
  220. 'minweight' => setting('stickerminweight'),
  221. ];
  222.  
  223. $validator->file($sticker, $rules, ['sticker' => __('validator.image_upload_failed')]);
  224.  
  225. if ($validator->isValid()) {
  226. $newName = uniqueName($sticker->getClientOriginalExtension());
  227. $path = (new Sticker())->uploadPath . '/' . $newName;
  228. $sticker->move((new Sticker())->uploadPath, $newName);
  229.  
  230. Sticker::query()->create([
  231. 'category_id' => $cid,
  232. 'name' => str_replace(HOME, '', $path),
  233. 'code' => $code,
  234. ]);
  235.  
  236. clearCache('stickers');
  237. setFlash('success', __('stickers.sticker_success_created'));
  238. redirect('/admin/stickers/' . $cid);
  239. } else {
  240. setInput($request->all());
  241. setFlash('danger', $validator->getErrors());
  242. }
  243. }
  244.  
  245. return view('admin/stickers/create_sticker', compact('categories', 'cid'));
  246. }
  247.  
  248. /**
  249. * Редактирование стикера
  250. *
  251. * @param int $id
  252. * @param Request $request
  253. * @param Validator $validator
  254. *
  255. * @return string
  256. */
  257. public function editSticker(int $id, Request $request, Validator $validator): string
  258. {
  259. /** @var Sticker $sticker */
  260. $sticker = Sticker::query()->find($id);
  261. $page = int($request->input('page', 1));
  262.  
  263. if (! $sticker) {
  264. abort(404, __('stickers.sticker_not_exist'));
  265. }
  266.  
  267. if ($request->isMethod('post')) {
  268. $code = utfLower($request->input('code'));
  269. $cid = int($request->input('cid'));
  270.  
  271. $validator->equal($request->input('token'), $_SESSION['token'], __('validator.token'))
  272. ->length($code, 2, 20, ['code' => __('stickers.sticker_length')])
  273. ->regex($code, '|^:+[a-яa-z0-9_\-/\(\)]+$|i', ['code' => __('stickers.sticker_requirements')]);
  274.  
  275. $duplicate = Sticker::query()->where('code', $code)->where('id', '<>', $sticker->id)->first();
  276. $validator->empty($duplicate, ['code' => __('stickers.sticker_exists')]);
  277.  
  278. $category = StickersCategory::query()->where('id', $cid)->first();
  279. $validator->notEmpty($category, ['category' => __('stickers.category_not_exist')]);
  280.  
  281. if ($validator->isValid()) {
  282. $sticker->update([
  283. 'code' => $code,
  284. 'category_id' => $cid,
  285. ]);
  286.  
  287. clearCache('stickers');
  288. setFlash('success', __('stickers.sticker_success_changed'));
  289. redirect('/admin/stickers/' . $cid . '?page=' . $page);
  290. } else {
  291. setInput($request->all());
  292. setFlash('danger', $validator->getErrors());
  293. }
  294. }
  295.  
  296. $categories = StickersCategory::query()->get();
  297.  
  298. return view('admin/stickers/edit_sticker', compact('sticker', 'categories', 'page'));
  299. }
  300.  
  301. /**
  302. * Удаление стикера
  303. *
  304. * @param int $id
  305. * @param Request $request
  306. * @param Validator $validator
  307. *
  308. * @return void
  309. * @throws Exception
  310. */
  311. public function deleteSticker(int $id, Request $request, Validator $validator): void
  312. {
  313. if (! is_writable(UPLOADS . '/stickers')) {
  314. abort('default', __('main.directory_not_writable'));
  315. }
  316.  
  317. $sticker = Sticker::query()->where('id', $id)->first();
  318.  
  319. if (! $sticker) {
  320. abort(404, __('stickers.sticker_not_exist'));
  321. }
  322.  
  323. $page = int($request->input('page', 1));
  324. $category = $sticker->category->id;
  325.  
  326. $validator->equal($request->input('token'), $_SESSION['token'], __('validator.token'));
  327.  
  328. if ($validator->isValid()) {
  329. deleteFile(HOME . $sticker->name);
  330. $sticker->delete();
  331.  
  332. clearCache('stickers');
  333. setFlash('success', __('stickers.sticker_success_deleted'));
  334. } else {
  335. setFlash('danger', $validator->getErrors());
  336. }
  337.  
  338. redirect('/admin/stickers/' . $category . '?page=' . $page);
  339. }
  340. }