first()) : null; $query = class_exists(Blog::class) ? Blog::with(['category', 'author']) ->withCount('comments') ->published() : null; // Author filtresi if ($query && $request->has('author') && $request->author) { $query = $query->where('author_id', $request->author); } // Category filtresi if ($query && $request->has('category') && $request->category) { $query = $query->whereHas('category', function($q) use ($request) { $q->where('slug', $request->category); }); } // Tag filtresi if ($query && $request->has('tag') && $request->tag) { $query = $query->whereJsonContains('tags', $request->tag); } $posts = $query ? $query->latest('published_at')->paginate(12) : collect(); // Blog sayfa ayarlarını bul (varsa) $blogPage = Page::where('slug', 'blog')->first(); // Render Header Template $renderedHeader = null; $headerTemplate = null; // 1. Öncelik: Blog sayfasında seçili header template if ($blogPage && $blogPage->header_template_id) { $headerTemplate = HeaderTemplate::find($blogPage->header_template_id); } // 2. Öncelik: Varsayılan aktif template (KALDIRILDI - Default static header kullanılmalı) /* if (!$headerTemplate) { $headerTemplate = HeaderTemplate::where('is_active', true) ->latest('updated_at') ->first(); } */ if ($headerTemplate) { $templateDefaults = $headerTemplate->default_data ?? []; $pageData = $blogPage ? ($blogPage->header_data ?? []) : []; $mergedData = array_merge($templateDefaults, $pageData); $renderedHeader = TemplateService::replacePlaceholders( $headerTemplate->html_content, $mergedData, $blogPage ); } // Render Footer Template $renderedFooter = null; $footerTemplate = null; // 1. Öncelik: Blog sayfasında seçili footer template if ($blogPage && $blogPage->footer_template_id) { $footerTemplate = FooterTemplate::find($blogPage->footer_template_id); } // 2. Öncelik: Varsayılan aktif template if (!$footerTemplate) { $footerTemplate = FooterTemplate::where('is_active', true) ->latest('updated_at') ->first(); } if ($footerTemplate) { $templateDefaults = $footerTemplate->default_data ?? []; $pageData = $blogPage ? ($blogPage->footer_data ?? []) : []; $mergedData = array_merge($templateDefaults, $pageData); $renderedFooter = TemplateService::replacePlaceholders( $footerTemplate->html_content, $mergedData, $blogPage ); } // Kategorileri al (filtreleme için) $categories = class_exists(\App\Models\BlogCategory::class) ? \App\Models\BlogCategory::where('is_active', true)->orderBy('sort_order')->get() : collect(); // Elemis Widget'ları için veri hazırlığı $carouselPosts = collect(); $highlightCategories = collect(); $popularPosts = collect(); $sidebarCategories = collect(); $tags = collect(); if (!$request->ajax()) { if (class_exists(Blog::class)) { // Karusel: Öne çıkarılan ya da en güncel 5 yazı $carouselPosts = Blog::with(['category', 'author']) ->published() ->featured() ->latest('published_at') ->take(5) ->get(); if ($carouselPosts->isEmpty()) { $carouselPosts = Blog::with(['category', 'author']) ->published() ->latest('published_at') ->take(5) ->get(); } // Popüler Yazılar: En çok okunan 3 yazı $popularPosts = Blog::with(['category', 'author']) ->published() ->orderBy('view_count', 'desc') ->take(3) ->get(); // Etiket Bulutu: Tüm yayınlanan yazılardaki benzersiz etiketler $allTags = Blog::published() ->whereNotNull('tags') ->pluck('tags'); $tagsCollected = collect(); foreach ($allTags as $postTags) { if (is_array($postTags)) { foreach ($postTags as $tag) { $tagsCollected->push($tag); } } } $tags = $tagsCollected->unique()->take(15); } if (class_exists(\App\Models\BlogCategory::class)) { // Hoş Geldiniz bölümü altındaki 3'lü kategori vurgusu $highlightCategories = \App\Models\BlogCategory::where('is_active', true) ->withCount('blogs') ->has('blogs') ->orderBy('sort_order') ->take(3) ->get(); if ($highlightCategories->count() < 3) { $highlightCategories = \App\Models\BlogCategory::where('is_active', true) ->orderBy('sort_order') ->take(3) ->get(); } // Sidebar Kategorileri: Yazı sayısıyla birlikte $sidebarCategories = \App\Models\BlogCategory::where('is_active', true) ->withCount('blogs') ->orderBy('sort_order') ->get(); } } if ($request->ajax()) { return view('blog.partials.posts', [ 'posts' => $posts ]); } $pageUrl = url()->current(); return view('blog.index', [ 'settings' => $settings, 'posts' => $posts, 'categories' => $categories, 'carouselPosts' => $carouselPosts, 'highlightCategories' => $highlightCategories, 'popularPosts' => $popularPosts, 'sidebarCategories' => $sidebarCategories, 'tags' => $tags, 'renderedHeader' => $renderedHeader, 'renderedFooter' => $renderedFooter, 'meta' => [ 'title' => __('blog.meta-index-title'), 'description' => __('blog.meta-index-description'), ], 'structuredData' => $posts instanceof \Illuminate\Contracts\Pagination\LengthAwarePaginator ? BlogStructuredData::forIndex($posts, $pageUrl) : null, ]); } public function show(string $slug) { $settings = class_exists(Setting::class) ? (Setting::query()->first()) : null; if (!class_exists(Blog::class)) { abort(404); } $post = Blog::with(['category', 'author']) ->withCount('comments') ->published() ->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(); // Blog sayfa ayarlarını bul (varsa) $blogPage = Page::where('slug', 'blog')->first(); // Render Header Template $renderedHeader = null; $headerTemplate = null; // 1. Öncelik: Blog sayfasında seçili header template if ($blogPage && $blogPage->header_template_id) { $headerTemplate = HeaderTemplate::find($blogPage->header_template_id); } if ($headerTemplate) { $templateDefaults = $headerTemplate->default_data ?? []; $pageData = $blogPage ? ($blogPage->header_data ?? []) : []; $mergedData = array_merge($templateDefaults, $pageData); $renderedHeader = TemplateService::replacePlaceholders( $headerTemplate->html_content, $mergedData, $post ); } // Render Footer Template - En son aktif olan footer template'i kullan $renderedFooter = null; $footerTemplate = FooterTemplate::where('is_active', true) ->latest('updated_at') ->first(); if ($footerTemplate) { $templateDefaults = $footerTemplate->default_data ?? []; $renderedFooter = TemplateService::replacePlaceholders( $footerTemplate->html_content, $templateDefaults, $post ); } $pageUrl = route('blog.show', $post->slug); return view('blog.show', [ 'settings' => $settings, 'post' => $post, 'relatedPosts' => $relatedPosts, 'comments' => $comments, 'renderedHeader' => $renderedHeader, 'renderedFooter' => $renderedFooter, 'meta' => [ 'title' => method_exists($post, 'translate') ? ($post->translate('meta_title') ?: $post->translate('title')) : ($post->meta_title ?? $post->title), 'description' => method_exists($post, 'translate') ? ($post->translate('meta_description') ?: $post->translate('excerpt')) : ($post->meta_description ?? $post->excerpt), 'image' => $post->featured_image ? asset('storage/' . $post->featured_image) : null, 'og_type' => 'article', ], 'structuredData' => BlogStructuredData::forShow($post, $pageUrl), ]); } public function storeComment(Request $request, string $slug) { if (!class_exists(Blog::class) || !class_exists(BlogComment::class)) { abort(404); } $post = Blog::published() ->where('slug', $slug) ->firstOrFail(); if (!$post->allow_comments) { return redirect()->route('blog.show', $slug) ->with('error', __('blog.comments_disabled')); } $validator = Validator::make($request->all(), [ 'name' => 'required|string|max:255', 'email' => 'required|email|max:255', 'content' => 'required|string|min:10', 'parent_id' => 'nullable|exists:blog_comments,id', ]); if ($validator->fails()) { return redirect()->route('blog.show', $slug) ->withErrors($validator) ->withInput(); } $comment = BlogComment::create([ 'blog_id' => $post->id, 'name' => $request->name, 'email' => $request->email, 'content' => $request->content, 'parent_id' => $request->parent_id, 'status' => 'pending', // Yorumlar onay bekliyor olarak kaydedilir 'ip_address' => $request->ip(), 'user_agent' => $request->userAgent(), ]); return redirect()->route('blog.show', $slug) ->with('success', __('blog.comment_submitted')); } }