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); } // Hiç sayfa yoksa fallback if (!$page) { $meta = $this->getMeta(null, $settings); return view('templates.home', [ 'page' => null, 'settings' => $settings, 'meta' => $meta, 'structuredData' => PageStructuredData::forPage(null, url('/'), $meta['title'] ?? null, $meta['description'] ?? null), ]); } return $this->renderPage($page, $settings); } /** * Display a specific page by slug */ public function show($slug) { return $this->handleShow($slug); } /** * Handle nested page routes (e.g. /kurumsal/hakkimizda) */ public function showNested($parentSlug, $slug) { return $this->handleShow($slug); } /** * Handle akademi.truncgil.com.tr subdomain */ public function showAkademi() { return $this->handleShow('truncgil-akademi'); } protected function handleShow($slug) { $settings = $this->getSettings(); if ($slug === 'akademi') { $slug = 'truncgil-akademi'; } // Redirection logic disabled for rendering the page locally on main domain. // 1. Statik View Kontrolü if (view()->exists("templates.$slug")) { $page = Page::with(['headerTemplate', 'footerTemplate']) ->where('slug', $slug) ->where('status', 'published') ->first(); return $this->renderView("templates.$slug", $page, $settings); } // 2. Normal Dinamik Akış (DB Kaydı Zorunlu) $page = Page::with(['headerTemplate', 'footerTemplate']) ->where('slug', $slug) ->where('status', 'published') ->firstOrFail(); return $this->renderPage($page, $settings); } /** * Render a page with full dynamic logic */ protected function renderPage(Page $page, $settings) { $template = $page->template ?? (($page->is_homepage ?? false) ? 'home' : 'generic'); $view = view()->exists("templates.$template") ? "templates.$template" : 'templates.generic'; return $this->renderView($view, $page, $settings); } /** * Shared rendering logic for both static and dynamic templates */ protected function renderView(string $view, ?Page $page, $settings) { $renderedHeader = null; $renderedFooter = null; if ($page) { $renderedHeader = $this->renderHeader($page, $settings); $renderedFooter = $this->renderFooter($page, $settings); } $meta = $this->getMeta($page, $settings); $pageUrl = url()->current(); return view($view, [ 'page' => $page, 'pageHero' => $page ? PageTemplateHero::resolveForPage($page) : null, 'settings' => $settings, 'sections' => $page ? ($page->parsed_sections ?? $page->sections ?? $page->data ?? []) : [], 'templatedSections' => $page ? ($page->templated_sections ?? collect([])) : collect([]), 'renderedHeader' => $renderedHeader, 'renderedFooter' => $renderedFooter, 'meta' => $meta, 'structuredData' => PageStructuredData::forPage( $page, $pageUrl, $meta['title'] ?? null, $meta['description'] ?? null, ), ]); } /** * 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_url) { $metaImage = $page->featured_image_url; } } 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 */ private function getMenuItems() { return Page::with(['children' => function ($query) { $query->where('status', 'published') ->where('show_in_menu', true) ->orderBy('sort_order', 'asc') ->orderBy('title', 'asc'); }]) ->whereNull('parent_id') ->where('status', 'published') ->where('show_in_menu', true) ->orderBy('sort_order', 'asc') ->orderBy('title', 'asc') ->get(); } }