v13 - Oncelik Sirasi DUZELTILDI

t-{id} Tema Yapisi

Multi-Tenant Tema Sistemi - ThemeService View Path Oncelikleri

v13 Degisiklikler

1. Felsefe

t-{id} = Tenant temasi. Sadece ozel dosyalar burada.

simple = Fallback (mevcut, zaten var). t-{id}'de yoksa buradan alir.

Ornek: t-3/homepage.blade.php var -> onu kullan, t-3/blog/show.blade.php yok -> simple'dan al

2. View Path Oncelik Sirasi

KRITIK!

v12'deki HATA DUZELTILDI!

Onceki versiyonda "Modul ONCELIKLI" yaziyordu. YANLIS! Gercek siralama asagidaki gibidir.

DOGRU Oncelik Sirasi (ThemeService.php)

1
resources/views/themes/{tema}/{view}

Ana tema klasoru - TEK DOSYA PRENSIBI - ONCELIKLI!

2
Modules/{Modul}/views/themes/{tema}/{view}

Modul ici tema - Fallback (resources'da yoksa)

3
themes.simple.{view}

Simple tema fallback (aktif tema simple degilse)

4
{modul}::front.{view}

Son care - Modul front klasoru

Homepage Ornegi (t-3 / panjur)

// ThemeService aradiginda:

1. ONCE BAKAR:
   resources/views/themes/t-3/homepage.blade.php  ✓ BULDU! Bunu kullan.

2. (Atlanir cunku yukarda bulundu)
   Modules/Page/resources/views/themes/t-3/homepage.blade.php

3. (Atlanir)
   themes.simple.homepage

4. (Atlanir)
   page::front.homepage

Blog Ornegi (ixtif)

// ThemeService aradiginda:

1. ONCE BAKAR:
   resources/views/themes/ixtif/show.blade.php  ✗ YOK (silindi!)

2. SONRA BAKAR:
   Modules/Blog/resources/views/themes/ixtif/show.blade.php  ✓ BULDU!

// ixtif blog icin modul icindeki tema dosyasi kullanilir

3. Standalone Dosya Yasagi

YENI v13

Basit Anlatim

resources/views/themes/{tema}/ klasorunde SADECE layout kullanan dosyalar olmali. Standalone HTML dosyasi (DOCTYPE ile baslayan) YASAK!

GERCEK SORUN: ixtif Standalone Dosyalari

19 Ocak 2026'da ixtif.com blog/shop sayfalari BOZULDU. Sebep: resources/views/themes/ixtif/ icinde standalone dosyalar vardi.

// SILINEN DOSYALAR (standalone - layout YOK!):
resources/views/themes/ixtif/index.blade.php      SILINDI
resources/views/themes/ixtif/show.blade.php       SILINDI
resources/views/themes/ixtif/subscription-*.php   SILINDI

// Bu dosyalar DOCTYPE ile basliyordu, @extends YOKTU!
// ThemeService oncelik sirasina gore bunlari bulup kullandi
// Ama layout yoktu -> site BOZULDU!

DOGRU: Layout Kullanan Dosyalar

// resources/views/themes/t-3/homepage.blade.php
@extends('themes.t-3.layouts.app')  <-- LAYOUT VAR!

@section('content')
    {{-- Sayfa icerigi --}}
@endsection

// YANLIS - Standalone
<!DOCTYPE html>
<html>
<head>...</head>  <-- LAYOUT YOK! YASAK!

KURAL

  • resources/views/themes/{tema}/ = Sadece homepage, ozel sayfalar
  • Her dosya @extends('themes.{tema}.layouts.app') ile baslamali
  • Modul icerikleri (blog/show, shop/show) BURAYA KOYMA!
  • Standalone HTML (DOCTYPE ile baslayan) YASAK!

4. Single Header Kurali

Basit Anlatim

Tum sitede TEK BIR HEADER DOSYASI kullanilmali! Homepage dahil her sayfa layouts/header.blade.php dosyasini @include ile cagirmali. Inline header YASAK!

DOGRU: Layout Extend + Include

{{-- homepage.blade.php --}}
@php
    $isHomepage = true;
@endphp
@extends('themes.t-3.layouts.app')

@section('content')
    {{-- Sadece icerik --}}
@endsection

{{-- layouts/app.blade.php --}}
<body>
    @include('themes.t-3.layouts.header')  <-- TEK HEADER!
    @yield('content')
    @include('themes.t-3.layouts.footer')
</body>

$isHomepage Parametresi

Homepage'de navigasyon anchor (#hizmetler), ic sayfalarda URL (/service):

{{-- header.blade.php --}}
@php
    $isHomepage = $isHomepage ?? false;
@endphp

<nav>
    <a href="{{ $isHomepage ? '#hizmetler' : url('/service') }}">Hizmetlerimiz</a>
    <a href="{{ $isHomepage ? '#iletisim' : url('/page/iletisim') }}">Iletisim</a>
</nav>

5. Page Modulu Ozgurlugu

Basit Anlatim

Page modulu OZGUR olmali! Template sadece wrapper (subheader + container). Her sayfanin kendine ozel tasarimi pages tablosundaki css ve js kolonlarinda saklanir.

Page show.blade.php Template Yapisi

{{-- SUBHEADER (Breadcrumb + Title) --}}
<section class="bg-gray-50 dark:bg-gray-800 border-b">
    <div class="container">
        <nav>{{ breadcrumb }}</nav>
        <h1>{{ $title }}</h1>
    </div>
</section>

{{-- CONTENT - Sadece container --}}
<section class="bg-white dark:bg-gray-900 py-10">
    <div class="container">
        <div class="page-content prose max-w-none">
            @parsewidgets($body ?? '')
        </div>
    </div>
</section>

{{-- CSS/JS veritabanindan --}}
@if($item->css)<style>{!! $item->css !!}</style>@endif
@if($item->js)<script>{!! $item->js !!}</script>@endif

6. Spacing Kurallari

Spacing Ozet

ClassDurumAciklama
mb-16Bolum sonuHer buyuk section'dan sonra
mb-4h2 altindaBaslik ile aciklama arasinda
mb-8Aciklama altindaAciklama ile icerik arasinda
gap-4/6Grid/Flex iciKartlar arasinda

7. Alpine Collapse Plugin

Script Yukleme Sirasi (KRITIK!)

<!-- 1. ONCE Collapse plugin -->
<script defer src="https://unpkg.com/@alpinejs/collapse@3.x.x/dist/cdn.min.js"></script>

<!-- 2. SONRA Ana Alpine -->
<script defer src="https://unpkg.com/alpinejs@3.x.x/dist/cdn.min.js"></script>

8. Kullanici Tercihleri: ISTEMIYORUM!

Link Underline

text-decoration: none !important;

Inline Header

TUM sayfalar @include kullanmali

Standalone Dosya

resources/themes/ icinde DOCTYPE YASAK

Zorla Sidebar/CTA

Page modulu FREE olmali

9. Root Admin Butonlari

Header'da Root Butonlari

{{-- header.blade.php - Logo'nun yaninda --}}
@auth
    @if(auth()->user()->hasRole('root'))
    <div class="flex items-center gap-1 ml-2">
        <button @click="fetch('/admin/cache/clear'...)">
            <i class="fa-sync-alt"></i> Cache
        </button>
        <button @click="localStorage.removeItem(...)">
            <i class="fa-robot"></i> AI Reset
        </button>
    </div>
    @endif
@endauth

10. SEO Ayarlari (seo_settings)

ZORUNLU

Basit Anlatim

Her sayfa/icerik icin seo_settings tablosundaki alanlar doldurulmali. Google ve sosyal medya paylasimlarinda dogru bilgi gostermek icin KRITIK!

ZORUNLU Alanlar (Her Sayfada Girilmeli!)

titles

SEO basligi (JSON - cok dilli). Google arama sonuclarinda gorunur.

Ornek: {"tr": "Panjur Tamiri Istanbul"}

descriptions

Meta description (JSON - cok dilli). Google snippet'te gorunur. 160 karakter ideal.

Ornek: {"tr": "Istanbul'da profesyonel panjur tamiri..."}

og_titles

Open Graph basligi (JSON). Facebook/LinkedIn paylasimlarinda.

og_descriptions

Open Graph aciklamasi (JSON). Sosyal medya paylasimlarinda.

Onerilen Alanlar

keywords

Anahtar kelimeler (JSON array). Google icin onemli degil ama internal arama icin faydali.

author

Icerik yazari. Blog/makale sayfalarinda onemli.

og_image

Sosyal medya gorseli URL. 1200x630px ideal.

canonical_url

Duplicate content onlemek icin orijinal URL.

robots_meta (JSON)

{
    "index": true,      // Google'da indexlensin mi?
    "follow": true,     // Linkeleri takip etsin mi?
    "archive": true,    // Cache'lensin mi?
    "snippet": true     // Snippet gosterilsin mi?
}

// Gizli sayfa icin:
{
    "index": false,
    "follow": false,
    "archive": false,
    "snippet": false
}

Hero Gorsel Kurali

SEO gorseli otomatik olarak su siralamayla alinir:

  1. seo_settings.og_image - Manuel belirlenmis SEO gorseli
  2. Media Library hero collection - STANDART!
  3. Media Library featured_image collection (legacy)
  4. Media Library gallery ilk gorsel
  5. Site logosu (fallback)

Yeni icerik eklerken hero collection'a gorsel yukle!

iXtif Ornegi (Blog)

// Blog yazisi icin seo_settings:
{
    "titles": {"tr": "Forklift Bicagi Nasil Secilir? | iXtif"},
    "descriptions": {"tr": "Forklift bicagi secerken dikkat edilmesi gereken 7 kritik nokta. Kapasite, uzunluk, malzeme..."},
    "keywords": {"tr": ["forklift bicagi", "forklift ataleti", "istif makinesi"]},
    "og_titles": {"tr": "Forklift Bicagi Rehberi - iXtif"},
    "og_descriptions": {"tr": "Profesyonel forklift bicagi secim kilavuzu"},
    "author": "iXtif Teknik Ekip",
    "robots_meta": {"index": true, "follow": true}
}

Yeni Tema Dosyasi Checklist