feat: add Music Productions module with CRUD resources and frontend views
This commit is contained in:
@@ -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'));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user