Multi-Tenant Tema Sistemi - ThemeService View Path Oncelikleri
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
Onceki versiyonda "Modul ONCELIKLI" yaziyordu. YANLIS! Gercek siralama asagidaki gibidir.
resources/views/themes/{tema}/{view}
Ana tema klasoru - TEK DOSYA PRENSIBI - ONCELIKLI!
Modules/{Modul}/views/themes/{tema}/{view}
Modul ici tema - Fallback (resources'da yoksa)
themes.simple.{view}
Simple tema fallback (aktif tema simple degilse)
{modul}::front.{view}
Son care - Modul front klasoru
// 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
// 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
resources/views/themes/{tema}/ klasorunde SADECE layout kullanan dosyalar olmali. Standalone HTML dosyasi (DOCTYPE ile baslayan) YASAK!
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!
// 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!
resources/views/themes/{tema}/ = Sadece homepage, ozel sayfalar@extends('themes.{tema}.layouts.app') ile baslamaliTum sitede TEK BIR HEADER DOSYASI kullanilmali! Homepage dahil her sayfa layouts/header.blade.php dosyasini @include ile cagirmali. Inline header YASAK!
{{-- 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>
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>
Page modulu OZGUR olmali! Template sadece wrapper (subheader + container). Her sayfanin kendine ozel tasarimi pages tablosundaki css ve js kolonlarinda saklanir.
{{-- 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
| Class | Durum | Aciklama |
|---|---|---|
mb-16 | Bolum sonu | Her buyuk section'dan sonra |
mb-4 | h2 altinda | Baslik ile aciklama arasinda |
mb-8 | Aciklama altinda | Aciklama ile icerik arasinda |
gap-4/6 | Grid/Flex ici | Kartlar arasinda |
<!-- 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>
text-decoration: none !important;
TUM sayfalar @include kullanmali
resources/themes/ icinde DOCTYPE YASAK
Page modulu FREE olmali
Her sayfa/icerik icin seo_settings tablosundaki alanlar doldurulmali. Google ve sosyal medya paylasimlarinda dogru bilgi gostermek icin KRITIK!
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.
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.
{
"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
}
SEO gorseli otomatik olarak su siralamayla alinir:
seo_settings.og_image - Manuel belirlenmis SEO gorselihero collection - STANDART!featured_image collection (legacy)gallery ilk gorselYeni icerik eklerken hero collection'a gorsel yukle!
// 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}
}