From 177ebff1190dd8c6d419731c465b360d62a24952 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Muhammet=20G=C3=BCler?= Date: Sun, 8 Feb 2026 04:54:32 +0300 Subject: [PATCH 1/2] feat: Add Logos page, refactor Testimonials to RelationManager, and improve designs --- .../Resources/Blogs/Schemas/BlogForm.php | 6 - .../Admin/Resources/Pages/PageResource.php | 2 +- .../TestimonialsRelationManager.php | 122 +++++ .../Resources/Pages/Schemas/PageForm.php | 4 + .../Pages/Schemas/Sections/LogosSection.php | 36 ++ .../Schemas/Sections/PageSettingsSection.php | 8 +- .../Sections/SectionBuilderSection.php | 2 +- .../Api/SiteTranslationController.php | 2 +- app/Http/Controllers/PageController.php | 504 +++++------------- app/Http/Middleware/SuperAdminMiddleware.php | 27 + app/Models/Page.php | 5 + app/Models/Testimonial.php | 24 + app/Services/TemplateService.php | 3 - config/livewire.php | 2 +- ...02_06_231314_create_testimonials_table.php | 35 ++ ...6_02_08_003931_add_data_to_pages_table.php | 28 + database/seeders/LogosPageSeeder.php | 41 ++ database/seeders/PageSeeder.php | 34 +- package-lock.json | 262 +++++---- .../views/templates/corporate/logos.blade.php | 128 +++++ .../corporate/testimonials.blade.php | 72 +-- resources/views/templates/generic.blade.php | 16 +- .../templates/home/testimonials.blade.php | 47 +- routes/web.php | 26 +- 24 files changed, 863 insertions(+), 573 deletions(-) create mode 100644 app/Filament/Admin/Resources/Pages/RelationManagers/TestimonialsRelationManager.php create mode 100644 app/Filament/Admin/Resources/Pages/Schemas/Sections/LogosSection.php create mode 100644 app/Http/Middleware/SuperAdminMiddleware.php create mode 100644 app/Models/Testimonial.php create mode 100644 database/migrations/2026_02_06_231314_create_testimonials_table.php create mode 100644 database/migrations/2026_02_08_003931_add_data_to_pages_table.php create mode 100644 database/seeders/LogosPageSeeder.php create mode 100644 resources/views/templates/corporate/logos.blade.php diff --git a/app/Filament/Admin/Resources/Blogs/Schemas/BlogForm.php b/app/Filament/Admin/Resources/Blogs/Schemas/BlogForm.php index 15347c5..66c452d 100644 --- a/app/Filament/Admin/Resources/Blogs/Schemas/BlogForm.php +++ b/app/Filament/Admin/Resources/Blogs/Schemas/BlogForm.php @@ -71,12 +71,6 @@ class BlogForm ->disk('public') ->directory('blogs/featured') ->visibility('public') - ->imageEditor() - ->imageEditorAspectRatios([ - '16:9', - '4:3', - '1:1', - ]) ->helperText(__('blog.featured_image_helper')) ->columnSpanFull(), diff --git a/app/Filament/Admin/Resources/Pages/PageResource.php b/app/Filament/Admin/Resources/Pages/PageResource.php index 5eee605..cc47f91 100644 --- a/app/Filament/Admin/Resources/Pages/PageResource.php +++ b/app/Filament/Admin/Resources/Pages/PageResource.php @@ -51,7 +51,7 @@ class PageResource extends Resource public static function getRelations(): array { return [ - // + RelationManagers\TestimonialsRelationManager::class, ]; } diff --git a/app/Filament/Admin/Resources/Pages/RelationManagers/TestimonialsRelationManager.php b/app/Filament/Admin/Resources/Pages/RelationManagers/TestimonialsRelationManager.php new file mode 100644 index 0000000..72a1fbb --- /dev/null +++ b/app/Filament/Admin/Resources/Pages/RelationManagers/TestimonialsRelationManager.php @@ -0,0 +1,122 @@ +slug === 'musteri-gorusleri' || + $ownerRecord->template === 'corporate.testimonials' || + $ownerRecord->is_homepage; + } + + public function form(Schema $schema): Schema + { + return $schema + ->schema([ + TextInput::make('name') + ->label('Müşteri Adı') + ->required() + ->maxLength(255), + TextInput::make('position') + ->label('Şirket / Ünvan') + ->maxLength(255), + Textarea::make('content') + ->label('Görüş / Yorum') + ->required() + ->columnSpanFull(), + Select::make('rating') + ->label('Puan') + ->options([ + 1 => '1 Yıldız', + 2 => '2 Yıldız', + 3 => '3 Yıldız', + 4 => '4 Yıldız', + 5 => '5 Yıldız', + ]) + ->default(5) + ->required(), + FileUpload::make('avatar') + ->label('Profil Resmi') + ->image() + ->directory('testimonials'), + Toggle::make('is_active') + ->label('Aktif') + ->default(true), + TextInput::make('sort_order') + ->label('Sıralama') + ->numeric() + ->default(0), + ]); + } + + public function table(Table $table): Table + { + return $table + ->recordTitleAttribute('name') + ->columns([ + Tables\Columns\TextColumn::make('name') + ->label('Ad') + ->searchable() + ->sortable(), + Tables\Columns\TextColumn::make('position') + ->label('Ünvan') + ->searchable() + ->sortable(), + Tables\Columns\TextColumn::make('rating') + ->label('Puan') + ->sortable(), + Tables\Columns\IconColumn::make('is_active') + ->label('Aktif') + ->boolean() + ->sortable(), + Tables\Columns\TextColumn::make('sort_order') + ->label('Sıra') + ->sortable(), + ]) + ->filters([ + // + ]) + ->headerActions([ + CreateAction::make(), + ]) + ->actions([ + EditAction::make(), + DeleteAction::make(), + ]) + ->bulkActions([ + BulkActionGroup::make([ + DeleteBulkAction::make(), + ]), + ]); + } +} diff --git a/app/Filament/Admin/Resources/Pages/Schemas/PageForm.php b/app/Filament/Admin/Resources/Pages/Schemas/PageForm.php index 2053f3f..e0f5ea0 100644 --- a/app/Filament/Admin/Resources/Pages/Schemas/PageForm.php +++ b/app/Filament/Admin/Resources/Pages/Schemas/PageForm.php @@ -9,6 +9,7 @@ use App\Filament\Admin\Resources\Pages\Schemas\Sections\SectionBuilderSection; use App\Filament\Admin\Resources\Pages\Schemas\Sections\SectionTemplatesSection; use App\Filament\Admin\Resources\Pages\Schemas\Sections\SeoSection; use App\Filament\Admin\Resources\Pages\Schemas\Sections\TranslationsSection; +use App\Filament\Admin\Resources\Pages\Schemas\Sections\LogosSection; use Filament\Schemas\Schema; @@ -49,6 +50,9 @@ class PageForm SectionTemplatesSection::make(), FooterTemplateSection::make(), + // Full Width - Logos (Only for Logolarımız template) + LogosSection::make(), + // Full Width - Translations TranslationsSection::make(), ]); diff --git a/app/Filament/Admin/Resources/Pages/Schemas/Sections/LogosSection.php b/app/Filament/Admin/Resources/Pages/Schemas/Sections/LogosSection.php new file mode 100644 index 0000000..b7f89c1 --- /dev/null +++ b/app/Filament/Admin/Resources/Pages/Schemas/Sections/LogosSection.php @@ -0,0 +1,36 @@ +description(__('Bu sayfada gösterilecek logoları buradan yönetebilirsiniz.')) + ->schema([ + Grid::make(3) + ->schema([ + FileUpload::make('data.logo_1') + ->label(__('Logo 1')) + ->disk('public'), + + FileUpload::make('data.logo_2') + ->label(__('Logo 2')) + ->disk('public'), + + FileUpload::make('data.logo_3') + ->label(__('Logo 3')) + ->disk('public'), + ]), + ]) + ->visible(fn (Get $get): bool => $get('template') === 'corporate.logos') + ->columnSpanFull() + ->collapsible(); + } +} diff --git a/app/Filament/Admin/Resources/Pages/Schemas/Sections/PageSettingsSection.php b/app/Filament/Admin/Resources/Pages/Schemas/Sections/PageSettingsSection.php index fadba52..de1ba11 100644 --- a/app/Filament/Admin/Resources/Pages/Schemas/Sections/PageSettingsSection.php +++ b/app/Filament/Admin/Resources/Pages/Schemas/Sections/PageSettingsSection.php @@ -21,12 +21,6 @@ class PageSettingsSection ->disk('public') ->directory('pages/featured') ->visibility('public') - ->imageEditor() - ->imageEditorAspectRatios([ - '16:9', - '4:3', - '1:1', - ]) ->helperText(__('pages.featured_image_helper_text')) ->columnSpanFull(), @@ -70,6 +64,8 @@ class PageSettingsSection 'blog' => __('pages.template_blog'), 'contact' => __('pages.template_contact'), 'home' => 'Home', + 'corporate.testimonials' => 'Müşteri Görüşleri (Kurumsal)', + 'corporate.logos' => 'Logolarımız (Kurumsal)', ]) ->default('default') ->columnSpanFull(), diff --git a/app/Filament/Admin/Resources/Pages/Schemas/Sections/SectionBuilderSection.php b/app/Filament/Admin/Resources/Pages/Schemas/Sections/SectionBuilderSection.php index c2fb31b..0b3dc93 100644 --- a/app/Filament/Admin/Resources/Pages/Schemas/Sections/SectionBuilderSection.php +++ b/app/Filament/Admin/Resources/Pages/Schemas/Sections/SectionBuilderSection.php @@ -233,7 +233,7 @@ class SectionBuilderSection ->image() ->disk('public') ->directory('pages/sections') - ->imageEditor() + ->directory('pages/sections') ->live() ->afterStateUpdated(fn ($state, callable $set) => $set('value', $state)) ->afterStateHydrated(function ($component, $state, Get $get) { diff --git a/app/Http/Controllers/Api/SiteTranslationController.php b/app/Http/Controllers/Api/SiteTranslationController.php index 7177516..217eebe 100644 --- a/app/Http/Controllers/Api/SiteTranslationController.php +++ b/app/Http/Controllers/Api/SiteTranslationController.php @@ -176,7 +176,7 @@ class SiteTranslationController extends Controller if ($validator->fails()) { return response()->json([ 'success' => false, - 'errors' => $validator->fails(), + 'errors' => $validator->errors(), ], 422); } diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php index 3b81bdb..14f16e3 100644 --- a/app/Http/Controllers/PageController.php +++ b/app/Http/Controllers/PageController.php @@ -8,6 +8,7 @@ use App\Models\HeaderTemplate; use App\Models\FooterTemplate; use App\Services\TemplateService; use Illuminate\Http\Request; +use Illuminate\Support\Collection; class PageController extends Controller { @@ -16,208 +17,29 @@ class PageController extends Controller */ public function index() { - // 1. Statik "home" Template Kontrolü - if (view()->exists('templates.home')) { - $page = Page::with(['headerTemplate', 'footerTemplate']) - ->where('is_homepage', true) - ->where('status', 'published') - ->latest('updated_at') - ->first(); - - $settings = class_exists(Setting::class) ? (object) Setting::where('is_active', true)->pluck('value', 'key')->toArray() : null; - - $renderedHeader = null; - $renderedFooter = null; - $metaTitle = null; - $metaDescription = null; - - if ($page) { - // Meta bilgileri - $metaTitle = method_exists($page, 'translate') - ? ($page->translate('meta_title') ?: $page->translate('title')) - : ($page->meta_title ?? $page->title ?? null); - - $metaDescription = method_exists($page, 'translate') - ? ($page->translate('meta_description') ?: ($page->excerpt ?? null)) - : ($page->meta_description ?? $page->excerpt ?? null); - - // Header Render - $headerTemplate = $page->headerTemplate; - - if (!$headerTemplate) { - $defaultHeaderId = $settings->default_header ?? null; - if ($defaultHeaderId) { - $headerTemplate = HeaderTemplate::find($defaultHeaderId); - } - } - - if ($headerTemplate) { - $templateDefaults = $headerTemplate->default_data ?? []; - $pageData = $page->header_data ?? []; - $mergedHeaderData = array_merge($templateDefaults, $pageData); - $renderedHeader = TemplateService::replacePlaceholders($headerTemplate->html_content, $mergedHeaderData, $page); - } - - // Footer Render - $footerTemplate = $page->footerTemplate; - - if (!$footerTemplate) { - $defaultFooterId = $settings->default_footer ?? null; - if ($defaultFooterId) { - $footerTemplate = FooterTemplate::find($defaultFooterId); - } - } - - if ($footerTemplate) { - $templateDefaults = $footerTemplate->default_data ?? []; - $pageData = $page->footer_data ?? []; - $mergedFooterData = array_merge($templateDefaults, $pageData); - $renderedFooter = TemplateService::replacePlaceholders($footerTemplate->html_content, $mergedFooterData, $page); - } - } - - return view('templates.home', [ - 'page' => $page, - 'settings' => $settings, - 'sections' => $page ? ($page->sections ?? []) : [], - 'templatedSections' => $page ? ($page->templated_sections ?? collect([])) : collect([]), - 'renderedHeader' => $renderedHeader, - 'renderedFooter' => $renderedFooter, - 'meta' => [ - 'title' => $metaTitle ?: ($settings->default_meta_title ?? config('app.name')), - 'description' => $metaDescription ?: ($settings->default_meta_description ?? null), - 'image' => $settings->default_meta_image ?? null, - ], - ]); - } - - // 2. Normal Dinamik Akış (Mevcut kod devam eder) + $settings = $this->getSettings(); + $page = Page::with(['headerTemplate', 'footerTemplate']) ->where('is_homepage', true) ->where('status', 'published') ->latest('updated_at') ->first(); - - + // 1. Statik "home" Template Kontrolü + if (view()->exists('templates.home')) { + return $this->renderView('templates.home', $page, $settings); + } - $settings = class_exists(Setting::class) ? (object) Setting::where('is_active', true)->pluck('value', 'key')->toArray() : null; - - // Hiç sayfa yoksa: direkt home template'inin statik fallback'i ile render et + // Hiç sayfa yoksa fallback if (!$page) { return view('templates.home', [ 'page' => null, 'settings' => $settings, - 'meta' => [ - 'title' => $settings->default_meta_title ?? config('app.name'), - 'description' => $settings->default_meta_description ?? null, - 'image' => $settings->default_meta_image ?? null, - ], + 'meta' => $this->getMeta(null, $settings), ]); } - $metaTitle = method_exists($page, 'translate') - ? ($page->translate('meta_title') ?: $page->translate('title')) - : ($page->meta_title ?? $page->title ?? null); - - $metaDescription = method_exists($page, 'translate') - ? ($page->translate('meta_description') ?: ($page->excerpt ?? null)) - : ($page->meta_description ?? $page->excerpt ?? null); - - // Section verisini al - Hem eski hem yeni sistemi destekle - $sections = $page->sections ?? $page->data ?? []; - - // Yeni dinamik template sistemi için sections_data varsa onu da al - $templatedSections = $page->templated_sections ?? collect([]); - - // Template belirleme mantığı: - // 1. Kullanıcı template seçmişse, onu kullan - // 2. Template seçilmemişse ve homepage ise, 'home' kullan - // 3. Hiçbiri yoksa, 'generic' kullan - $template = $page->template - ?? (($page->slug === 'home' || ($page->is_homepage ?? false)) ? 'home' : 'generic'); - - $view = view()->exists("templates.$template") - ? "templates.$template" - : 'templates.generic'; - - // Render Header Template - $renderedHeader = null; - - // 1. Önce özel blade dosyası var mı kontrol et - if (!empty($page->custom_header_blade) && view()->exists($page->custom_header_blade)) { - $renderedHeader = view($page->custom_header_blade, ['page' => $page])->render(); - } else { - // 2. Yoksa Header Template sistemini kullan - $headerTemplate = $page->headerTemplate; - - // Eğer sayfa için header seçilmemişse, en son aktif header template'i kullan - if (!$headerTemplate) { - $defaultHeaderId = $settings->default_header ?? null; - if ($defaultHeaderId) { - $headerTemplate = HeaderTemplate::find($defaultHeaderId); - } - } - - if ($headerTemplate) { - // Merge template defaults with page data (page data overrides defaults) - $templateDefaults = $headerTemplate->default_data ?? []; - $pageData = $page->header_data ?? []; - $mergedHeaderData = array_merge($templateDefaults, $pageData); - - $renderedHeader = TemplateService::replacePlaceholders( - $headerTemplate->html_content, - $mergedHeaderData, - $page - ); - } - } - - // Render Footer Template - $renderedFooter = null; - - // 1. Önce özel blade dosyası var mı kontrol et - if (!empty($page->custom_footer_blade) && view()->exists($page->custom_footer_blade)) { - $renderedFooter = view($page->custom_footer_blade, ['page' => $page])->render(); - } else { - // 2. Yoksa Footer Template sistemini kullan - $footerTemplate = $page->footerTemplate; - - // Eğer sayfa için footer seçilmemişse, en son aktif footer template'i kullan - if (!$footerTemplate) { - $defaultFooterId = $settings->default_footer ?? null; - if ($defaultFooterId) { - $footerTemplate = FooterTemplate::find($defaultFooterId); - } - } - - if ($footerTemplate) { - // Merge template defaults with page data (page data overrides defaults) - $templateDefaults = $footerTemplate->default_data ?? []; - $pageData = $page->footer_data ?? []; - $mergedFooterData = array_merge($templateDefaults, $pageData); - - $renderedFooter = TemplateService::replacePlaceholders( - $footerTemplate->html_content, - $mergedFooterData, - $page - ); - } - } - - return view($view, [ - 'page' => $page, - 'settings' => $settings, - 'sections' => $sections, - 'templatedSections' => $templatedSections, - 'renderedHeader' => $renderedHeader, - 'renderedFooter' => $renderedFooter, - 'meta' => [ - 'title' => $metaTitle ?: ($settings->default_meta_title ?? config('app.name')), - 'description' => $metaDescription ?: ($settings->default_meta_description ?? null), - 'image' => $settings->default_meta_image ?? null, - ], - ]); + return $this->renderPage($page, $settings); } /** @@ -225,93 +47,16 @@ class PageController extends Controller */ public function show($slug) { + $settings = $this->getSettings(); + // 1. Statik View Kontrolü - // Eğer templates/{slug}.blade.php varsa, veritabanında kayıt olsun veya olmasın bu dosyayı render et. if (view()->exists("templates.$slug")) { $page = Page::with(['headerTemplate', 'footerTemplate']) ->where('slug', $slug) ->where('status', 'published') ->first(); - - $settings = class_exists(Setting::class) ? (object) Setting::where('is_active', true)->pluck('value', 'key')->toArray() : null; - - // Meta verilerini hazırla - $metaTitle = null; - $metaDescription = null; - - if ($page) { - $metaTitle = method_exists($page, 'translate') - ? ($page->translate('meta_title') ?: $page->translate('title')) - : ($page->meta_title ?? $page->title ?? null); - - $metaDescription = method_exists($page, 'translate') - ? ($page->translate('meta_description') ?: ($page->excerpt ?? null)) - : ($page->meta_description ?? $page->excerpt ?? null); - } - - // Statik sayfa için header/footer render işlemleri (Eğer page varsa) - $renderedHeader = null; - $renderedFooter = null; - - if ($page) { - // 1. Önce özel blade dosyası var mı kontrol et - if (!empty($page->custom_header_blade) && view()->exists($page->custom_header_blade)) { - $renderedHeader = view($page->custom_header_blade, ['page' => $page])->render(); - } else { - // 2. Yoksa Header Template sistemini kullan - $headerTemplate = $page->headerTemplate; - if (!$headerTemplate) { - $defaultHeaderId = $settings->default_header ?? null; - if ($defaultHeaderId) { - $headerTemplate = HeaderTemplate::find($defaultHeaderId); - } - } - - if ($headerTemplate) { - $templateDefaults = $headerTemplate->default_data ?? []; - $pageData = $page->header_data ?? []; - $mergedHeaderData = array_merge($templateDefaults, $pageData); - $renderedHeader = TemplateService::replacePlaceholders($headerTemplate->html_content, $mergedHeaderData, $page); - } - } - - // Footer Render - // 1. Önce özel blade dosyası var mı kontrol et - if (!empty($page->custom_footer_blade) && view()->exists($page->custom_footer_blade)) { - $renderedFooter = view($page->custom_footer_blade, ['page' => $page])->render(); - } else { - // 2. Yoksa Footer Template sistemini kullan - $footerTemplate = $page->footerTemplate; - - if (!$footerTemplate) { - $defaultFooterId = $settings->default_footer ?? null; - if ($defaultFooterId) { - $footerTemplate = FooterTemplate::find($defaultFooterId); - } - } - - if ($footerTemplate) { - $templateDefaults = $footerTemplate->default_data ?? []; - $pageData = $page->footer_data ?? []; - $mergedFooterData = array_merge($templateDefaults, $pageData); - $renderedFooter = TemplateService::replacePlaceholders($footerTemplate->html_content, $mergedFooterData, $page); - } - } - } - - return view("templates.$slug", [ - 'page' => $page, - 'settings' => $settings, - 'sections' => $page->sections ?? [], - 'templatedSections' => $page->templated_sections ?? collect([]), - 'renderedHeader' => $renderedHeader, - 'renderedFooter' => $renderedFooter, - 'meta' => [ - 'title' => $metaTitle ?: ($settings->default_meta_title ?? config('app.name')), - 'description' => $metaDescription ?: ($settings->default_meta_description ?? null), - 'image' => $settings->default_meta_image ?? null, - ], - ]); + + return $this->renderView("templates.$slug", $page, $settings); } // 2. Normal Dinamik Akış (DB Kaydı Zorunlu) @@ -320,112 +65,156 @@ class PageController extends Controller ->where('status', 'published') ->firstOrFail(); - $settings = class_exists(Setting::class) ? (object) Setting::where('is_active', true)->pluck('value', 'key')->toArray() : null; + return $this->renderPage($page, $settings); + } - $metaTitle = method_exists($page, 'translate') - ? ($page->translate('meta_title') ?: $page->translate('title')) - : ($page->meta_title ?? $page->title ?? null); - - $metaDescription = method_exists($page, 'translate') - ? ($page->translate('meta_description') ?: ($page->excerpt ?? null)) - : ($page->meta_description ?? $page->excerpt ?? null); - - // Use parsed_sections for easier template usage (key-value format) - $sections = $page->parsed_sections ?? $page->sections ?? $page->data ?? []; - - // Yeni dinamik template sistemi için sections_data varsa onu da al - $templatedSections = $page->templated_sections ?? collect([]); - - // Template belirleme mantığı: - // 1. Kullanıcı template seçmişse, onu kullan - // 2. Template seçilmemişse ve homepage ise, 'home' kullan - // 3. Hiçbiri yoksa, 'generic' kullan + /** + * Render a page with full dynamic logic + */ + protected function renderPage(Page $page, $settings) + { $template = $page->template - ?? (($slug === 'home' || ($page->is_homepage ?? false)) ? 'home' : 'generic'); + ?? (($page->is_homepage ?? false) ? 'home' : 'generic'); $view = view()->exists("templates.$template") ? "templates.$template" : 'templates.generic'; + + return $this->renderView($view, $page, $settings); + } - // Render Header Template + /** + * Shared rendering logic for both static and dynamic templates + */ + protected function renderView(string $view, ?Page $page, $settings) + { $renderedHeader = null; - - // 1. Önce özel blade dosyası var mı kontrol et - if (!empty($page->custom_header_blade) && view()->exists($page->custom_header_blade)) { - $renderedHeader = view($page->custom_header_blade, ['page' => $page])->render(); - } else { - // 2. Yoksa Header Template sistemini kullan - $headerTemplate = $page->headerTemplate; - - // Eğer sayfa için header seçilmemişse, en son aktif header template'i kullan - if (!$headerTemplate) { - $defaultHeaderId = $settings->default_header ?? null; - if ($defaultHeaderId) { - $headerTemplate = HeaderTemplate::find($defaultHeaderId); - } - } - - if ($headerTemplate) { - // Merge template defaults with page data (page data overrides defaults) - $templateDefaults = $headerTemplate->default_data ?? []; - $pageData = $page->header_data ?? []; - $mergedHeaderData = array_merge($templateDefaults, $pageData); - - $renderedHeader = TemplateService::replacePlaceholders( - $headerTemplate->html_content, - $mergedHeaderData, - $page - ); - } - } - - // Render Footer Template $renderedFooter = null; - - // 1. Önce özel blade dosyası var mı kontrol et - if (!empty($page->custom_footer_blade) && view()->exists($page->custom_footer_blade)) { - $renderedFooter = view($page->custom_footer_blade, ['page' => $page])->render(); - } else { - // 2. Yoksa Footer Template sistemini kullan - $footerTemplate = $page->footerTemplate; - - // Eğer sayfa için footer seçilmemişse, en son aktif footer template'i kullan - if (!$footerTemplate) { - $defaultFooterId = $settings->default_footer ?? null; - if ($defaultFooterId) { - $footerTemplate = FooterTemplate::find($defaultFooterId); - } - } - - if ($footerTemplate) { - // Merge template defaults with page data (page data overrides defaults) - $templateDefaults = $footerTemplate->default_data ?? []; - $pageData = $page->footer_data ?? []; - $mergedFooterData = array_merge($templateDefaults, $pageData); - - $renderedFooter = TemplateService::replacePlaceholders( - $footerTemplate->html_content, - $mergedFooterData, - $page - ); - } + + if ($page) { + $renderedHeader = $this->renderHeader($page, $settings); + $renderedFooter = $this->renderFooter($page, $settings); } return view($view, [ 'page' => $page, 'settings' => $settings, - 'sections' => $sections, - 'templatedSections' => $templatedSections, + 'sections' => $page ? ($page->parsed_sections ?? $page->sections ?? $page->data ?? []) : [], + 'templatedSections' => $page ? ($page->templated_sections ?? collect([])) : collect([]), 'renderedHeader' => $renderedHeader, 'renderedFooter' => $renderedFooter, - 'meta' => [ - 'title' => $metaTitle ?: ($settings->default_meta_title ?? config('app.name')), - 'description' => $metaDescription ?: ($settings->default_meta_description ?? null), - 'image' => $settings->default_meta_image ?? null, - ], + 'meta' => $this->getMeta($page, $settings), ]); } + /** + * Get settings as an object + */ + protected function getSettings() + { + if (!class_exists(Setting::class)) { + return (object) []; + } + + return (object) Setting::where('is_active', true) + ->pluck('value', 'key') + ->toArray(); + } + + /** + * Get meta information for a page + */ + protected function getMeta(?Page $page, $settings) + { + $metaTitle = null; + $metaDescription = null; + $metaImage = $settings->default_meta_image ?? null; + + if ($page) { + $metaTitle = method_exists($page, 'translate') + ? ($page->translate('meta_title') ?: $page->translate('title')) + : ($page->meta_title ?? $page->title ?? null); + + $metaDescription = method_exists($page, 'translate') + ? ($page->translate('meta_description') ?: ($page->excerpt ?? null)) + : ($page->meta_description ?? $page->excerpt ?? null); + + if ($page->featured_image) { + $metaImage = asset('storage/' . $page->featured_image); + } + } + + return [ + 'title' => $metaTitle ?: ($settings->default_meta_title ?? config('app.name')), + 'description' => $metaDescription ?: ($settings->default_meta_description ?? null), + 'image' => $metaImage, + ]; + } + + /** + * Render header template + */ + protected function renderHeader(Page $page, $settings) + { + // 1. Önce özel blade dosyası var mı kontrol et + if (!empty($page->custom_header_blade) && view()->exists($page->custom_header_blade)) { + return view($page->custom_header_blade, ['page' => $page])->render(); + } + + // 2. Yoksa Header Template sistemini kullan + $headerTemplate = $page->headerTemplate; + + if (!$headerTemplate && isset($settings->default_header)) { + $headerTemplate = HeaderTemplate::find($settings->default_header); + } + + if ($headerTemplate) { + $templateDefaults = $headerTemplate->default_data ?? []; + $pageData = $page->header_data ?? []; + $mergedHeaderData = array_merge($templateDefaults, $pageData); + + return TemplateService::replacePlaceholders( + $headerTemplate->html_content, + $mergedHeaderData, + $page + ); + } + + return null; + } + + /** + * Render footer template + */ + protected function renderFooter(Page $page, $settings) + { + // 1. Önce özel blade dosyası var mı kontrol et + if (!empty($page->custom_footer_blade) && view()->exists($page->custom_footer_blade)) { + return view($page->custom_footer_blade, ['page' => $page])->render(); + } + + // 2. Yoksa Footer Template sistemini kullan + $footerTemplate = $page->footerTemplate; + + if (!$footerTemplate && isset($settings->default_footer)) { + $footerTemplate = FooterTemplate::find($settings->default_footer); + } + + if ($footerTemplate) { + $templateDefaults = $footerTemplate->default_data ?? []; + $pageData = $page->footer_data ?? []; + $mergedFooterData = array_merge($templateDefaults, $pageData); + + return TemplateService::replacePlaceholders( + $footerTemplate->html_content, + $mergedFooterData, + $page + ); + } + + return null; + } + /** * Get menu items for navigation */ @@ -445,6 +234,3 @@ class PageController extends Controller ->get(); } } - - - diff --git a/app/Http/Middleware/SuperAdminMiddleware.php b/app/Http/Middleware/SuperAdminMiddleware.php new file mode 100644 index 0000000..d59aaef --- /dev/null +++ b/app/Http/Middleware/SuperAdminMiddleware.php @@ -0,0 +1,27 @@ +check() || !auth()->user()->hasRole('super_admin')) { + if ($request->expectsJson()) { + return response()->json(['message' => 'Unauthorized'], 403); + } + abort(403); + } + + return $next($request); + } +} diff --git a/app/Models/Page.php b/app/Models/Page.php index eec6984..badd38b 100644 --- a/app/Models/Page.php +++ b/app/Models/Page.php @@ -80,6 +80,11 @@ class Page extends Model return $this->hasMany(Page::class, 'parent_id'); } + public function testimonials() + { + return $this->hasMany(Testimonial::class); + } + /** * Get the header template for the page. */ diff --git a/app/Models/Testimonial.php b/app/Models/Testimonial.php new file mode 100644 index 0000000..9915a35 --- /dev/null +++ b/app/Models/Testimonial.php @@ -0,0 +1,24 @@ +belongsTo(Page::class); + } +} diff --git a/app/Services/TemplateService.php b/app/Services/TemplateService.php index c7329c4..2ec2360 100644 --- a/app/Services/TemplateService.php +++ b/app/Services/TemplateService.php @@ -173,8 +173,6 @@ class TemplateService ->image() ->disk('public') ->directory('templates/images') - ->imageEditor() - ->imageEditorAspectRatios([null, '16:9', '4:3', '1:1']) ->maxSize(5120), 'images' => FileUpload::make("{$dataKey}.{$placeholder}") @@ -183,7 +181,6 @@ class TemplateService ->disk('public') ->directory('templates/images') ->multiple() - ->imageEditor() ->maxSize(5120) ->maxFiles(10), diff --git a/config/livewire.php b/config/livewire.php index 908b9e6..9ebf010 100644 --- a/config/livewire.php +++ b/config/livewire.php @@ -66,7 +66,7 @@ return [ 'temporary_file_upload' => [ 'disk' => 'public', // Example: 'local', 's3' | Default: 'default' 'rules' => null, // Example: ['file', 'mimes:png,jpg'] | Default: ['required', 'file', 'max:12288'] (12MB) - 'directory' => null, // Example: 'tmp' | Default: 'livewire-tmp' + 'directory' => 'livewire-tmp', // Example: 'tmp' | Default: 'livewire-tmp' 'middleware' => null, // Example: 'throttle:5,1' | Default: 'throttle:60,1' 'preview_mimes' => [ // Supported file types for temporary pre-signed file URLs... 'png', 'gif', 'bmp', 'svg', 'wav', 'mp4', diff --git a/database/migrations/2026_02_06_231314_create_testimonials_table.php b/database/migrations/2026_02_06_231314_create_testimonials_table.php new file mode 100644 index 0000000..da19ba6 --- /dev/null +++ b/database/migrations/2026_02_06_231314_create_testimonials_table.php @@ -0,0 +1,35 @@ +id(); + $table->foreignId('page_id')->nullable()->constrained()->onDelete('cascade'); + $table->string('name'); + $table->string('position')->nullable(); + $table->text('content'); + $table->integer('rating')->default(5); + $table->string('avatar')->nullable(); + $table->boolean('is_active')->default(true); + $table->integer('sort_order')->default(0); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('testimonials'); + } +}; diff --git a/database/migrations/2026_02_08_003931_add_data_to_pages_table.php b/database/migrations/2026_02_08_003931_add_data_to_pages_table.php new file mode 100644 index 0000000..423e00e --- /dev/null +++ b/database/migrations/2026_02_08_003931_add_data_to_pages_table.php @@ -0,0 +1,28 @@ +json('data')->nullable()->after('sections'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('pages', function (Blueprint $table) { + $table->dropColumn('data')->nullable(); + }); + } +}; diff --git a/database/seeders/LogosPageSeeder.php b/database/seeders/LogosPageSeeder.php new file mode 100644 index 0000000..d4a3bd1 --- /dev/null +++ b/database/seeders/LogosPageSeeder.php @@ -0,0 +1,41 @@ +first(); + if (!$corporate) return; + + Page::updateOrCreate( + ['slug' => 'logolarimiz'], + [ + 'author_id' => $author->id, + 'parent_id' => $corporate->id, + 'title' => 'Logolarımız', + 'excerpt' => 'Kurumsal logolarımız ve kullanım standartları', + 'content' => null, + 'template' => 'corporate.logos', + 'status' => 'published', + 'is_homepage' => false, + 'show_in_menu' => true, + 'sort_order' => 6, + 'published_at' => now(), + ] + ); + + $this->command->info('✅ Logolarımız sayfası başarıyla eklendi!'); + } +} diff --git a/database/seeders/PageSeeder.php b/database/seeders/PageSeeder.php index 4f9501f..ab980bd 100644 --- a/database/seeders/PageSeeder.php +++ b/database/seeders/PageSeeder.php @@ -132,7 +132,7 @@ class PageSeeder extends Seeder ); // 2.5 Müşteri Görüşleri (Child of Kurumsal) - Page::updateOrCreate( + $testimonialsPage = Page::updateOrCreate( ['slug' => 'musteri-gorusleri'], [ 'author_id' => $author->id, @@ -149,6 +149,38 @@ class PageSeeder extends Seeder ] ); + // Varsayılan müşteri görüşlerini ekle + $defaultTestimonials = [ + [ + 'name' => 'Kerem Can Azak', + 'position' => 'Stellar Construction', + 'content' => 'Dijital dönüşüm yolculuğumuzda yanımızda oldukları için mutluyuz. Profesyonel yaklaşımları ve çözüm odaklı çalışmaları ile projelerimize değer kattılar.', + 'rating' => 5, + 'sort_order' => 1, + ], + [ + 'name' => 'Servet Demir', + 'position' => 'Dijimind Akademi', + 'content' => 'Eğitim teknolojileri alanındaki vizyoner bakış açıları ve teknik altyapı konusundaki uzmanlıkları sayesinde hedeflediğimiz kitleye çok daha etkili bir şekilde ulaştık.', + 'rating' => 5, + 'sort_order' => 2, + ], + [ + 'name' => 'A. Cezmi Savaş', + 'position' => 'Rhapsode Akademik Yayınevi', + 'content' => 'Akademik yayıncılık süreçlerimizi dijitalleştirirken sundukları yenilikçi çözümler ve hızlı destekleri için teşekkür ederiz. Güvenilir bir iş ortağı.', + 'rating' => 5, + 'sort_order' => 3, + ], + ]; + + foreach ($defaultTestimonials as $testimonialData) { + \App\Models\Testimonial::updateOrCreate( + ['page_id' => $testimonialsPage->id, 'name' => $testimonialData['name']], + $testimonialData + ); + } + // 3. Ürünlerimiz (Mega Menu Target) Page::updateOrCreate( ['slug' => 'urunlerimiz'], diff --git a/package-lock.json b/package-lock.json index 90ee789..e53e4db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,9 +1,10 @@ { - "name": "public_html", + "name": "citrus", "lockfileVersion": 3, "requires": true, "packages": { "": { + "name": "citrus", "devDependencies": { "@tailwindcss/vite": "^4.0.0", "axios": "^1.11.0", @@ -14,13 +15,14 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", - "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" @@ -30,13 +32,14 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", - "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -46,13 +49,14 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", - "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -62,13 +66,14 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", - "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -78,13 +83,14 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", - "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -94,13 +100,14 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", - "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -110,13 +117,14 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", - "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -126,13 +134,14 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", - "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -142,13 +151,14 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", - "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -158,13 +168,14 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", - "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -174,13 +185,14 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", - "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -190,13 +202,14 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", - "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -206,13 +219,14 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", - "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", "cpu": [ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -222,13 +236,14 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", - "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -238,13 +253,14 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", - "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -254,13 +270,14 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", - "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -270,13 +287,14 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", - "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -286,13 +304,14 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", - "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -302,13 +321,14 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", - "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -318,13 +338,14 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", - "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -334,13 +355,14 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", - "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -350,13 +372,14 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", - "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openharmony" @@ -366,13 +389,14 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", - "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -382,13 +406,14 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", - "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -398,13 +423,14 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", - "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -414,13 +440,14 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", - "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -1314,11 +1341,12 @@ } }, "node_modules/esbuild": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", - "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -1326,32 +1354,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.10", - "@esbuild/android-arm": "0.25.10", - "@esbuild/android-arm64": "0.25.10", - "@esbuild/android-x64": "0.25.10", - "@esbuild/darwin-arm64": "0.25.10", - "@esbuild/darwin-x64": "0.25.10", - "@esbuild/freebsd-arm64": "0.25.10", - "@esbuild/freebsd-x64": "0.25.10", - "@esbuild/linux-arm": "0.25.10", - "@esbuild/linux-arm64": "0.25.10", - "@esbuild/linux-ia32": "0.25.10", - "@esbuild/linux-loong64": "0.25.10", - "@esbuild/linux-mips64el": "0.25.10", - "@esbuild/linux-ppc64": "0.25.10", - "@esbuild/linux-riscv64": "0.25.10", - "@esbuild/linux-s390x": "0.25.10", - "@esbuild/linux-x64": "0.25.10", - "@esbuild/netbsd-arm64": "0.25.10", - "@esbuild/netbsd-x64": "0.25.10", - "@esbuild/openbsd-arm64": "0.25.10", - "@esbuild/openbsd-x64": "0.25.10", - "@esbuild/openharmony-arm64": "0.25.10", - "@esbuild/sunos-x64": "0.25.10", - "@esbuild/win32-arm64": "0.25.10", - "@esbuild/win32-ia32": "0.25.10", - "@esbuild/win32-x64": "0.25.10" + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" } }, "node_modules/escalade": { @@ -1917,6 +1945,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, + "peer": true, "engines": { "node": ">=12" }, @@ -2099,10 +2128,11 @@ } }, "node_modules/tar": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", - "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", + "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -2146,12 +2176,14 @@ "dev": true }, "node_modules/vite": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.7.tgz", - "integrity": "sha512-VbA8ScMvAISJNJVbRDTJdCwqQoAareR/wutevKanhR2/1EkoXVZVkkORaYm/tNVCjP/UDTKtcw3bAkwOUdedmA==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "esbuild": "^0.25.0", + "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", diff --git a/resources/views/templates/corporate/logos.blade.php b/resources/views/templates/corporate/logos.blade.php new file mode 100644 index 0000000..3cc4ee2 --- /dev/null +++ b/resources/views/templates/corporate/logos.blade.php @@ -0,0 +1,128 @@ +@extends('layouts.site') + +@section('content') + +
+
+ +
+
+

{!! t('Logolarımız') !!}

+
+
+ +
+
+

{!! t('Logomuzun Felsefesi') !!}

+ +
+

+ {!! t('Trunçgil, kelime anlamıyla birçok kelimenin birleşmesinden meydana gelmektedir. Dikkat ederseniz "turunçgil" tabirinden farklı olarak baştaki "T" ile "r" arasında "u" harfi yoktur. Bunun sebebi "Türkiye Cumhuriyeti"nin ulusal kısaltması olan "Tr" yi nitelemektedir.') !!} +

+

+ {!! t('"r" harfini kapattığınızda Trunçgil\'in kurucusu olan Ümit Tunç\'un soy ismi "Tunç" kelimesi oluşmaktadır. "gil" tabiri Türkçe\'de aile, ekosistem kavramını, Osmanlıca\'da su ile bulanmış toprak anlamını taşıyan "kil" tabirini ortaya çıkartmaktadır. Kelimenin toplamına baktığımızda okunuş itibariyle "turunçgil" turuncuyu yani dinamizmi simgelemektedir. Aynı zamanda İngilizce\'de budamak, kesmek anlamına gelen "truncate" kelimesini de çağrıştırmaktadır. Detaylı olarak bu kelimelerin logo üzerindeki anlamlarını açıklayalım.') !!} +

+
+ +
+
+

{!! t('TR: Önce Türkiye, Öncü Türkiye') !!}

+

+ {!! t('Yaptığımız ve yapacağımız bütün işlerin güzel yurdumuz olan Türkiye\'ye adadığımızı, baştan taahhüt etmekteyiz.') !!} +

+
+ +
+

{!! t('Tunç: Dayanıklılık ve Güç') !!}

+

+ {!! t('Ayakkabı tamiri yapan atamızın çekiç ve örs aletleri tunçtan yapılmıştı. 1934\'de yayınlanan soy ismi kanununda bu sebeple Tunç soyadını almışız. Tunç madeninin kullanım alanları çok dayanıklı araç ve gereçlerin yapımına sebep olmuştur. Dayanıklı araç ve gereçlerin dışında nispeten çok ince emek isteyen mücevher, takı ve süs aksesuarlarında da kullanılmıştır. Güçlü silahlar, değerli eşyalar ve süs eşyaları yapımında tunç madeninden oldukça faydalanılmıştır.') !!} +

+

+ {!! t('Bundan dolayıdır ki yapacağımız tüm işler tunç madeni kadar dayanıklı, tunç kadar ince emek isteyen işlerden oluşmasıdır.') !!} +

+
+ +
+

{!! t('Gil: Aile, ekosistem / kil yarı mamulü') !!}

+

+ {!! t('Toplumun en küçük birimi olan sosyal yapıyı niteleyen aile kavramını bütünsel yapılanma ve yapmış olduğumuz tüm ürünlerin bir ailenin ferdi olarak nitelendirdiğimizi belirtmek isteriz.') !!} +

+

+ {!! t('Osmanlıcadaki "gil" kelimesinin anlamı, sulanmış toprak olan "kil" hamur gibi işlenen ve bir ürün ortaya çıkartmak için kullanılan yarı mamulünü niteler. Dolayısıyla "gil", sistemde değişikliğe gidebilecek olduğumuzu, yapılan bir işi farklı bir işe kolay evirebileceğimizi nitelemektedir.') !!} +

+
+ +
+

{!! t('Truncate: Verimlilik için budamak') !!}

+

+ {!! t('Transact SQL dilinde de kullanılan "Truncate" deyimi budamak, kesmek anlamına gelmektedir. Budama aynı zamanda botanikte de bitkinin daha verimli olabilmesini, daha sağlıklı gelişebilmesini sağlamak amacıyla yapılan, fazla veya istenmeyen dalların kesilmesini sağlayan bir eylemdir.') !!} +

+

+ {!! t('Dolayısıyla "truncate" bizim nezdimizde yalın kodu, basitliğin en güzel gelişmişlik olduğunu betimlemektedir.') !!} +

+
+
+ +
+

{!! t('Logo Varyasyonlarımız') !!}

+ + + @php + $data = $page->data ?? []; + $logos = [ + ['label' => 'Logo 1', 'file' => $data['logo_1'] ?? null], + ['label' => 'Logo 2', 'file' => $data['logo_2'] ?? null], + ['label' => 'Logo 3', 'file' => $data['logo_3'] ?? null], + ]; + @endphp + +
+ @foreach($logos as $logo) + @if($logo['file']) +
+
+
+
+
+ +
+
+ + {{ $logo['label'] }} +
+
{!! t($logo['label']) !!}
+
+ +
+
+
+ @endif + @endforeach +
+ +
+
+ +
+
{!! t('Logoların Kullanımı Hakkında') !!}
+

+ {!! t('Trunçgil logoları, markanın bütünlüğünü korumak adına oranları bozulmadan ve renk paletine sadık kalınarak kullanılmalıdır. SVG formatındaki dosyalar yüksek kalitede baskı için uygundur.') !!} +

+
+
+
+
+
+
+ +
+
+ +@endsection diff --git a/resources/views/templates/corporate/testimonials.blade.php b/resources/views/templates/corporate/testimonials.blade.php index 4446f75..427b5e8 100644 --- a/resources/views/templates/corporate/testimonials.blade.php +++ b/resources/views/templates/corporate/testimonials.blade.php @@ -3,12 +3,12 @@ @section('content') {{-- Unified Hero & Testimonials Section --}} -
+
- {{-- Inline style override to ensure background image works if JS fails --}} + {{-- Inline style scoped to this ID --}} @@ -30,20 +30,34 @@
+ @php + $testimonials = $page ? $page->testimonials()->where('is_active', true)->orderBy('sort_order')->get() : collect([]); + @endphp - {{-- Müşteri 1: Stellar Construction --}} + @forelse($testimonials as $testimonial)
- + + @for($i=0; $i<$testimonial->rating; $i++) + + @endfor +
-

“{!! t('Dijital dönüşüm yolculuğumuzda yanımızda oldukları için mutluyuz. Profesyonel yaklaşımları ve çözüm odaklı çalışmaları ile projelerimize değer kattılar.') !!}”

+

“{!! $testimonial->content !!}”

+ @if($testimonial->avatar) +
+ {{ $testimonial->name }} +
+ @endif
-
Kerem Can Azak
-

Stellar Construction

+
{{ $testimonial->name }}
+ @if($testimonial->position) +

{{ $testimonial->position }}

+ @endif
@@ -51,47 +65,15 @@
- - {{-- Müşteri 2: Dijimind Akademi --}} + @empty
-
-
- -
-

“{!! t('Eğitim teknolojileri alanındaki vizyoner bakış açıları ve teknik altyapı konusundaki uzmanlıkları sayesinde hedeflediğimiz kitleye çok daha etkili bir şekilde ulaştık.') !!}”

-
-
-
Servet Demir
-

Dijimind Akademi

-
-
-
-
+
+

{{ t('Henüz bir müşteri görüşü eklenmemiş.') }}

- - {{-- Müşteri 3: Rhapsode Akademik Yayınevi --}} -
-
-
-
- -
-

“{!! t('Akademik yayıncılık süreçlerimizi dijitalleştirirken sundukları yenilikçi çözümler ve hızlı destekleri için teşekkür ederiz. Güvenilir bir iş ortağı.') !!}”

-
-
-
A. Cezmi Savaş
-

Rhapsode Akademik Yayınevi

-
-
-
-
-
-
-
- + @endforelse
diff --git a/resources/views/templates/generic.blade.php b/resources/views/templates/generic.blade.php index 91942b9..3b50d67 100644 --- a/resources/views/templates/generic.blade.php +++ b/resources/views/templates/generic.blade.php @@ -30,10 +30,18 @@ @endif @endforeach @else - {{-- Hiç blok yoksa placeholder göster --}} -
-

Bu sayfa henüz içerik eklenmemiş

-

Admin panelinden bu sayfaya bloklar ekleyebilirsiniz.

+ {{-- Hiç blok yoksa standart content'i göster --}} +
+ @if($page && $page->translate('content')) +
+ {!! $page->translate('content') !!} +
+ @else +
+

{{ t('Bu sayfa henüz içerik bulunmuyor') }}

+

{{ t('Admin panelinden bu sayfaya içerik veya bloklar ekleyebilirsiniz.') }}

+
+ @endif
@endif @endsection diff --git a/resources/views/templates/home/testimonials.blade.php b/resources/views/templates/home/testimonials.blade.php index f7ecce6..ef41a9e 100644 --- a/resources/views/templates/home/testimonials.blade.php +++ b/resources/views/templates/home/testimonials.blade.php @@ -19,45 +19,36 @@
+ @php + $homePageTestimonials = $page ? $page->testimonials()->where('is_active', true)->orderBy('sort_order')->get() : collect([]); + + // If home page has no testimonials, maybe fetch from 'musteri-gorusleri' page as fallback + if ($homePageTestimonials->isEmpty()) { + $tPage = \App\Models\Page::where('slug', 'musteri-gorusleri')->first(); + if ($tPage) { + $homePageTestimonials = $tPage->testimonials()->where('is_active', true)->orderBy('sort_order')->take(5)->get(); + } + } + @endphp + + @forelse($homePageTestimonials as $testimonial)
-

"{!! t('Dijital dönüşüm yolculuğumuzda yanımızda oldukları için mutluyuz. Profesyonel yaklaşımları ve çözüm odaklı çalışmaları ile projelerimize değer kattılar.') !!}"

+

"{!! $testimonial->content !!}"

-
Kerem Can Azak
-

Stellar Construction

+
{{ $testimonial->name }}
+

{{ $testimonial->position }}

- + @empty
- -
-

"{!! t('Eğitim teknolojileri alanındaki vizyoner bakış açıları ve teknik altyapı konusundaki uzmanlıkları sayesinde hedeflediğimiz kitleye çok daha etkili bir şekilde ulaştık.') !!}"

-
-
-
Servet Demir
-

Dijimind Akademi

-
-
-
+

{{ t('Müşteri görüşleri yakında burada olacak.') }}

- -
- -
-

"{!! t('Akademik yayıncılık süreçlerimizi dijitalleştirirken sundukları yenilikçi çözümler ve hızlı destekleri için teşekkür ederiz. Güvenilir bir iş ortağı.') !!}"

-
-
-
A. Cezmi Savaş
-

Rhapsode Akademik Yayınevi

-
-
-
-
- + @endforelse
diff --git a/routes/web.php b/routes/web.php index 2b6a596..723af2c 100644 --- a/routes/web.php +++ b/routes/web.php @@ -12,6 +12,7 @@ Route::redirect('/index', '/', 301); Route::redirect('/index.php', '/', 301); Route::redirect('/index.html', '/', 301); +// Debug Route - Veritabanı kontrolü (Sadece super_admin) Route::get('/debug-homepage', function () { $page = Page::with(['headerTemplate', 'footerTemplate']) ->where('is_homepage', true) @@ -57,7 +58,7 @@ Route::get('/debug-homepage', function () { 'data' => $page->sections_data, ], ]); -}); +})->middleware(['auth', \App\Http\Middleware\SuperAdminMiddleware::class]); // Language Switch Route::get('/lang/{locale}', function ($locale) { @@ -87,7 +88,7 @@ Route::any('/admin/template-preview', [TemplatePreviewController::class, 'previe ->name('template.preview'); // Site Translations API (DevExtreme DataGrid için) -Route::prefix('admin/api')->middleware(['auth'])->group(function () { +Route::prefix('admin/api')->middleware(['auth', \App\Http\Middleware\SuperAdminMiddleware::class])->group(function () { Route::get('/site-translations', [SiteTranslationController::class, 'index'])->name('api.site-translations.index'); Route::post('/site-translations', [SiteTranslationController::class, 'store'])->name('api.site-translations.store'); Route::put('/site-translations/{id}', [SiteTranslationController::class, 'update'])->name('api.site-translations.update'); @@ -99,5 +100,26 @@ Route::prefix('admin/api')->middleware(['auth'])->group(function () { // Products & Services Route::get('/urun-hizmet/{slug}', [\App\Http\Controllers\ProductController::class, 'show'])->name('products.show'); +// Logo Preview +Route::get('/logo-preview', function (Illuminate\Http\Request $request) { + $path = $request->query('path'); + $bg = $request->query('bg', 'ffffff'); + if (!$path) abort(404); + + return " + + + Logo Preview + + + + + + "; +})->name('logo.preview'); + // Pages (en sonda olmalı - catch-all) Route::get('/{slug}', [PageController::class, 'show'])->name('page.show'); From b289cfd829e4ca9722ca37ad95e827c34c8bbb50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Muhammet=20G=C3=BCler?= Date: Mon, 9 Feb 2026 15:18:59 +0300 Subject: [PATCH 2/2] feat: re-enable image editor and aspect ratios for blog and page settings --- app/Filament/Admin/Resources/Blogs/Schemas/BlogForm.php | 6 ++++++ .../Pages/Schemas/Sections/PageSettingsSection.php | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/app/Filament/Admin/Resources/Blogs/Schemas/BlogForm.php b/app/Filament/Admin/Resources/Blogs/Schemas/BlogForm.php index 66c452d..15347c5 100644 --- a/app/Filament/Admin/Resources/Blogs/Schemas/BlogForm.php +++ b/app/Filament/Admin/Resources/Blogs/Schemas/BlogForm.php @@ -71,6 +71,12 @@ class BlogForm ->disk('public') ->directory('blogs/featured') ->visibility('public') + ->imageEditor() + ->imageEditorAspectRatios([ + '16:9', + '4:3', + '1:1', + ]) ->helperText(__('blog.featured_image_helper')) ->columnSpanFull(), diff --git a/app/Filament/Admin/Resources/Pages/Schemas/Sections/PageSettingsSection.php b/app/Filament/Admin/Resources/Pages/Schemas/Sections/PageSettingsSection.php index de1ba11..a54e347 100644 --- a/app/Filament/Admin/Resources/Pages/Schemas/Sections/PageSettingsSection.php +++ b/app/Filament/Admin/Resources/Pages/Schemas/Sections/PageSettingsSection.php @@ -21,6 +21,12 @@ class PageSettingsSection ->disk('public') ->directory('pages/featured') ->visibility('public') + ->imageEditor() + ->imageEditorAspectRatios([ + '16:9', + '4:3', + '1:1', + ]) ->helperText(__('pages.featured_image_helper_text')) ->columnSpanFull(),