From 22c5682dbfff70fb5f80335754fce7c3741926f4 Mon Sep 17 00:00:00 2001 From: SadElephant Date: Tue, 7 Nov 2023 18:39:58 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=82=D1=8C=D0=B8=20?= =?UTF-8?q?=D0=B8=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D1=80=D0=BE=D1=84?= =?UTF-8?q?=D0=B8=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/PostController.php | 35 ++++-- .../Controllers/ProfileCommentsController.php | 80 ++++++++++++++ app/Http/Controllers/ProfileController.php | 49 +++++++-- app/Policies/OwnerPolicy.php | 41 +++++++ app/Policies/PostPolicy.php | 9 ++ composer.json | 2 +- composer.lock | 12 +-- .../views/pages/profile/profile.blade.php | 42 +++----- .../views/pages/profile/tabs/base.blade.php | 28 +++++ .../pages/profile/tabs/comments-tab.blade.php | 43 ++++++++ .../tabs/particles/comments/comment.blade.php | 69 ++++++++++++ .../pages/profile/tabs/posts-tab.blade.php | 6 ++ .../views/particles/posts/list.blade.php | 101 ++++++++++++++++++ resources/views/post/list.blade.php | 66 +----------- routes/web.php | 36 ++++++- 15 files changed, 503 insertions(+), 116 deletions(-) create mode 100644 app/Http/Controllers/ProfileCommentsController.php create mode 100644 app/Policies/OwnerPolicy.php create mode 100644 app/Policies/PostPolicy.php create mode 100644 resources/views/pages/profile/tabs/base.blade.php create mode 100644 resources/views/pages/profile/tabs/comments-tab.blade.php create mode 100644 resources/views/pages/profile/tabs/particles/comments/comment.blade.php create mode 100644 resources/views/pages/profile/tabs/posts-tab.blade.php create mode 100644 resources/views/particles/posts/list.blade.php diff --git a/app/Http/Controllers/PostController.php b/app/Http/Controllers/PostController.php index b41c4f49..02f386b8 100644 --- a/app/Http/Controllers/PostController.php +++ b/app/Http/Controllers/PostController.php @@ -4,11 +4,15 @@ use App\Models\Post; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; use Illuminate\View\View; use Illuminate\Support\Facades\Response; +use Illuminate\Database\Eloquent\Builder; class PostController extends Controller { + public $action = "append"; + /** * @param \App\Models\Post $post * @@ -19,13 +23,13 @@ public function show(Post $post) $post->with('comments'); return view('post.show', [ - 'post' => $post, + 'post' => $post, ]); } public function edit(Post $post): View { - //нужно будет проверять аавтора, если пост существует + $this->authorize('isOwner', $post); $title = $post->exists ? 'Редактирование' : 'Новая статья'; return view('post.edit', [ @@ -36,7 +40,7 @@ public function edit(Post $post): View public function update(Request $request, Post $post) { - //нужно проверять аавтора, если пост существует + $this->authorize('isOwner', $post); $request->validate([ 'title' => 'required|string', @@ -54,6 +58,19 @@ public function update(Request $request, Post $post) return redirect()->route('post.edit', $post);//пока сюда } + public function delete(Request $request, Post $post) + { + $this->authorize('isOwner', $post); + + $post->delete(); + $this->action = "replace"; + + //сюда поставить уведомление + + return $this->list($request);//пока сюда + } + + /** * @param \Illuminate\Http\Request $request * @@ -63,13 +80,17 @@ public function list(Request $request) { $posts = Post::with(['user']) ->withCount('comments') + ->when($request->has('user_id'), fn(Builder $query) => $query->where('user_id', $request->get('user_id'))) ->orderBy('id', 'desc') - ->simplePaginate(5); + ->cursorPaginate(3); - $test = view('post.list', [ - 'posts' => $posts, + $test = view('particles.posts.list', [ + 'posts' => $posts, + 'isMyProfile' => $request->has('user_id') && $request->user()?->id == $request->get('user_id'), + 'action' => $this->action ])->fragmentsIf(!$request->isMethodSafe()); - return $test; + return $test; } + } diff --git a/app/Http/Controllers/ProfileCommentsController.php b/app/Http/Controllers/ProfileCommentsController.php new file mode 100644 index 00000000..d05a8099 --- /dev/null +++ b/app/Http/Controllers/ProfileCommentsController.php @@ -0,0 +1,80 @@ + $user->comments()->latest()->get(), + 'user' => $user, + 'active' => 'comments' + ]) + )->fragmentIf(!request()->isMethod('GET'), 'comments'); + } + + + /** + * @param \App\Models\Comment $comment + * + * @return string + */ + public function showEdit(Comment $comment) + { + return $this->show($comment->commenter, [ + 'edit' => $comment->getKey(), + ]); + } + + + /** + * @param \Illuminate\Http\Request $request + * @param \App\Models\Comment $comment + * + * @return string + */ + public function update(Request $request, Comment $comment) + { + $this->authorize('update', $comment); + + $request->validate([ + 'message' => 'required|string', + ]); + + $comment->update([ + 'comment' => $request->message, + ]); + + return $this->show($comment->commenter); + } + + /** + * @param \App\Models\Comment $comment + * + * @return string + */ + public function delete(Comment $comment) + { + $this->authorize('delete', $comment); + + $comment->children()->exists() + ? $comment->delete() + : $comment->forceDelete(); + + return $this->show($comment->commenter); + } + +} diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index 788bd7c8..dcf75325 100644 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Models\Post; use App\Models\User; use Illuminate\Http\Request; @@ -15,7 +16,7 @@ class ProfileController extends Controller */ public function show(User $user, Request $request) { - $isMyAccount = $user->id === $request->user()->id; + $isMyAccount = $user->id === $request->user()?->id; $posts = $user->load('posts') ->orderBy('id', 'desc') @@ -25,28 +26,31 @@ public function show(User $user, Request $request) 'user' => $user, 'isMyAccount' => $isMyAccount, 'posts' => $posts, + 'active' => 'posts' ]); } - public function edit(Request $request){ - + public function edit(Request $request) + { return view('pages.profile.edit', [ - 'user' => $request->user(), + 'user' => $request->user(), ]); } public function update(Request $request) { - $request->validate([ - 'name' => 'required|string', - 'about'=> 'required|string' - ], + $request->validate( + [ + 'name' => 'required|string', + 'about' => 'sometimes|string' + ], [], [ - 'name' => 'Имя', + 'name' => 'Имя', 'about' => 'О себе' - ]); + ] + ); $request->user()->fill([ 'name' => $request->input('name'), @@ -54,4 +58,29 @@ public function update(Request $request) ])->save(); return $this->edit($request)->fragment('profile'); } + + /** + * @param \Illuminate\Http\Request $request + * + * @return string + */ + public function postTab(Request $request, User $user) + { + return view('pages.profile.tabs.posts-tab', [ + 'user' => $user, + 'active' => 'posts' + ])->fragmentsIf(!$request->isMethodSafe()); + } + + public function commentsTab(User $user, array $data = []) + { + return view( + 'pages.profile.tabs.comments-tab', + array_merge($data, [ + 'user' => $user, + 'active' => 'comments' + ]) + ) + ->fragmentIf(!request()->isMethod('GET'), 'comments'); + } } diff --git a/app/Policies/OwnerPolicy.php b/app/Policies/OwnerPolicy.php new file mode 100644 index 00000000..92060af2 --- /dev/null +++ b/app/Policies/OwnerPolicy.php @@ -0,0 +1,41 @@ +id === $model->user_id) || is_null($model->user_id) + ? Response::allow() + : Response::denyAsNotFound(); + } + + /** + * Determine whether the user can view the model. + * + * @param User $user + * @param Model $model + * + * @return bool + */ + public function isOwner(User $user, Model $model): bool + { + return is_null($model->user_id) || ($user->id === $model->user_id); + } +} diff --git a/app/Policies/PostPolicy.php b/app/Policies/PostPolicy.php new file mode 100644 index 00000000..c52e8a0d --- /dev/null +++ b/app/Policies/PostPolicy.php @@ -0,0 +1,9 @@ +
+
@@ -19,6 +20,7 @@
+

{{ $user->name }} @@ -26,46 +28,34 @@ На проекте с 23 мая 2022

-
+
+ @if ($isMyAccount) + + + Выйти из профиля + Редактировать + @else + + + + - - - Выйти из профиля - @endif
-

Тут будут награды пользователя:

- @if ($isMyAccount) -
-
-
- Напишите первую статью, чтобы привлечь читателей -
- -
-
- @else -
-
-
- Здесь еще нет публикаций -
-
-
- @endif + + + @endsection diff --git a/resources/views/pages/profile/tabs/base.blade.php b/resources/views/pages/profile/tabs/base.blade.php new file mode 100644 index 00000000..4ddc3b2d --- /dev/null +++ b/resources/views/pages/profile/tabs/base.blade.php @@ -0,0 +1,28 @@ + + + + +
+ @yield('tab') +
+
diff --git a/resources/views/pages/profile/tabs/comments-tab.blade.php b/resources/views/pages/profile/tabs/comments-tab.blade.php new file mode 100644 index 00000000..94dc3586 --- /dev/null +++ b/resources/views/pages/profile/tabs/comments-tab.blade.php @@ -0,0 +1,43 @@ +@extends('pages.profile.tabs.base') + +@section('tab') + @if($comments->isEmpty()) + @if ($isMyAccount) +
+
+
+ Вы не написали ни одного комментария +
+ +
+
+ @else +
+
+
+ Этот пользователь не оставил ни одного комментария +
+
+
+ @endif + @else + + + + +
+
+ @foreach($comments as $comment) + @include('pages.profile.tabs.particles.comments.comment', [ + 'comment' => $comment, + 'edit' => $edit ?? null, + ]) + @endforeach +
+
+
+
+ @endif +@endsection diff --git a/resources/views/pages/profile/tabs/particles/comments/comment.blade.php b/resources/views/pages/profile/tabs/particles/comments/comment.blade.php new file mode 100644 index 00000000..26aa47a2 --- /dev/null +++ b/resources/views/pages/profile/tabs/particles/comments/comment.blade.php @@ -0,0 +1,69 @@ +
+ +
+
+ + {{ $comment->commenter->name }} + +
+ +
+ + + + @if($edit === $comment->getKey()) +
+ @method('PUT') + +
+ +
+
+ @else +

{!! $comment->prettyComment() !!}

+ @endif + + +
+
+ +
diff --git a/resources/views/pages/profile/tabs/posts-tab.blade.php b/resources/views/pages/profile/tabs/posts-tab.blade.php new file mode 100644 index 00000000..ba428458 --- /dev/null +++ b/resources/views/pages/profile/tabs/posts-tab.blade.php @@ -0,0 +1,6 @@ + +@extends('pages.profile.tabs.base') + +@section('tab') + +@endsection diff --git a/resources/views/particles/posts/list.blade.php b/resources/views/particles/posts/list.blade.php new file mode 100644 index 00000000..60200d43 --- /dev/null +++ b/resources/views/particles/posts/list.blade.php @@ -0,0 +1,101 @@ + + + @if($posts->isEmpty()) +
+
+ @if ($isMyProfile) +
+ Напишите первую статью, чтобы привлечь читателей +
+ + + @else + +
+ Здесь еще нет публикаций +
+ @endif +
+
+ @else + @foreach ($posts as $post) +
+ +
+
+
+ + {{ $post->user->title }} + +
+ +
+
+ {{ $post->user->name }} +
+

Разработчик laravel.su

+
+
+ +
+ +
+ + +

{{ $post->title }}

+ +

{{ $post->preview() }}

+
+ +
+ + + + ~56 + + + + + {{ $post->comments_count }} + + + {{ $post->created_at->diffForHumans() }} +
+
+ @endforeach + @endif +
+ + + @if ($posts->hasMorePages()) +
+ +
+ @endif +
+
diff --git a/resources/views/post/list.blade.php b/resources/views/post/list.blade.php index 675223ae..1920ec9f 100644 --- a/resources/views/post/list.blade.php +++ b/resources/views/post/list.blade.php @@ -4,7 +4,7 @@
+ style="background-image: url('/img/fire.svg'); background-repeat: no-repeat; background-position: right bottom">