Files
citrus/app/Http/Controllers/PageController.php
T

279 lines
8.4 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace App\Http\Controllers;
use App\Models\Page;
use App\Models\Setting;
use App\Models\HeaderTemplate;
use App\Models\FooterTemplate;
use App\Services\TemplateService;
use App\Support\PageStructuredData;
use App\Support\PageTemplateHero;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
class PageController extends Controller
{
/**
* Display the homepage or a specific page
*/
public function index()
{
$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);
}
// 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();
}
}