Enhance Settings and PageController Logic: Updated the SettingForm to include dynamic selection for header and footer templates based on active settings, improving modularity and user experience. Refactored PageController to retrieve active settings for rendering templates, ensuring fallback logic is streamlined and enhancing overall functionality. Updated navbar component to dynamically display social media links from settings, contributing to better localization and user engagement.
This commit is contained in:
@@ -42,6 +42,7 @@ class SettingForm
|
||||
->regex('/^[a-z0-9_-]+$/')
|
||||
->maxLength(255)
|
||||
->disabled(fn ($record) => $record !== null)
|
||||
->live(onBlur: true)
|
||||
->columnSpanFull(),
|
||||
|
||||
TextInput::make('label')
|
||||
@@ -114,10 +115,28 @@ class SettingForm
|
||||
->label(__('settings.value'))
|
||||
->helperText(__('settings.value_helper'))
|
||||
->required()
|
||||
->visible(fn (Get $get) => in_array($get('type'), ['string', 'text', 'json']))
|
||||
->visible(fn (Get $get) => in_array($get('type'), ['string', 'text', 'json']) && !in_array($get('key'), ['default_header', 'default_footer']))
|
||||
->rows(fn (Get $get) => $get('type') === 'text' ? 5 : 3)
|
||||
->columnSpanFull(),
|
||||
|
||||
Select::make('value_header_template')
|
||||
->label('Default Header Template')
|
||||
->options(\App\Models\HeaderTemplate::where('is_active', true)->pluck('title', 'id'))
|
||||
->visible(fn (Get $get) => $get('key') === 'default_header')
|
||||
->statePath('value')
|
||||
->searchable()
|
||||
->preload()
|
||||
->columnSpanFull(),
|
||||
|
||||
Select::make('value_footer_template')
|
||||
->label('Default Footer Template')
|
||||
->options(\App\Models\FooterTemplate::where('is_active', true)->pluck('title', 'id'))
|
||||
->visible(fn (Get $get) => $get('key') === 'default_footer')
|
||||
->statePath('value')
|
||||
->searchable()
|
||||
->preload()
|
||||
->columnSpanFull(),
|
||||
|
||||
Toggle::make('value_boolean')
|
||||
->label(__('settings.value'))
|
||||
->helperText(__('settings.value_helper'))
|
||||
|
||||
@@ -24,7 +24,7 @@ class PageController extends Controller
|
||||
->latest('updated_at')
|
||||
->first();
|
||||
|
||||
$settings = class_exists(Setting::class) ? (Setting::query()->first()) : null;
|
||||
$settings = class_exists(Setting::class) ? (object) Setting::where('is_active', true)->pluck('value', 'key')->toArray() : null;
|
||||
|
||||
$renderedHeader = null;
|
||||
$renderedFooter = null;
|
||||
@@ -43,11 +43,14 @@ class PageController extends Controller
|
||||
|
||||
// Header Render
|
||||
$headerTemplate = $page->headerTemplate;
|
||||
/*
|
||||
|
||||
if (!$headerTemplate) {
|
||||
$headerTemplate = HeaderTemplate::where('is_active', true)->latest('updated_at')->first();
|
||||
$defaultHeaderId = $settings->default_header ?? null;
|
||||
if ($defaultHeaderId) {
|
||||
$headerTemplate = HeaderTemplate::find($defaultHeaderId);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
if ($headerTemplate) {
|
||||
$templateDefaults = $headerTemplate->default_data ?? [];
|
||||
$pageData = $page->header_data ?? [];
|
||||
@@ -57,11 +60,13 @@ class PageController extends Controller
|
||||
|
||||
// Footer Render
|
||||
$footerTemplate = $page->footerTemplate;
|
||||
/*
|
||||
|
||||
if (!$footerTemplate) {
|
||||
$footerTemplate = FooterTemplate::where('is_active', true)->latest('updated_at')->first();
|
||||
$defaultFooterId = $settings->default_footer ?? null;
|
||||
if ($defaultFooterId) {
|
||||
$footerTemplate = FooterTemplate::find($defaultFooterId);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
if ($footerTemplate) {
|
||||
$templateDefaults = $footerTemplate->default_data ?? [];
|
||||
@@ -96,7 +101,7 @@ class PageController extends Controller
|
||||
|
||||
|
||||
|
||||
$settings = class_exists(Setting::class) ? (Setting::query()->first()) : null;
|
||||
$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
|
||||
if (!$page) {
|
||||
@@ -142,9 +147,10 @@ class PageController extends Controller
|
||||
|
||||
// Eğer sayfa için header seçilmemişse, en son aktif header template'i kullan
|
||||
if (!$headerTemplate) {
|
||||
$headerTemplate = HeaderTemplate::where('is_active', true)
|
||||
->latest('updated_at')
|
||||
->first();
|
||||
$defaultHeaderId = $settings->default_header ?? null;
|
||||
if ($defaultHeaderId) {
|
||||
$headerTemplate = HeaderTemplate::find($defaultHeaderId);
|
||||
}
|
||||
}
|
||||
|
||||
if ($headerTemplate) {
|
||||
@@ -165,13 +171,12 @@ class PageController extends Controller
|
||||
$footerTemplate = $page->footerTemplate;
|
||||
|
||||
// Eğer sayfa için footer seçilmemişse, en son aktif footer template'i kullan
|
||||
/*
|
||||
if (!$footerTemplate) {
|
||||
$footerTemplate = FooterTemplate::where('is_active', true)
|
||||
->latest('updated_at')
|
||||
->first();
|
||||
$defaultFooterId = $settings->default_footer ?? null;
|
||||
if ($defaultFooterId) {
|
||||
$footerTemplate = FooterTemplate::find($defaultFooterId);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
if ($footerTemplate) {
|
||||
// Merge template defaults with page data (page data overrides defaults)
|
||||
@@ -214,7 +219,7 @@ class PageController extends Controller
|
||||
->where('status', 'published')
|
||||
->first();
|
||||
|
||||
$settings = class_exists(Setting::class) ? (Setting::query()->first()) : null;
|
||||
$settings = class_exists(Setting::class) ? (object) Setting::where('is_active', true)->pluck('value', 'key')->toArray() : null;
|
||||
|
||||
// Meta verilerini hazırla
|
||||
$metaTitle = null;
|
||||
@@ -238,7 +243,10 @@ class PageController extends Controller
|
||||
// Render Header Template
|
||||
$headerTemplate = $page->headerTemplate;
|
||||
if (!$headerTemplate) {
|
||||
$headerTemplate = HeaderTemplate::where('is_active', true)->latest('updated_at')->first();
|
||||
$defaultHeaderId = $settings->default_header ?? null;
|
||||
if ($defaultHeaderId) {
|
||||
$headerTemplate = HeaderTemplate::find($defaultHeaderId);
|
||||
}
|
||||
}
|
||||
|
||||
if ($headerTemplate) {
|
||||
@@ -250,11 +258,13 @@ class PageController extends Controller
|
||||
|
||||
// Render Footer Template
|
||||
$footerTemplate = $page->footerTemplate;
|
||||
/*
|
||||
|
||||
if (!$footerTemplate) {
|
||||
$footerTemplate = FooterTemplate::where('is_active', true)->latest('updated_at')->first();
|
||||
$defaultFooterId = $settings->default_footer ?? null;
|
||||
if ($defaultFooterId) {
|
||||
$footerTemplate = FooterTemplate::find($defaultFooterId);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
if ($footerTemplate) {
|
||||
$templateDefaults = $footerTemplate->default_data ?? [];
|
||||
@@ -285,7 +295,7 @@ class PageController extends Controller
|
||||
->where('status', 'published')
|
||||
->firstOrFail();
|
||||
|
||||
$settings = class_exists(Setting::class) ? (Setting::query()->first()) : null;
|
||||
$settings = class_exists(Setting::class) ? (object) Setting::where('is_active', true)->pluck('value', 'key')->toArray() : null;
|
||||
|
||||
$metaTitle = method_exists($page, 'translate')
|
||||
? ($page->translate('meta_title') ?: $page->translate('title'))
|
||||
@@ -318,9 +328,10 @@ class PageController extends Controller
|
||||
|
||||
// Eğer sayfa için header seçilmemişse, en son aktif header template'i kullan
|
||||
if (!$headerTemplate) {
|
||||
$headerTemplate = HeaderTemplate::where('is_active', true)
|
||||
->latest('updated_at')
|
||||
->first();
|
||||
$defaultHeaderId = $settings->default_header ?? null;
|
||||
if ($defaultHeaderId) {
|
||||
$headerTemplate = HeaderTemplate::find($defaultHeaderId);
|
||||
}
|
||||
}
|
||||
|
||||
if ($headerTemplate) {
|
||||
@@ -341,13 +352,12 @@ class PageController extends Controller
|
||||
$footerTemplate = $page->footerTemplate;
|
||||
|
||||
// Eğer sayfa için footer seçilmemişse, en son aktif footer template'i kullan
|
||||
/*
|
||||
if (!$footerTemplate) {
|
||||
$footerTemplate = FooterTemplate::where('is_active', true)
|
||||
->latest('updated_at')
|
||||
->first();
|
||||
$defaultFooterId = $settings->default_footer ?? null;
|
||||
if ($defaultFooterId) {
|
||||
$footerTemplate = FooterTemplate::find($defaultFooterId);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
if ($footerTemplate) {
|
||||
// Merge template defaults with page data (page data overrides defaults)
|
||||
|
||||
@@ -2,10 +2,11 @@
|
||||
<ul class="navbar-nav !flex-row !items-center !ml-auto">
|
||||
<li class="nav-item">
|
||||
<nav class="nav social social-muted justify-end text-right">
|
||||
<a class="m-[0_0_0_.7rem] text-[1rem] transition-all duration-[0.2s] ease-in-out translate-y-0 hover:translate-y-[-0.15rem]" href="#"><i class="uil uil-twitter before:content-['\ed59'] text-[1rem] !text-[#5daed5]"></i></a>
|
||||
<a class="m-[0_0_0_.7rem] text-[1rem] transition-all duration-[0.2s] ease-in-out translate-y-0 hover:translate-y-[-0.15rem]" href="#"><i class="uil uil-facebook-f before:content-['\eae2'] text-[1rem] !text-[#4470cf]"></i></a>
|
||||
<a class="m-[0_0_0_.7rem] text-[1rem] transition-all duration-[0.2s] ease-in-out translate-y-0 hover:translate-y-[-0.15rem]" href="#"><i class="uil uil-dribbble before:content-['\eaa2'] text-[1rem] !text-[#e94d88]"></i></a>
|
||||
<a class="m-[0_0_0_.7rem] text-[1rem] transition-all duration-[0.2s] ease-in-out translate-y-0 hover:translate-y-[-0.15rem]" href="#"><i class="uil uil-instagram before:content-['\eb9c'] text-[1rem] !text-[#d53581]"></i></a>
|
||||
<?php $social_media = json_decode(setting('social_links'), true); ?>
|
||||
<a class="m-[0_0_0_.7rem] text-[1rem] transition-all duration-[0.2s] ease-in-out translate-y-0 hover:translate-y-[-0.15rem]" href="{{ !empty($social_media['Twitter']) ? $social_media['Twitter'] : '#' }}" target="_blank" rel="noopener"><i class="uil uil-twitter before:content-['\ed59'] text-[1rem] !text-[#5daed5]"></i></a>
|
||||
<a class="m-[0_0_0_.7rem] text-[1rem] transition-all duration-[0.2s] ease-in-out translate-y-0 hover:translate-y-[-0.15rem]" href="{{ !empty($social_media['Facebook']) ? $social_media['Facebook'] : '#' }}" target="_blank" rel="noopener"><i class="uil uil-facebook-f before:content-['\eae2'] text-[1rem] !text-[#4470cf]"></i></a>
|
||||
<a class="m-[0_0_0_.7rem] text-[1rem] transition-all duration-[0.2s] ease-in-out translate-y-0 hover:translate-y-[-0.15rem]" href="{{ !empty($social_media['Github']) ? $social_media['Github'] : '#' }}" target="_blank" rel="noopener"><i class="uil uil-github before:content-['\eb40'] text-[1rem] !text-[#e94d88]"></i></a>
|
||||
<a class="m-[0_0_0_.7rem] text-[1rem] transition-all duration-[0.2s] ease-in-out translate-y-0 hover:translate-y-[-0.15rem]" href="{{ !empty($social_media['Instagram']) ? $social_media['Instagram'] : '#' }}" target="_blank" rel="noopener"><i class="uil uil-instagram before:content-['\eb9c'] text-[1rem] !text-[#d53581]"></i></a>
|
||||
</nav>
|
||||
<!-- /.social -->
|
||||
</li>
|
||||
|
||||
@@ -3,46 +3,42 @@
|
||||
@php
|
||||
$hasChildren = $item->children->isNotEmpty();
|
||||
$isMegaMenu = $item->slug === 'urunlerimiz';
|
||||
|
||||
$productCategories = [];
|
||||
if($isMegaMenu) {
|
||||
$productCategories = \App\Models\ProductCategory::with(['products' => function($q) {
|
||||
$q->where('is_active', true)->orderBy('sort_order');
|
||||
}])->where('is_active', true)->orderBy('sort_order')->get();
|
||||
}
|
||||
@endphp
|
||||
|
||||
@if($isMegaMenu)
|
||||
<li class="nav-item dropdown dropdown-mega">
|
||||
<a class="nav-link dropdown-toggle font-bold !tracking-[normal]" href="{{ route('page.show', $item->slug) }}" data-bs-toggle="dropdown">{{ $item->translate('title') }}</a>
|
||||
<a class="nav-link dropdown-toggle font-bold !tracking-[normal]" href="{{ route('page.show', $item->slug) }}" data-bs-toggle="dropdown">{{ $item->translate('title') }}</a>
|
||||
<ul class="dropdown-menu mega-menu">
|
||||
<li class="mega-menu-content">
|
||||
<div class="flex flex-wrap mx-0 xl:mx-[-7.5px] lg:mx-[-7.5px]">
|
||||
<div class="xl:w-4/12 lg:w-4/12 w-full flex-[0_0_auto] max-w-full">
|
||||
<h6 class="dropdown-header !text-[#e31e24]">Kategoriler</h6>
|
||||
<ul class="pl-0 list-none xl:columns-2 lg:columns-2 xl:pb-1 lg:pb-1">
|
||||
<li class="xl:inline-block xl:w-full lg:inline-block lg:w-full"><a class='dropdown-item hover:!text-[#e31e24]' href='#'>Yazılım Çözümleri</a></li>
|
||||
<li class="xl:inline-block xl:w-full lg:inline-block lg:w-full"><a class='dropdown-item hover:!text-[#e31e24]' href='#'>Donanım</a></li>
|
||||
<li class="xl:inline-block xl:w-full lg:inline-block lg:w-full"><a class='dropdown-item hover:!text-[#e31e24]' href='#'>Danışmanlık</a></li>
|
||||
<li class="xl:inline-block xl:w-full lg:inline-block lg:w-full"><a class='dropdown-item hover:!text-[#e31e24]' href='#'>Entegrasyon</a></li>
|
||||
</ul>
|
||||
<h6 class="dropdown-header !text-[#e31e24] xl:!mt-6 lg:!mt-6">Sektörler</h6>
|
||||
<ul class="pl-0 list-none xl:columns-2 lg:columns-2">
|
||||
<li class="xl:inline-block xl:w-full lg:inline-block lg:w-full"><a class='dropdown-item hover:!text-[#e31e24]' href='#'>Finans</a></li>
|
||||
<li class="xl:inline-block xl:w-full lg:inline-block lg:w-full"><a class='dropdown-item hover:!text-[#e31e24]' href='#'>Sağlık</a></li>
|
||||
<li class="xl:inline-block xl:w-full lg:inline-block lg:w-full"><a class='dropdown-item hover:!text-[#e31e24]' href='#'>Eğitim</a></li>
|
||||
<li class="xl:inline-block xl:w-full lg:inline-block lg:w-full"><a class='dropdown-item hover:!text-[#e31e24]' href='#'>Perakende</a></li>
|
||||
@foreach($productCategories as $category)
|
||||
<div class="xl:w-3/12 lg:w-3/12 md:w-6/12 w-full flex-[0_0_auto] max-w-full mb-8 px-[7.5px]">
|
||||
<h6 class="dropdown-header !text-[#e31e24] mb-4 border-b border-gray-100 pb-2">
|
||||
{{ $category->translate('title') }}
|
||||
</h6>
|
||||
<ul class="pl-0 list-none space-y-3">
|
||||
@foreach($category->products as $product)
|
||||
<li>
|
||||
<a class='dropdown-item hover:!text-[#e31e24] group flex items-center gap-3 !p-0 !bg-transparent' href='{{ route('products.show', $product->slug) }}'>
|
||||
<div class="img-mask mask-3 w-10 h-10 shrink-0 bg-gray-100">
|
||||
@if($product->hero_image)
|
||||
<img src="{{ \Storage::url($product->hero_image) }}" alt="{{ $product->translate('title') }}" class="w-full h-full object-cover" />
|
||||
@endif
|
||||
</div>
|
||||
<span class="text-sm font-medium group-hover:pl-1 transition-all">{{ $product->translate('title') }}</span>
|
||||
</a>
|
||||
</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
</div>
|
||||
<!--/column -->
|
||||
<div class="xl:w-8/12 lg:w-8/12 w-full flex-[0_0_auto] max-w-full xl:border-l-[rgba(164,174,198,0.2)] xl:border-l xl:border-solid lg:border-l-[rgba(164,174,198,0.2)] lg:border-l lg:border-solid">
|
||||
<h6 class="dropdown-header !text-[#e31e24]">Öne Çıkan Ürünler</h6>
|
||||
<ul class="pl-0 list-none xl:columns-3 lg:columns-3">
|
||||
<li><a class='dropdown-item hover:!text-[#e31e24]' href='#'>ERP Sistemi</a></li>
|
||||
<li><a class='dropdown-item hover:!text-[#e31e24]' href='#'>CRM Modülü</a></li>
|
||||
<li><a class='dropdown-item hover:!text-[#e31e24]' href='#'>Mobil App</a></li>
|
||||
<li><a class='dropdown-item hover:!text-[#e31e24]' href='#'>Web Sitesi</a></li>
|
||||
<li><a class='dropdown-item hover:!text-[#e31e24]' href='#'>E-Ticaret</a></li>
|
||||
<li><a class='dropdown-item hover:!text-[#e31e24]' href='#'>SEO Paketi</a></li>
|
||||
<li><a class='dropdown-item hover:!text-[#e31e24]' href='#'>Hosting</a></li>
|
||||
<li><a class='dropdown-item hover:!text-[#e31e24]' href='#'>Bulut Yedekleme</a></li>
|
||||
<li><a class='dropdown-item hover:!text-[#e31e24]' href='#'>Siber Güvenlik</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<!--/column -->
|
||||
@endforeach
|
||||
</div>
|
||||
<!--/.row -->
|
||||
</li>
|
||||
@@ -53,7 +49,7 @@
|
||||
@else
|
||||
<li class="nav-item {{ $hasChildren ? 'dropdown' : '' }}">
|
||||
@if($hasChildren)
|
||||
<a class="nav-link dropdown-toggle font-bold !tracking-[normal]"
|
||||
<a class="nav-link dropdown-toggle font-bold !tracking-[normal]"
|
||||
href="{{ route('page.show', $item->slug) }}"
|
||||
data-bs-toggle="dropdown">
|
||||
{{ $item->translate('title') }}
|
||||
@@ -65,7 +61,7 @@
|
||||
@endphp
|
||||
@if($childHasChildren)
|
||||
<li class="dropdown dropdown-submenu dropend">
|
||||
<a class="nav-link dropdown-toggle font-bold !tracking-[normal]"
|
||||
<a class="nav-link dropdown-toggle font-bold !tracking-[normal]"
|
||||
href="{{ route('page.show', $child->slug) }}"
|
||||
data-bs-toggle="dropdown">
|
||||
{{ $child->translate('title') }}
|
||||
@@ -73,7 +69,7 @@
|
||||
<ul class="dropdown-menu">
|
||||
@foreach($child->children as $grandChild)
|
||||
<li class="nav-item">
|
||||
<a class="nav-link dropdown-toggle font-bold !tracking-[normal]"
|
||||
<a class="nav-link dropdown-toggle font-bold !tracking-[normal]"
|
||||
href="{{ route('page.show', $grandChild->slug) }}">
|
||||
{{ $grandChild->translate('title') }}
|
||||
</a>
|
||||
@@ -99,4 +95,3 @@
|
||||
@endif
|
||||
</li>
|
||||
@endif
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ $rightMenuItems = $menuItems->slice($midPoint);
|
||||
<nav class="navbar navbar-expand-lg center-logo transparent position-absolute navbar-dark">
|
||||
<div class="container justify-between items-center">
|
||||
<div class="flex flex-row w-full justify-between items-center xl:!hidden lg:!hidden">
|
||||
<div class="navbar-brand"><a href="index.html">
|
||||
<div class="navbar-brand"><a href="./">
|
||||
<img class="logo-dark" src="assets/img/truncgil-yatay.svg" alt="image">
|
||||
<img class="logo-light" src="assets/img/truncgil-yatay-dark.svg" alt="image">
|
||||
</a></div>
|
||||
|
||||
Reference in New Issue
Block a user