152 lines
5.4 KiB
PHP
152 lines
5.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\MusicProduction;
|
|
use App\Models\Setting;
|
|
use App\Models\FooterTemplate;
|
|
use App\Services\TemplateService;
|
|
use Illuminate\Support\Str;
|
|
|
|
class MusicProductionController extends Controller
|
|
{
|
|
public function index()
|
|
{
|
|
// Get Settings
|
|
$settings = new \stdClass();
|
|
$allSettings = Setting::query()->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
|
|
);
|
|
}
|
|
}
|
|
|
|
$meta = [
|
|
'title' => __('music_productions.nav-music-productions'),
|
|
'description' => __('music_productions.meta-index-description'),
|
|
'image' => asset('assets/music-production.png'),
|
|
];
|
|
|
|
return view('front.music-productions.index', [
|
|
'productions' => $productions,
|
|
'search' => $search,
|
|
'settings' => $settings,
|
|
'header' => 'partials.header-center-nav',
|
|
'renderedFooter' => $renderedFooter,
|
|
'meta' => $meta,
|
|
]);
|
|
}
|
|
|
|
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
|
|
);
|
|
}
|
|
}
|
|
|
|
$meta = [
|
|
'title' => $production->translate('title'),
|
|
'description' => Str::limit(strip_tags($production->translate('content')), 160),
|
|
'image' => $production->cover_image_url,
|
|
];
|
|
|
|
return view('front.music-productions.show', [
|
|
'production' => $production,
|
|
'prev' => $prev,
|
|
'next' => $next,
|
|
'settings' => $settings,
|
|
'header' => 'partials.header-center-nav',
|
|
'renderedFooter' => $renderedFooter,
|
|
'meta' => $meta,
|
|
]);
|
|
}
|
|
}
|