ArticleController.php 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. use App\Models\Article;
  5. class ArticleController extends Controller
  6. {
  7. function published() {
  8. return view("published", ["rows" => Article::published()->get()]);
  9. }
  10. function index() {
  11. $all = Article::all()->groupBy("status");
  12. $args = [
  13. "drafts" => $all[Article::STATUS_DRAFT] ?? null,
  14. "pending" => $all[Article::STATUS_PENDING] ?? null,
  15. "published" => $all[Article::STATUS_PUBLISHED] ?? null,
  16. "archive" => $all[Article::STATUS_ARCHIVE] ?? null
  17. ];
  18. return view("articles", $args);
  19. }
  20. function add() {
  21. return view("add_article_form");
  22. }
  23. function view(Article $article) {
  24. return view("article", [
  25. "article" => $article->load([
  26. "comments" => function($query) { $query->published()->recent(); }
  27. ])
  28. ]);
  29. }
  30. function edit(Article $article) {
  31. return view("edit_article_form", ["article" => $article]);
  32. }
  33. function store(Request $request) {
  34. $request->validate([
  35. "id" => "nullable|exists:articles",
  36. "title" => "required",
  37. "description" => "nullable",
  38. "content" => "required",
  39. "status" => "required",
  40. "publish_at" => "nullable",
  41. "unpublish_at" => "nullable"
  42. ], [
  43. "name" => "Публикация должна иметь название.",
  44. "content" => "Публикация должна иметь текст."
  45. ]);
  46. $arr = $request;
  47. if ($arr->status == Article::STATUS_PENDING and !$arr->publish_at) {
  48. return back()->withInput()->withErrors([
  49. "publish_at" => "Должны быть указаны дата и время публикации."
  50. ]);
  51. }
  52. $article = Article::find($arr->id) ?? new Article;
  53. $article->title = $arr->title;
  54. $article->description = $arr->description ?? explode(".", $arr->content)[0];
  55. $article->content = $arr->content;
  56. $article->status = $arr->status;
  57. $article->publish_at = $arr->publish_at ?? ($arr->status == Article::STATUS_PUBLISHED ? now() : null);
  58. $article->unpublish_at = $arr->unpublish_at;
  59. $article->save();
  60. return view("success");
  61. }
  62. function comment(Article $article, Request $request) {
  63. $request->validate([
  64. "name" => "required",
  65. "email" => "required|email",
  66. "content" => "required"
  67. ], [
  68. "name" => "Укажите ваше имя.",
  69. "email" => "Укажите ваш email.",
  70. "content" => "Введите комментарий."
  71. ]);
  72. $arr = $request;
  73. $article->comments()->create([
  74. "name" => $arr->name,
  75. "email" => $arr->email,
  76. "content" => $arr->content
  77. ]);
  78. return view("success");
  79. }
  80. function drop(Article $article) {
  81. $article->delete();
  82. return view("success");
  83. }
  84. }