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_-]+$/')
|
->regex('/^[a-z0-9_-]+$/')
|
||||||
->maxLength(255)
|
->maxLength(255)
|
||||||
->disabled(fn ($record) => $record !== null)
|
->disabled(fn ($record) => $record !== null)
|
||||||
|
->live(onBlur: true)
|
||||||
->columnSpanFull(),
|
->columnSpanFull(),
|
||||||
|
|
||||||
TextInput::make('label')
|
TextInput::make('label')
|
||||||
@@ -114,10 +115,28 @@ class SettingForm
|
|||||||
->label(__('settings.value'))
|
->label(__('settings.value'))
|
||||||
->helperText(__('settings.value_helper'))
|
->helperText(__('settings.value_helper'))
|
||||||
->required()
|
->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)
|
->rows(fn (Get $get) => $get('type') === 'text' ? 5 : 3)
|
||||||
->columnSpanFull(),
|
->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')
|
Toggle::make('value_boolean')
|
||||||
->label(__('settings.value'))
|
->label(__('settings.value'))
|
||||||
->helperText(__('settings.value_helper'))
|
->helperText(__('settings.value_helper'))
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class PageController extends Controller
|
|||||||
->latest('updated_at')
|
->latest('updated_at')
|
||||||
->first();
|
->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;
|
$renderedHeader = null;
|
||||||
$renderedFooter = null;
|
$renderedFooter = null;
|
||||||
@@ -43,11 +43,14 @@ class PageController extends Controller
|
|||||||
|
|
||||||
// Header Render
|
// Header Render
|
||||||
$headerTemplate = $page->headerTemplate;
|
$headerTemplate = $page->headerTemplate;
|
||||||
/*
|
|
||||||
if (!$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) {
|
if ($headerTemplate) {
|
||||||
$templateDefaults = $headerTemplate->default_data ?? [];
|
$templateDefaults = $headerTemplate->default_data ?? [];
|
||||||
$pageData = $page->header_data ?? [];
|
$pageData = $page->header_data ?? [];
|
||||||
@@ -57,11 +60,13 @@ class PageController extends Controller
|
|||||||
|
|
||||||
// Footer Render
|
// Footer Render
|
||||||
$footerTemplate = $page->footerTemplate;
|
$footerTemplate = $page->footerTemplate;
|
||||||
/*
|
|
||||||
if (!$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) {
|
if ($footerTemplate) {
|
||||||
$templateDefaults = $footerTemplate->default_data ?? [];
|
$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
|
// Hiç sayfa yoksa: direkt home template'inin statik fallback'i ile render et
|
||||||
if (!$page) {
|
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
|
// Eğer sayfa için header seçilmemişse, en son aktif header template'i kullan
|
||||||
if (!$headerTemplate) {
|
if (!$headerTemplate) {
|
||||||
$headerTemplate = HeaderTemplate::where('is_active', true)
|
$defaultHeaderId = $settings->default_header ?? null;
|
||||||
->latest('updated_at')
|
if ($defaultHeaderId) {
|
||||||
->first();
|
$headerTemplate = HeaderTemplate::find($defaultHeaderId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($headerTemplate) {
|
if ($headerTemplate) {
|
||||||
@@ -165,13 +171,12 @@ class PageController extends Controller
|
|||||||
$footerTemplate = $page->footerTemplate;
|
$footerTemplate = $page->footerTemplate;
|
||||||
|
|
||||||
// Eğer sayfa için footer seçilmemişse, en son aktif footer template'i kullan
|
// Eğer sayfa için footer seçilmemişse, en son aktif footer template'i kullan
|
||||||
/*
|
|
||||||
if (!$footerTemplate) {
|
if (!$footerTemplate) {
|
||||||
$footerTemplate = FooterTemplate::where('is_active', true)
|
$defaultFooterId = $settings->default_footer ?? null;
|
||||||
->latest('updated_at')
|
if ($defaultFooterId) {
|
||||||
->first();
|
$footerTemplate = FooterTemplate::find($defaultFooterId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
if ($footerTemplate) {
|
if ($footerTemplate) {
|
||||||
// Merge template defaults with page data (page data overrides defaults)
|
// Merge template defaults with page data (page data overrides defaults)
|
||||||
@@ -214,7 +219,7 @@ class PageController extends Controller
|
|||||||
->where('status', 'published')
|
->where('status', 'published')
|
||||||
->first();
|
->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
|
// Meta verilerini hazırla
|
||||||
$metaTitle = null;
|
$metaTitle = null;
|
||||||
@@ -238,7 +243,10 @@ class PageController extends Controller
|
|||||||
// Render Header Template
|
// Render Header Template
|
||||||
$headerTemplate = $page->headerTemplate;
|
$headerTemplate = $page->headerTemplate;
|
||||||
if (!$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) {
|
if ($headerTemplate) {
|
||||||
@@ -250,11 +258,13 @@ class PageController extends Controller
|
|||||||
|
|
||||||
// Render Footer Template
|
// Render Footer Template
|
||||||
$footerTemplate = $page->footerTemplate;
|
$footerTemplate = $page->footerTemplate;
|
||||||
/*
|
|
||||||
if (!$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) {
|
if ($footerTemplate) {
|
||||||
$templateDefaults = $footerTemplate->default_data ?? [];
|
$templateDefaults = $footerTemplate->default_data ?? [];
|
||||||
@@ -285,7 +295,7 @@ class PageController extends Controller
|
|||||||
->where('status', 'published')
|
->where('status', 'published')
|
||||||
->firstOrFail();
|
->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')
|
$metaTitle = method_exists($page, 'translate')
|
||||||
? ($page->translate('meta_title') ?: $page->translate('title'))
|
? ($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
|
// Eğer sayfa için header seçilmemişse, en son aktif header template'i kullan
|
||||||
if (!$headerTemplate) {
|
if (!$headerTemplate) {
|
||||||
$headerTemplate = HeaderTemplate::where('is_active', true)
|
$defaultHeaderId = $settings->default_header ?? null;
|
||||||
->latest('updated_at')
|
if ($defaultHeaderId) {
|
||||||
->first();
|
$headerTemplate = HeaderTemplate::find($defaultHeaderId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($headerTemplate) {
|
if ($headerTemplate) {
|
||||||
@@ -341,13 +352,12 @@ class PageController extends Controller
|
|||||||
$footerTemplate = $page->footerTemplate;
|
$footerTemplate = $page->footerTemplate;
|
||||||
|
|
||||||
// Eğer sayfa için footer seçilmemişse, en son aktif footer template'i kullan
|
// Eğer sayfa için footer seçilmemişse, en son aktif footer template'i kullan
|
||||||
/*
|
|
||||||
if (!$footerTemplate) {
|
if (!$footerTemplate) {
|
||||||
$footerTemplate = FooterTemplate::where('is_active', true)
|
$defaultFooterId = $settings->default_footer ?? null;
|
||||||
->latest('updated_at')
|
if ($defaultFooterId) {
|
||||||
->first();
|
$footerTemplate = FooterTemplate::find($defaultFooterId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
if ($footerTemplate) {
|
if ($footerTemplate) {
|
||||||
// Merge template defaults with page data (page data overrides defaults)
|
// Merge template defaults with page data (page data overrides defaults)
|
||||||
|
|||||||
@@ -2,10 +2,11 @@
|
|||||||
<ul class="navbar-nav !flex-row !items-center !ml-auto">
|
<ul class="navbar-nav !flex-row !items-center !ml-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<nav class="nav social social-muted justify-end text-right">
|
<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>
|
<?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="#"><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['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="#"><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="{{ !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="#"><i class="uil uil-instagram before:content-['\eb9c'] text-[1rem] !text-[#d53581]"></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>
|
</nav>
|
||||||
<!-- /.social -->
|
<!-- /.social -->
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
@@ -3,6 +3,13 @@
|
|||||||
@php
|
@php
|
||||||
$hasChildren = $item->children->isNotEmpty();
|
$hasChildren = $item->children->isNotEmpty();
|
||||||
$isMegaMenu = $item->slug === 'urunlerimiz';
|
$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
|
@endphp
|
||||||
|
|
||||||
@if($isMegaMenu)
|
@if($isMegaMenu)
|
||||||
@@ -11,38 +18,27 @@
|
|||||||
<ul class="dropdown-menu mega-menu">
|
<ul class="dropdown-menu mega-menu">
|
||||||
<li class="mega-menu-content">
|
<li class="mega-menu-content">
|
||||||
<div class="flex flex-wrap mx-0 xl:mx-[-7.5px] lg:mx-[-7.5px]">
|
<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">
|
@foreach($productCategories as $category)
|
||||||
<h6 class="dropdown-header !text-[#e31e24]">Kategoriler</h6>
|
<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]">
|
||||||
<ul class="pl-0 list-none xl:columns-2 lg:columns-2 xl:pb-1 lg:pb-1">
|
<h6 class="dropdown-header !text-[#e31e24] mb-4 border-b border-gray-100 pb-2">
|
||||||
<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>
|
{{ $category->translate('title') }}
|
||||||
<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>
|
</h6>
|
||||||
<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>
|
<ul class="pl-0 list-none space-y-3">
|
||||||
<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>
|
@foreach($category->products as $product)
|
||||||
</ul>
|
<li>
|
||||||
<h6 class="dropdown-header !text-[#e31e24] xl:!mt-6 lg:!mt-6">Sektörler</h6>
|
<a class='dropdown-item hover:!text-[#e31e24] group flex items-center gap-3 !p-0 !bg-transparent' href='{{ route('products.show', $product->slug) }}'>
|
||||||
<ul class="pl-0 list-none xl:columns-2 lg:columns-2">
|
<div class="img-mask mask-3 w-10 h-10 shrink-0 bg-gray-100">
|
||||||
<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>
|
@if($product->hero_image)
|
||||||
<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>
|
<img src="{{ \Storage::url($product->hero_image) }}" alt="{{ $product->translate('title') }}" class="w-full h-full object-cover" />
|
||||||
<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>
|
@endif
|
||||||
<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>
|
</div>
|
||||||
|
<span class="text-sm font-medium group-hover:pl-1 transition-all">{{ $product->translate('title') }}</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
@endforeach
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<!--/column -->
|
@endforeach
|
||||||
<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 -->
|
|
||||||
</div>
|
</div>
|
||||||
<!--/.row -->
|
<!--/.row -->
|
||||||
</li>
|
</li>
|
||||||
@@ -99,4 +95,3 @@
|
|||||||
@endif
|
@endif
|
||||||
</li>
|
</li>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ $rightMenuItems = $menuItems->slice($midPoint);
|
|||||||
<nav class="navbar navbar-expand-lg center-logo transparent position-absolute navbar-dark">
|
<nav class="navbar navbar-expand-lg center-logo transparent position-absolute navbar-dark">
|
||||||
<div class="container justify-between items-center">
|
<div class="container justify-between items-center">
|
||||||
<div class="flex flex-row w-full justify-between items-center xl:!hidden lg:!hidden">
|
<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-dark" src="assets/img/truncgil-yatay.svg" alt="image">
|
||||||
<img class="logo-light" src="assets/img/truncgil-yatay-dark.svg" alt="image">
|
<img class="logo-light" src="assets/img/truncgil-yatay-dark.svg" alt="image">
|
||||||
</a></div>
|
</a></div>
|
||||||
|
|||||||
Reference in New Issue
Block a user