where('is_active', true)->get(); foreach ($allSettings as $setting) { $settings->{$setting->key} = $setting->value; } $search = trim((string) request('q', '')); $productionsQuery = MusicProduction::active()->ordered(); if ($search !== '') { $locale = app()->getLocale(); $productionsQuery->where(function ($query) use ($search, $locale) { $query->where('title', 'like', "%{$search}%") ->orWhere('client_name', 'like', "%{$search}%") ->orWhere('slug', 'like', "%{$search}%") ->orWhereHas('translations', function ($translationQuery) use ($search, $locale) { $translationQuery ->where('status', 'published') ->whereIn('field_name', ['title', 'client_name', 'content']) ->where('field_value', 'like', "%{$search}%") ->where('language_code', $locale); }); }); } $productions = $productionsQuery->paginate(9)->withQueryString(); // --- Footer Logic --- $renderedFooter = null; $defaultFooterId = $settings->default_footer ?? null; if ($defaultFooterId) { $footerTemplate = FooterTemplate::query()->find($defaultFooterId); if ($footerTemplate) { $templateDefaults = $footerTemplate->default_data ?? []; $mergedFooterData = array_merge($templateDefaults, []); $renderedFooter = TemplateService::replacePlaceholders( $footerTemplate->html_content, $mergedFooterData, null ); } } $canonicalUrl = route('music-productions.index'); $pageUrl = $search !== '' ? $canonicalUrl : url()->current(); $meta = [ 'title' => __('music_productions.meta-index-title'), 'description' => __('music_productions.meta-index-description'), 'image' => asset('assets/music-production.png'), 'image_alt' => __('music_productions.meta-index-title'), 'canonical' => $canonicalUrl, 'robots' => $search !== '' ? 'noindex, follow' : 'index, follow', 'og_type' => 'website', 'locale' => app()->getLocale(), ]; $structuredData = MusicProductionStructuredData::forIndex($productions, $pageUrl); return view('front.music-productions.index', [ 'productions' => $productions, 'search' => $search, 'settings' => $settings, 'header' => 'partials.header-center-nav', 'renderedFooter' => $renderedFooter, 'meta' => $meta, 'structuredData' => $structuredData, ]); } public function show($slug) { $production = MusicProduction::active() ->where('slug', $slug) ->firstOrFail(); // Get Settings $settings = new \stdClass(); $allSettings = Setting::query()->where('is_active', true)->get(); foreach ($allSettings as $setting) { $settings->{$setting->key} = $setting->value; } // Fetch adjacent posts (Prev and Next) $prev = MusicProduction::active() ->where(function($q) use ($production) { $q->where('sort_order', '<', $production->sort_order) ->orWhere(function($sub) use ($production) { $sub->where('sort_order', $production->sort_order) ->where('id', '<', $production->id); }); }) ->orderBy('sort_order', 'desc') ->orderBy('id', 'desc') ->first(); $next = MusicProduction::active() ->where(function($q) use ($production) { $q->where('sort_order', '>', $production->sort_order) ->orWhere(function($sub) use ($production) { $sub->where('sort_order', $production->sort_order) ->where('id', '>', $production->id); }); }) ->orderBy('sort_order', 'asc') ->orderBy('id', 'asc') ->first(); // --- Footer Logic --- $renderedFooter = null; $defaultFooterId = $settings->default_footer ?? null; if ($defaultFooterId) { $footerTemplate = FooterTemplate::query()->find($defaultFooterId); if ($footerTemplate) { $templateDefaults = $footerTemplate->default_data ?? []; $mergedFooterData = array_merge($templateDefaults, []); $renderedFooter = TemplateService::replacePlaceholders( $footerTemplate->html_content, $mergedFooterData, $production ); } } $pageUrl = route('music-productions.show', $production->slug); $title = $production->translate('title'); $description = Str::limit(strip_tags((string) $production->translate('content')), 160) ?: __('music_productions.meta-index-description'); $meta = [ 'title' => $title, 'description' => $description, 'image' => $production->cover_image_url ?: asset('assets/music-production.png'), 'image_alt' => $title, 'canonical' => $pageUrl, 'robots' => 'index, follow', 'og_type' => 'article', 'locale' => app()->getLocale(), ]; $structuredData = MusicProductionStructuredData::forShow($production, $pageUrl); return view('front.music-productions.show', [ 'production' => $production, 'prev' => $prev, 'next' => $next, 'settings' => $settings, 'header' => 'partials.header-center-nav', 'renderedFooter' => $renderedFooter, 'meta' => $meta, 'structuredData' => $structuredData, ]); } }