feat: add Music Productions module with CRUD resources and frontend views

This commit is contained in:
Ümit Tunç
2026-05-20 22:15:04 +03:00
parent e232d25fc8
commit f35632ee0d
15 changed files with 1210 additions and 1 deletions
@@ -0,0 +1,155 @@
<?php
namespace App\Http\Controllers;
use App\Models\MusicProduction;
use App\Models\Setting;
use App\Models\HeaderTemplate;
use App\Models\FooterTemplate;
use App\Services\TemplateService;
use Illuminate\Http\Request;
class MusicProductionController extends Controller
{
public function index()
{
// Get Settings
$settings = new \stdClass();
$allSettings = Setting::where('is_active', true)->get();
foreach ($allSettings as $setting) {
$settings->{$setting->key} = $setting->value;
}
// Get active music productions
$productions = MusicProduction::active()
->ordered()
->paginate(9); // Using 9 for nice grid layout (3 per row)
// --- Header Logic ---
$renderedHeader = null;
$defaultHeaderId = $settings->default_header ?? null;
if ($defaultHeaderId) {
$headerTemplate = HeaderTemplate::find($defaultHeaderId);
if ($headerTemplate) {
$templateDefaults = $headerTemplate->default_data ?? [];
$mergedHeaderData = array_merge($templateDefaults, []);
$renderedHeader = TemplateService::replacePlaceholders(
$headerTemplate->html_content,
$mergedHeaderData,
null
);
}
}
// --- Footer Logic ---
$renderedFooter = null;
$defaultFooterId = $settings->default_footer ?? null;
if ($defaultFooterId) {
$footerTemplate = FooterTemplate::find($defaultFooterId);
if ($footerTemplate) {
$templateDefaults = $footerTemplate->default_data ?? [];
$mergedFooterData = array_merge($templateDefaults, []);
$renderedFooter = TemplateService::replacePlaceholders(
$footerTemplate->html_content,
$mergedFooterData,
null
);
}
}
$meta = [
'title' => __('music_productions.meta-index-title'),
'description' => __('music_productions.meta-index-description'),
'image' => null,
];
return view('front.music-productions.index', compact('productions', 'settings', 'renderedHeader', 'renderedFooter', 'meta'));
}
public function show($slug)
{
$production = MusicProduction::active()
->where('slug', $slug)
->firstOrFail();
// Get Settings
$settings = new \stdClass();
$allSettings = Setting::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();
// --- Header Logic ---
$renderedHeader = null;
$defaultHeaderId = $settings->default_header ?? null;
if ($defaultHeaderId) {
$headerTemplate = HeaderTemplate::find($defaultHeaderId);
if ($headerTemplate) {
$templateDefaults = $headerTemplate->default_data ?? [];
$mergedHeaderData = array_merge($templateDefaults, []);
$renderedHeader = TemplateService::replacePlaceholders(
$headerTemplate->html_content,
$mergedHeaderData,
$production
);
}
}
// --- Footer Logic ---
$renderedFooter = null;
$defaultFooterId = $settings->default_footer ?? null;
if ($defaultFooterId) {
$footerTemplate = FooterTemplate::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 ? asset('storage/' . $production->cover_image) : null,
];
return view('front.music-productions.show', compact('production', 'prev', 'next', 'settings', 'renderedHeader', 'renderedFooter', 'meta'));
}
}