From f35632ee0d34d2f0ce310457b82fde8b3ac6ecbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=9Cmit=20Tun=C3=A7?= Date: Wed, 20 May 2026 22:15:04 +0300 Subject: [PATCH] feat: add Music Productions module with CRUD resources and frontend views --- .../MusicProductionResource.php | 73 ++++++++ .../Pages/CreateMusicProduction.php | 33 ++++ .../Pages/EditMusicProduction.php | 86 +++++++++ .../Pages/ListMusicProductions.php | 25 +++ .../Schemas/MusicProductionForm.php | 142 ++++++++++++++ .../Tables/MusicProductionsTable.php | 92 +++++++++ .../Controllers/MusicProductionController.php | 155 ++++++++++++++++ app/Models/MusicProduction.php | 67 +++++++ ..._190658_create_music_productions_table.php | 40 ++++ lang/en/music_productions.php | 78 ++++++++ lang/tr/music_productions.php | 78 ++++++++ .../front/music-productions/index.blade.php | 174 ++++++++++++++++++ .../front/music-productions/show.blade.php | 162 ++++++++++++++++ .../templates/home/services-cards.blade.php | 2 +- routes/web.php | 4 + 15 files changed, 1210 insertions(+), 1 deletion(-) create mode 100644 app/Filament/Admin/Resources/MusicProductions/MusicProductionResource.php create mode 100644 app/Filament/Admin/Resources/MusicProductions/Pages/CreateMusicProduction.php create mode 100644 app/Filament/Admin/Resources/MusicProductions/Pages/EditMusicProduction.php create mode 100644 app/Filament/Admin/Resources/MusicProductions/Pages/ListMusicProductions.php create mode 100644 app/Filament/Admin/Resources/MusicProductions/Schemas/MusicProductionForm.php create mode 100644 app/Filament/Admin/Resources/MusicProductions/Tables/MusicProductionsTable.php create mode 100644 app/Http/Controllers/MusicProductionController.php create mode 100644 app/Models/MusicProduction.php create mode 100644 database/migrations/2026_05_20_190658_create_music_productions_table.php create mode 100644 lang/en/music_productions.php create mode 100644 lang/tr/music_productions.php create mode 100644 resources/views/front/music-productions/index.blade.php create mode 100644 resources/views/front/music-productions/show.blade.php diff --git a/app/Filament/Admin/Resources/MusicProductions/MusicProductionResource.php b/app/Filament/Admin/Resources/MusicProductions/MusicProductionResource.php new file mode 100644 index 0000000..da0fbaa --- /dev/null +++ b/app/Filament/Admin/Resources/MusicProductions/MusicProductionResource.php @@ -0,0 +1,73 @@ + ListMusicProductions::route('/'), + 'create' => CreateMusicProduction::route('/create'), + 'edit' => EditMusicProduction::route('/{record}/edit'), + ]; + } + + public static function getRecordRouteBindingEloquentQuery(): Builder + { + return parent::getRecordRouteBindingEloquentQuery() + ->withoutGlobalScopes([ + SoftDeletingScope::class, + ]); + } +} diff --git a/app/Filament/Admin/Resources/MusicProductions/Pages/CreateMusicProduction.php b/app/Filament/Admin/Resources/MusicProductions/Pages/CreateMusicProduction.php new file mode 100644 index 0000000..d39e604 --- /dev/null +++ b/app/Filament/Admin/Resources/MusicProductions/Pages/CreateMusicProduction.php @@ -0,0 +1,33 @@ +getResource()::getUrl('index'); + } + + protected function getCreatedNotificationTitle(): ?string + { + return __('music_productions.created_successfully'); + } + + protected function afterCreate(): void + { + // Save translations + TranslationTabs::saveTranslations($this->record, $this->form->getState()); + } +} diff --git a/app/Filament/Admin/Resources/MusicProductions/Pages/EditMusicProduction.php b/app/Filament/Admin/Resources/MusicProductions/Pages/EditMusicProduction.php new file mode 100644 index 0000000..ab92a37 --- /dev/null +++ b/app/Filament/Admin/Resources/MusicProductions/Pages/EditMusicProduction.php @@ -0,0 +1,86 @@ +label(__('music_productions.save')) + ->action('save') + ->keyBindings(['mod+s']) + ->color('primary') + ->size('sm'), + Action::make('cancel') + ->label(__('music_productions.cancel')) + ->url($this->getResource()::getUrl('index')) + ->color('gray') + ->size('sm'), + DeleteAction::make() + ->label(__('music_productions.delete')) + ->size('sm'), + RestoreAction::make() + ->label(__('music_productions.restore')) + ->size('sm'), + ForceDeleteAction::make() + ->label(__('music_productions.force_delete')) + ->size('sm'), + ]; + } + + protected function getFormActions(): array + { + return []; // Hide standard bottom save/cancel buttons + } + + protected function getRedirectUrl(): string + { + return $this->getResource()::getUrl('index'); + } + + protected function getSavedNotificationTitle(): ?string + { + return __('music_productions.updated_successfully'); + } + + protected function mutateFormDataBeforeFill(array $data): array + { + // Load existing translations + $translationData = TranslationTabs::fillFromRecord($this->record); + + \Log::info('Loading translations for music production edit', [ + 'production_id' => $this->record->id, + 'translations' => $translationData + ]); + + return array_merge($data, $translationData); + } + + protected function afterSave(): void + { + \Log::info('Saving music production translations', [ + 'production_id' => $this->record->id, + 'form_state' => $this->form->getState() + ]); + + // Save translations + TranslationTabs::saveTranslations($this->record, $this->form->getState()); + } +} diff --git a/app/Filament/Admin/Resources/MusicProductions/Pages/ListMusicProductions.php b/app/Filament/Admin/Resources/MusicProductions/Pages/ListMusicProductions.php new file mode 100644 index 0000000..833fc92 --- /dev/null +++ b/app/Filament/Admin/Resources/MusicProductions/Pages/ListMusicProductions.php @@ -0,0 +1,25 @@ +label(__('music_productions.create')), + ]; + } +} diff --git a/app/Filament/Admin/Resources/MusicProductions/Schemas/MusicProductionForm.php b/app/Filament/Admin/Resources/MusicProductions/Schemas/MusicProductionForm.php new file mode 100644 index 0000000..a59436e --- /dev/null +++ b/app/Filament/Admin/Resources/MusicProductions/Schemas/MusicProductionForm.php @@ -0,0 +1,142 @@ +columns(3) + ->schema([ + // Sol Kolon - Ana İçerik (2 sütun genişliğinde) + Section::make(__('music_productions.content_section')) + ->schema([ + TextInput::make('title') + ->label(__('music_productions.title_field')) + ->required() + ->maxLength(255) + ->live(onBlur: true) + ->afterStateUpdated(function (string $operation, $state, callable $set) { + if ($operation !== 'create') { + return; + } + $set('slug', \Str::slug($state)); + }), + + TextInput::make('slug') + ->label(__('music_productions.slug_field')) + ->required() + ->maxLength(255) + ->unique(ignoreRecord: true) + ->rules(['alpha_dash']) + ->helperText(__('music_productions.slug_helper')), + + TextInput::make('client_name') + ->label(__('music_productions.client_name_field')) + ->maxLength(255), + + RichEditor::make('content') + ->label(__('music_productions.content_field')) + ->fileAttachmentsDisk('public') + ->fileAttachmentsDirectory('music-productions') + ->fileAttachmentsVisibility('public') + ->columnSpanFull(), + ]) + ->columnSpan(2) + ->collapsible(false), + + // Sağ Kolon - Ayarlar (1 sütun genişliğinde) + Section::make(__('music_productions.settings_section')) + ->schema([ + FileUpload::make('cover_image') + ->label(__('music_productions.cover_image_field')) + ->image() + ->disk('public') + ->directory('music-productions/covers') + ->visibility('public') + ->imageEditor() + ->imageEditorAspectRatios([ + '16:9', + '4:3', + '1:1', + ]) + ->helperText(__('music_productions.cover_image_helper')) + ->columnSpanFull(), + + DatePicker::make('production_date') + ->label(__('music_productions.production_date_field')) + ->displayFormat('d.m.Y') + ->helperText(__('music_productions.production_date_helper')) + ->columnSpanFull(), + + TextInput::make('sort_order') + ->label(__('music_productions.sort_order_field')) + ->numeric() + ->default(0) + ->columnSpanFull(), + + Checkbox::make('is_active') + ->label(__('music_productions.is_active_field')) + ->default(true) + ->helperText(__('music_productions.is_active_helper')) + ->columnSpanFull(), + ]) + ->columnSpan(1) + ->collapsible(false), + + // Alt Kısım - Galeri Görselleri + Section::make(__('music_productions.gallery_field')) + ->schema([ + FileUpload::make('gallery') + ->label(__('music_productions.gallery_field')) + ->multiple() + ->image() + ->disk('public') + ->directory('music-productions/gallery') + ->visibility('public') + ->helperText(__('music_productions.gallery_helper')) + ->columnSpanFull(), + ]) + ->columnSpanFull() + ->collapsible(true) + ->collapsed(false), + + // Çeviriler Kısımı (Çoklu Dil) + Section::make('🌍 ' . __('music_productions.translations_section')) + ->schema([ + TranslationTabs::make([ + 'title' => [ + 'type' => 'text', + 'label' => __('music_productions.title_field'), + 'required' => false, + 'maxLength' => 255, + ], + 'client_name' => [ + 'type' => 'text', + 'label' => __('music_productions.client_name_field'), + 'required' => false, + 'maxLength' => 255, + ], + 'content' => [ + 'type' => 'richtext', + 'label' => __('music_productions.content_field'), + 'required' => false, + ], + ]), + ]) + ->columnSpanFull() + ->collapsible(true) + ->collapsed(false), + ]); + } +} diff --git a/app/Filament/Admin/Resources/MusicProductions/Tables/MusicProductionsTable.php b/app/Filament/Admin/Resources/MusicProductions/Tables/MusicProductionsTable.php new file mode 100644 index 0000000..e9d88c0 --- /dev/null +++ b/app/Filament/Admin/Resources/MusicProductions/Tables/MusicProductionsTable.php @@ -0,0 +1,92 @@ +columns([ + ImageColumn::make('cover_image') + ->label(__('music_productions.cover_image_field')) + ->disk('public') + ->square() + ->size(60), + + TextColumn::make('title') + ->label(__('music_productions.table_title')) + ->searchable() + ->sortable() + ->limit(50), + + TextColumn::make('slug') + ->label(__('music_productions.table_slug')) + ->searchable() + ->sortable() + ->limit(30), + + TextColumn::make('client_name') + ->label(__('music_productions.table_client_name')) + ->searchable() + ->sortable() + ->limit(30), + + TextColumn::make('production_date') + ->label(__('music_productions.table_production_date')) + ->date('d.m.Y') + ->sortable(), + + ToggleColumn::make('is_active') + ->label(__('music_productions.table_is_active')) + ->alignCenter(), + + TextColumn::make('sort_order') + ->label(__('music_productions.sort_order_field')) + ->sortable() + ->alignCenter(), + + TextColumn::make('created_at') + ->label(__('music_productions.table_created_at')) + ->dateTime('d.m.Y H:i') + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + + TextColumn::make('updated_at') + ->label(__('music_productions.table_updated_at')) + ->dateTime('d.m.Y H:i') + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + ]) + ->filters([ + TernaryFilter::make('is_active') + ->label(__('music_productions.is_active_field')), + ]) + ->recordActions([ + EditAction::make() + ->label(__('music_productions.edit')), + ]) + ->toolbarActions([ + BulkActionGroup::make([ + DeleteBulkAction::make() + ->label(__('music_productions.delete')), + RestoreBulkAction::make() + ->label(__('music_productions.restore')), + ForceDeleteBulkAction::make() + ->label(__('music_productions.force_delete')), + ]), + ]) + ->defaultSort('sort_order', 'asc'); + } +} diff --git a/app/Http/Controllers/MusicProductionController.php b/app/Http/Controllers/MusicProductionController.php new file mode 100644 index 0000000..f7a5a7e --- /dev/null +++ b/app/Http/Controllers/MusicProductionController.php @@ -0,0 +1,155 @@ +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')); + } +} diff --git a/app/Models/MusicProduction.php b/app/Models/MusicProduction.php new file mode 100644 index 0000000..c381d84 --- /dev/null +++ b/app/Models/MusicProduction.php @@ -0,0 +1,67 @@ + 'date', + 'gallery' => 'array', + 'is_active' => 'boolean', + 'sort_order' => 'integer', + ]; + + public function getUrlAttribute() + { + return route('music-productions.show', $this->slug); + } + + public function getCoverImageUrlAttribute() + { + if ($this->cover_image) { + return asset('storage/' . $this->cover_image); + } + + return null; + } + + public function scopeActive($query) + { + return $query->where('is_active', true); + } + + public function scopeOrdered($query) + { + return $query->orderBy('sort_order', 'asc')->orderBy('production_date', 'desc'); + } +} diff --git a/database/migrations/2026_05_20_190658_create_music_productions_table.php b/database/migrations/2026_05_20_190658_create_music_productions_table.php new file mode 100644 index 0000000..7917d1c --- /dev/null +++ b/database/migrations/2026_05_20_190658_create_music_productions_table.php @@ -0,0 +1,40 @@ +id(); + $table->string('title'); // Main title (usually default language) + $table->string('slug')->unique(); + $table->string('cover_image')->nullable(); + $table->longText('content')->nullable(); // Main content (usually default language) + $table->string('client_name')->nullable(); // Main client name (usually default language) + $table->date('production_date')->nullable(); + $table->json('gallery')->nullable(); // Store gallery images + $table->boolean('is_active')->default(true); + $table->integer('sort_order')->default(0); + $table->softDeletes(); + $table->timestamps(); + + $table->index(['is_active', 'sort_order']); + $table->index('slug'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('music_productions'); + } +}; diff --git a/lang/en/music_productions.php b/lang/en/music_productions.php new file mode 100644 index 0000000..598ddd3 --- /dev/null +++ b/lang/en/music_productions.php @@ -0,0 +1,78 @@ + 'Music Productions', + 'meta-index-title' => 'Music Productions', + 'meta-index-description' => 'Our music production, soundtrack and corporate music work.', + 'empty' => 'No music productions registered yet.', + 'project_details' => 'Project Details', + 'back_to_list' => 'Back to List', + 'prev' => 'Prev', + 'next' => 'Next', + + // Module labels + 'title' => 'Music Productions', + 'navigation_label' => 'Music Production', + 'model_label' => 'Music Production', + 'plural_model_label' => 'Music Productions', + + // Actions + 'create' => 'Create New Music Production', + 'edit' => 'Edit Music Production', + 'save' => 'Save', + 'cancel' => 'Cancel', + 'delete' => 'Delete Music Production', + 'restore' => 'Restore Music Production', + 'force_delete' => 'Force Delete', + + // Form fields + 'title_field' => 'Title', + 'slug_field' => 'URL Slug', + 'content_field' => 'Content', + 'client_name_field' => 'Client Name', + 'production_date_field' => 'Production Date', + 'cover_image_field' => 'Cover Image', + 'gallery_field' => 'Gallery Images', + 'is_active_field' => 'Is Active?', + 'sort_order_field' => 'Sort Order', + + // Sections + 'content_section' => 'Content', + 'settings_section' => 'Production Settings', + 'translations_section' => 'Translations', + + // Helper texts + 'slug_helper' => 'The part that will appear in the URL. Example: music-production-1', + 'cover_image_helper' => 'Select a cover image for the production', + 'gallery_helper' => 'Select other images for the production (Multiple upload is supported)', + 'production_date_helper' => 'The date when the production was completed', + 'is_active_helper' => 'Display this music production on the site', + 'sort_order_helper' => 'Enter a sorting number for listing priority', + + // Status options + 'status_draft' => 'Draft', + 'status_published' => 'Published', + 'status_archived' => 'Archived', + + // Messages + 'created_successfully' => 'Music production created successfully.', + 'updated_successfully' => 'Music production updated successfully.', + 'deleted_successfully' => 'Music production deleted successfully.', + 'restored_successfully' => 'Music production restored successfully.', + + // Table columns + 'table_title' => 'Title', + 'table_slug' => 'URL Slug', + 'table_client_name' => 'Client', + 'table_production_date' => 'Production Date', + 'table_status' => 'Status', + 'table_is_active' => 'Active', + 'table_created_at' => 'Created At', + 'table_updated_at' => 'Updated At', + + // Validation messages + 'title_required' => 'Title field is required.', + 'slug_required' => 'URL slug field is required.', + 'slug_unique' => 'This URL slug is already in use.', +]; diff --git a/lang/tr/music_productions.php b/lang/tr/music_productions.php new file mode 100644 index 0000000..bf46fe4 --- /dev/null +++ b/lang/tr/music_productions.php @@ -0,0 +1,78 @@ + 'Müzik Prodüksiyonları', + 'meta-index-title' => 'Müzik Prodüksiyonları', + 'meta-index-description' => 'Müzik prodüksiyonu, film müzikleri ve kurumsal müzik çalışmalarımız.', + 'empty' => 'Şu anda kayıtlı müzik prodüksiyonu bulunmuyor.', + 'project_details' => 'Proje Detayları', + 'back_to_list' => 'Listeye Geri Dön', + 'prev' => 'Önceki', + 'next' => 'Sonraki', + + // Module labels + 'title' => 'Müzik Prodüksiyonları', + 'navigation_label' => 'Müzik Prodüksiyonu', + 'model_label' => 'Müzik Prodüksiyonu', + 'plural_model_label' => 'Müzik Prodüksiyonları', + + // Actions + 'create' => 'Yeni Müzik Prodüksiyonu Oluştur', + 'edit' => 'Müzik Prodüksiyonunu Düzenle', + 'save' => 'Kaydet', + 'cancel' => 'İptal', + 'delete' => 'Müzik Prodüksiyonunu Sil', + 'restore' => 'Müzik Prodüksiyonunu Geri Yükle', + 'force_delete' => 'Kalıcı Olarak Sil', + + // Form fields + 'title_field' => 'Başlık', + 'slug_field' => 'URL Yolu', + 'content_field' => 'İçerik', + 'client_name_field' => 'Müşteri Adı', + 'production_date_field' => 'Yapım Tarihi', + 'cover_image_field' => 'Kapak Görseli', + 'gallery_field' => 'Galeri Görselleri', + 'is_active_field' => 'Aktif mi?', + 'sort_order_field' => 'Sıralama', + + // Sections + 'content_section' => 'İçerik', + 'settings_section' => 'Prodüksiyon Ayarları', + 'translations_section' => 'Çeviriler', + + // Helper texts + 'slug_helper' => 'URL\'de görünecek kısım. Örnek: muzik-produksiyonu-1', + 'cover_image_helper' => 'Prodüksiyon için kapak görseli seçin', + 'gallery_helper' => 'Prodüksiyona ait diğer görselleri seçin (Çoklu yükleme desteklenir)', + 'production_date_helper' => 'Prodüksiyonun tamamlandığı tarih', + 'is_active_helper' => 'Bu müzik prodüksiyonunu sitede göster', + 'sort_order_helper' => 'Listeleme önceliği için sıralama numarası girin', + + // Status options + 'status_draft' => 'Taslak', + 'status_published' => 'Yayınlandı', + 'status_archived' => 'Arşivlendi', + + // Messages + 'created_successfully' => 'Müzik prodüksiyonu başarıyla oluşturuldu.', + 'updated_successfully' => 'Müzik prodüksiyonu başarıyla güncellendi.', + 'deleted_successfully' => 'Müzik prodüksiyonu başarıyla silindi.', + 'restored_successfully' => 'Müzik prodüksiyonu başarıyla geri yüklendi.', + + // Table columns + 'table_title' => 'Başlık', + 'table_slug' => 'URL Yolu', + 'table_client_name' => 'Müşteri', + 'table_production_date' => 'Yapım Tarihi', + 'table_status' => 'Durum', + 'table_is_active' => 'Aktif', + 'table_created_at' => 'Oluşturulma Tarihi', + 'table_updated_at' => 'Güncellenme Tarihi', + + // Validation messages + 'title_required' => 'Başlık alanı zorunludur.', + 'slug_required' => 'URL yolu alanı zorunludur.', + 'slug_unique' => 'Bu URL yolu zaten kullanılıyor.', +]; diff --git a/resources/views/front/music-productions/index.blade.php b/resources/views/front/music-productions/index.blade.php new file mode 100644 index 0000000..46f989b --- /dev/null +++ b/resources/views/front/music-productions/index.blade.php @@ -0,0 +1,174 @@ +@extends('layouts.site') + +@section('content') +
+
+
+
+

{{ __('music_productions.meta-index-title') }}

+

{{ __('music_productions.meta-index-description') }}

+
+
+
+
+ +
+
+ @if($productions->count() > 0) +
+
+ @php + $accentColors = [ + ['border' => '#54a8c7', 'text' => '#54a8c7', 'tooltip' => 'itooltip-aqua'], + ['border' => '#747ed1', 'text' => '#747ed1', 'tooltip' => 'itooltip-purple'], + ['border' => '#fab758', 'text' => '#fab758', 'tooltip' => 'itooltip-yellow'], + ['border' => '#e2626b', 'text' => '#e2626b', 'tooltip' => 'itooltip-red'], + ['border' => '#f78b77', 'text' => '#f78b77', 'tooltip' => 'itooltip-orange'], + ['border' => '#7cb798', 'text' => '#7cb798', 'tooltip' => 'itooltip-leaf'], + ['border' => '#d16b86', 'text' => '#d16b86', 'tooltip' => 'itooltip-pink'], + ['border' => '#45c4a0', 'text' => '#45c4a0', 'tooltip' => 'itooltip-green'], + ['border' => '#a07cc5', 'text' => '#a07cc5', 'tooltip' => 'itooltip-violet'], + ]; + @endphp + @foreach($productions as $index => $production) + @php + $color = $accentColors[$index % count($accentColors)]; + @endphp +
+
+
+ + @if($production->cover_image) + {{ $production->translate('title') }} + @else +
+ + + +
+ @endif +
+
+
+
+ @if($production->client_name) +
+ {{ $production->translate('client_name') }} +
+ @endif + @if($production->production_date) +
+ {{ $production->production_date->format('d.m.Y') }} +
+ @endif +

+ + {{ $production->translate('title') }} + +

+
+
+
+
+ @endforeach +
+
+ + {{-- Pagination --}} + @if($productions->hasPages()) +
+ +
+ @endif + + @else +
+
+ + + +

{{ __('music_productions.empty') }}

+
+
+ @endif +
+
+ +@push('styles') + +@endpush +@endsection diff --git a/resources/views/front/music-productions/show.blade.php b/resources/views/front/music-productions/show.blade.php new file mode 100644 index 0000000..5f744f1 --- /dev/null +++ b/resources/views/front/music-productions/show.blade.php @@ -0,0 +1,162 @@ +@extends('layouts.site') + +@section('content') +
+
+
+
+
+ @if($production->client_name) +
+ {{ $production->translate('client_name') }} +
+ @endif +

{{ $production->translate('title') }}

+ @if($production->production_date) +

+ + {{ $production->production_date->format('d.m.Y') }} +

+ @endif +
+
+
+
+
+ +
+
+
+
+
+ {{-- Cover Image --}} + @if($production->cover_image) +
+ {{ $production->translate('title') }} +
+ @endif + + {{-- Content & Meta --}} +
+
+

{{ __('music_productions.project_details') }}

+
+ {{-- Content column --}} +
+
+ {!! $production->translate('content') !!} +
+
+ + {{-- Sidebar - Date & Client --}} +
+
    + @if($production->production_date) +
  • +
    {!! t('Tarih') !!}
    +

    {{ $production->production_date->format('d M Y') }}

    +
  • + @endif + @if($production->client_name) +
  • +
    {!! t('Müşteri') !!}
    +

    {{ $production->translate('client_name') }}

    +
  • + @endif +
+ + + {{ __('music_productions.back_to_list') }} + +
+
+
+
+ + {{-- Gallery --}} + @php + $gallery = $production->gallery; + @endphp + @if(!empty($gallery) && is_array($gallery) && count($gallery) > 0) +
+ @foreach($gallery as $galleryImage) +
+
+ + {{ $production->translate('title') }} + +
+
+ @endforeach +
+ @endif + +
+
+
+
+
+ +{{-- Post Navigation (Prev / Next) --}} +
+ +
+ +@push('styles') + +@endpush +@endsection diff --git a/resources/views/templates/home/services-cards.blade.php b/resources/views/templates/home/services-cards.blade.php index a22010d..a5bcfc0 100644 --- a/resources/views/templates/home/services-cards.blade.php +++ b/resources/views/templates/home/services-cards.blade.php @@ -33,7 +33,7 @@

{!! t('Müzik Prodüksiyon') !!}

{!! t('Müzik prodüksiyonu, film müzikleri, kurumsal müzik çalışmaları ve benzeri alanlarda hizmet veriyoruz.') !!}

- {!! t('Daha fazla bilgi edin') !!} + {!! t('Daha fazla bilgi edin') !!} diff --git a/routes/web.php b/routes/web.php index 9adf699..d168eb1 100644 --- a/routes/web.php +++ b/routes/web.php @@ -106,6 +106,10 @@ Route::prefix('admin/api')->middleware(['auth', \App\Http\Middleware\SuperAdminM Route::redirect('/urun-hizmet/Yazılım Danışmanlık', '/urun-hizmet/yazilim-danismanlik', 301); Route::get('/urun-hizmet/{slug}', [\App\Http\Controllers\ProductController::class, 'show'])->name('products.show'); +// Music Productions +Route::get('/muzik-produksiyonlari', [\App\Http\Controllers\MusicProductionController::class, 'index'])->name('music-productions.index'); +Route::get('/muzik-produksiyonlari/{slug}', [\App\Http\Controllers\MusicProductionController::class, 'show'])->name('music-productions.show'); + // Career Route::get('/kariyer', [\App\Http\Controllers\CareerController::class, 'index'])->name('career.index'); Route::get('/staj-basvurusu', [\App\Http\Controllers\CareerController::class, 'internship'])->name('career.internship');