From 4bdcf66c9952b59d1cb3ea8dc7f273d6727979fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=9Cmit=20Tun=C3=A7?= Date: Thu, 6 Nov 2025 16:59:25 -0300 Subject: [PATCH] Implement Commenting Feature in Blog: Enhanced BlogController to handle comments by adding a new storeComment method. Updated blog show view to display approved comments and related posts, improving user engagement and content interaction. Added routes for comment submission, ensuring a complete commenting system. --- app/Http/Controllers/BlogController.php | 41 +++ resources/views/blog/show.blade.php | 411 +++++++++++++++++++++++- routes/web.php | 1 + 3 files changed, 440 insertions(+), 13 deletions(-) diff --git a/app/Http/Controllers/BlogController.php b/app/Http/Controllers/BlogController.php index 2065556..7a57da2 100644 --- a/app/Http/Controllers/BlogController.php +++ b/app/Http/Controllers/BlogController.php @@ -4,9 +4,12 @@ namespace App\Http\Controllers; use App\Models\Setting; use App\Models\Blog; +use App\Models\BlogComment; use App\Models\HeaderTemplate; use App\Models\FooterTemplate; use App\Services\TemplateService; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\Validator; class BlogController extends Controller { @@ -73,6 +76,42 @@ class BlogController extends Controller ->where('slug', $slug) ->firstOrFail(); + // İlgili blog gönderilerini al (aynı kategoriden, mevcut gönderi hariç) + $relatedPosts = Blog::with(['category', 'author']) + ->withCount('comments') + ->published() + ->where('id', '!=', $post->id) + ->when($post->category_id, function($query) use ($post) { + return $query->where('category_id', $post->category_id); + }) + ->latest('published_at') + ->limit(4) + ->get(); + + // Eğer aynı kategoriden yeterli gönderi yoksa, diğer kategorilerden ekle + if ($relatedPosts->count() < 4) { + $additionalPosts = Blog::with(['category', 'author']) + ->withCount('comments') + ->published() + ->where('id', '!=', $post->id) + ->whereNotIn('id', $relatedPosts->pluck('id')) + ->latest('published_at') + ->limit(4 - $relatedPosts->count()) + ->get(); + + $relatedPosts = $relatedPosts->merge($additionalPosts); + } + + // Onaylanmış yorumları al (parent yorumlar ve reply'leri ile) + $comments = $post->comments() + ->approved() + ->whereNull('parent_id') + ->with(['replies' => function($query) { + $query->approved()->orderBy('created_at', 'asc'); + }]) + ->orderBy('created_at', 'desc') + ->get(); + // Render Header Template - En son aktif olan header template'i kullan $renderedHeader = null; $headerTemplate = HeaderTemplate::where('is_active', true) @@ -106,6 +145,8 @@ class BlogController extends Controller return view('blog.show', [ 'settings' => $settings, 'post' => $post, + 'relatedPosts' => $relatedPosts, + 'comments' => $comments, 'renderedHeader' => $renderedHeader, 'renderedFooter' => $renderedFooter, 'meta' => [ diff --git a/resources/views/blog/show.blade.php b/resources/views/blog/show.blade.php index 16d87c3..ad4bc94 100644 --- a/resources/views/blog/show.blade.php +++ b/resources/views/blog/show.blade.php @@ -1,17 +1,402 @@ @extends('layouts.site') @section('content') -
-
-

{{ method_exists($post, 'translate') ? $post->translate('title') : $post->title }}

- @if(!empty($post->featured_image_url)) - {{ method_exists($post, 'translate') ? $post->translate('title') : $post->title }} - @endif -
- {!! method_exists($post, 'translate') ? $post->translate('content') : ($post->content ?? '') !!} -
-
-
+
+
+
+
+
+ @if($post->category) + + @endif + +

+ {{ method_exists($post, 'translate') ? $post->translate('title') : $post->title }} +

+ + +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+ @if($post->featured_image_url) +
+ {{ method_exists($post, 'translate') ? $post->translate('title') : $post->title }} +
+ @endif +
+
+
+
+
+ {!! method_exists($post, 'translate') ? $post->translate('content') : ($post->content ?? '') !!} +
+
+ + + +
+ +
+ +
+ @if($post->author) +
+
+
+ @if($post->author->avatar) + image + @else + image + @endif +
+
+
+ {{ $post->author->name }} +
+ {{ $post->author->role ?? __('blog.author') }} +
+
+ +
+ +

{{ method_exists($post, 'translate') ? $post->translate('excerpt') : ($post->excerpt ?? '') }}

+ + @if($post->author->social_links ?? false) + + + @endif + @endif +
+ @if($relatedPosts && $relatedPosts->count() > 0) +

{{ __('blog.you_might_also_like') }}

+
+
+
+ @foreach($relatedPosts as $relatedPost) + @php + $relatedTitle = method_exists($relatedPost, 'translate') ? $relatedPost->translate('title') : $relatedPost->title; + $relatedCategoryName = $relatedPost->category ? $relatedPost->category->name : ''; + $relatedImageUrl = $relatedPost->featured_image ? asset('storage/' . $relatedPost->featured_image) : asset('assets/img/photos/b4.jpg'); + $relatedUrl = route('blog.show', $relatedPost->slug); + $relatedDate = $relatedPost->published_at ? $relatedPost->published_at->format('d M Y') : $relatedPost->created_at->format('d M Y'); + $relatedCommentCount = $relatedPost->comments_count ?? 0; + @endphp +
+ + +
+ + @endforeach +
+ +
+ +
+
+
+
+ + @endif +
+ @if($post->allow_comments) +
+

{{ $comments->count() }} {{ __('blog.comments') }}

+ @if($comments->count() > 0) +
    + @foreach($comments as $comment) +
  1. +
    +
    +
    + image +
    +
    +
    + {{ $comment->name }} +
    +
      +
    • + + {{ $comment->created_at->format('d M Y') }} +
    • +
    + +
    + +
    + + + +
    + +

    {{ $comment->content }}

    + @if($comment->replies && $comment->replies->count() > 0) +
      + @foreach($comment->replies as $reply) +
    • +
      +
      +
      + image +
      +
      +
      + {{ $reply->name }} +
      +
        +
      • + + {{ $reply->created_at->format('d M Y') }} +
      • +
      + +
      + +
      + + + +
      + +

      {{ $reply->content }}

      + @if($reply->replies && $reply->replies->count() > 0) + + @endif +
    • + @endforeach +
    + @endif +
  2. + @endforeach +
+ @endif +
+ +
+

{{ __('blog.share_thoughts') }}

+

{{ __('blog.comment_form_description') }}

+
+ @csrf + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+ @if($errors->any()) +
+
    + @foreach($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + +
+ + @endif +
+ +
+ +
+ +
+ +
+ +
+ +
@endsection - - diff --git a/routes/web.php b/routes/web.php index 69f1e62..b605d17 100644 --- a/routes/web.php +++ b/routes/web.php @@ -74,6 +74,7 @@ Route::get('/', [PageController::class, 'index'])->name('homepage'); // Blog Route::get('/blog', [BlogController::class, 'index'])->name('blog.index'); Route::get('/blog/{slug}', [BlogController::class, 'show'])->name('blog.show'); +Route::post('/blog/{slug}/comment', [BlogController::class, 'storeComment'])->name('blog.comment.store'); // Template Preview (admin panel için) Route::post('/admin/template-preview', [TemplatePreviewController::class, 'preview'])