11 KiB
Page Section Builder - Kullanım Kılavuzu
📋 Genel Bakış
Page Section Builder, Filament Admin panelinden sayfalarınıza dinamik bölümler (sections) eklemenizi sağlayan güçlü bir modüldür. Settings modülünden esinlenerek geliştirilmiş olup, esnek bir key-value-type sistemi kullanır.
✨ Özellikler
- Dinamik Section Tipleri: Hero, Features, Stats, CTA, Gallery, Testimonials ve daha fazlası
- Esnek Data Yönetimi: Her section için sınırsız key-value çifti
- Çoklu Value Tipleri: Text, Image, HTML, Rich Text, Markdown, Color, Date, Array ve daha fazlası
- Sürükle-Bırak Sıralama: Sections ve data fields'ları yeniden sıralayabilme
- Kolay Entegrasyon: Mevcut sayfalarda sorunsuz çalışır
🎯 Section Tipleri
Aşağıdaki section tipleri mevcuttur:
| Tip | Açıklama | Kullanım Alanı |
|---|---|---|
hero |
Hero (Ana Banner) | Sayfa başlığı, büyük görsel banner |
features |
Özellikler | Ürün/hizmet özellikleri listesi |
stats |
İstatistikler | Sayısal veriler, başarı metrikleri |
cta |
Harekete Geçirme | Kullanıcıyı yönlendirme butonları |
content |
İçerik | Genel içerik blokları |
gallery |
Galeri | Görsel galeri |
testimonials |
Referanslar | Müşteri yorumları |
team |
Ekip | Ekip üyeleri |
pricing |
Fiyatlandırma | Fiyat tabloları |
faq |
SSS | Sık sorulan sorular |
contact |
İletişim | İletişim formu |
custom |
Özel | Özel içerik |
📝 Value Tipleri
Her data field'ı için aşağıdaki value tipleri kullanılabilir:
Metin Tipleri
- Text: Kısa tek satırlık metin (başlık, URL, e-posta, telefon)
- Textarea: Uzun metin
- HTML: Ham HTML kodu
- Markdown: Markdown formatı
- Rich Text: WYSIWYG zengin metin editörü
Medya Tipleri
- Image: Görsel yükleme (otomatik image editor ile)
- File: Dosya yükleme
- Color: Renk seçici
Veri Tipleri
- Number: Sayısal değer
- Boolean: Evet/Hayır (Toggle)
- Date: Tarih seçici
- DateTime: Tarih & saat seçici
- Array: Dizi (repeater)
- JSON: JSON formatı
🔧 Admin Panelinde Kullanım
1. Yeni Section Ekleme
- Pages modülünden bir sayfa açın veya yeni sayfa oluşturun
- Sayfa Bölümleri (Page Sections) sekmesine gidin
- Yeni Bölüm Ekle butonuna tıklayın
- Section tipini seçin (örn: Hero, Features)
- Yeni Alan Ekle ile section data'larını ekleyin
2. Data Field Ekleme
Her section için data field'ları eklerken:
- Key (Anahtar): Data'nın anahtarı (örn:
title,subtitle,image) - Type (Değer Tipi): Değerin tipini seçin (örn: Text, Image, HTML)
- Value (Değer): Seçilen tipe göre değeri girin
3. Örnek: Hero Section Oluşturma
Section Type: Hero (Ana Banner)
Data Fields:
┌─────────────────────────────────────────┐
│ Key: background_image │
│ Type: Image │
│ Value: [Upload Image] │
├─────────────────────────────────────────┤
│ Key: badge │
│ Type: Text │
│ Value: "YENİ PLATFORM" │
├─────────────────────────────────────────┤
│ Key: title │
│ Type: HTML │
│ Value: "Modern <span>Web</span>" │
├─────────────────────────────────────────┤
│ Key: subtitle │
│ Type: Textarea │
│ Value: "Açıklama metni..." │
├─────────────────────────────────────────┤
│ Key: button_text │
│ Type: Text │
│ Value: "Hemen Başla" │
├─────────────────────────────────────────┤
│ Key: button_url │
│ Type: URL │
│ Value: "#features" │
└─────────────────────────────────────────┘
💻 Kod Kullanımı
Page Model'de Sections Kullanımı
// Bir sayfayı al
$page = Page::find(1);
// Tüm parsed sections'ları al (key-value formatında)
$sections = $page->parsed_sections;
// Örnek çıktı:
[
[
'type' => 'hero',
'data' => [
'background_image' => 'path/to/image.jpg',
'badge' => 'YENİ PLATFORM',
'title' => 'Modern <span>Web</span>',
'subtitle' => 'Açıklama metni...',
'button_text' => 'Hemen Başla',
'button_url' => '#features',
]
],
[
'type' => 'features',
'data' => [...]
]
]
// Belirli bir section tipinin data'sını al
$heroData = $page->getSectionData('hero'); // İlk hero section
$secondHero = $page->getSectionData('hero', 1); // İkinci hero section
Controller'da Kullanım
public function show($slug)
{
$page = Page::where('slug', $slug)->firstOrFail();
// Parsed sections otomatik olarak view'e gönderilir
$sections = $page->parsed_sections;
return view('templates.home', compact('page', 'sections'));
}
Blade Template'de Kullanım
@foreach($sections as $section)
@if($section['type'] === 'hero')
<x-blocks.hero :data="$section['data']" />
@elseif($section['type'] === 'features')
<x-blocks.features :data="$section['data']" />
@elseif($section['type'] === 'stats')
<x-blocks.stats :data="$section['data']" />
@endif
@endforeach
Component'te Data Kullanımı
{{-- resources/views/components/blocks/hero.blade.php --}}
@props(['data'])
<section style="background-image: url({{ asset($data['background_image'] ?? '') }})">
<div class="container">
@if(isset($data['badge']))
<span class="badge">{{ $data['badge'] }}</span>
@endif
@if(isset($data['title']))
<h1>{!! $data['title'] !!}</h1>
@endif
@if(isset($data['subtitle']))
<p>{{ $data['subtitle'] }}</p>
@endif
@if(isset($data['button_text']) && isset($data['button_url']))
<a href="{{ $data['button_url'] }}" class="btn">
{{ $data['button_text'] }}
</a>
@endif
</div>
</section>
🎨 Best Practices
1. Key Naming (Anahtar İsimlendirme)
Tutarlı ve açıklayıcı key isimleri kullanın:
✅ İYİ:
- title
- subtitle
- background_image
- primary_button_text
- primary_button_url
❌ KÖTÜ:
- baslik
- resim1
- text
- btn
2. Value Type Seçimi
Doğru value tipini seçin:
✅ title → Text (kısa başlık)
✅ description → Textarea (uzun açıklama)
✅ content → Rich Text (formatlanmış içerik)
✅ banner → Image (görsel)
✅ is_active → Boolean (aktif/pasif)
3. Section Organization
Benzer section'ları gruplandırın:
1. Hero (Giriş)
2. Features (Özellikler)
3. Stats (İstatistikler)
4. CTA (Harekete Geçirme)
5. Contact (İletişim)
🔄 Mevcut Data Migrasyon
Eğer eski formatınız varsa (örn: PageSeeder'daki gibi), parse edilmiş format otomatik olarak çalışır:
// ESKİ FORMAT (PageSeeder'dan)
'sections' => [
[
'type' => 'hero',
'data' => [
'title' => 'Başlık',
'subtitle' => 'Alt başlık'
]
]
]
// YENİ FORMAT (Admin'den girilince)
'sections' => [
[
'type' => 'hero',
'data' => [
['key' => 'title', 'type' => 'text', 'value' => 'Başlık'],
['key' => 'subtitle', 'type' => 'text', 'value' => 'Alt başlık']
]
]
]
// parsed_sections attribute her ikisini de doğru parse eder!
🚀 İleri Seviye Özellikler
Nested Arrays (İç İçe Diziler)
Array value tipi ile iç içe veri yapıları oluşturabilirsiniz:
Section Type: Features
Data Field:
Key: features
Type: Array
Value: [
{ item: "Hızlı Çözümler" },
{ item: "Güvenli Altyapı" },
{ item: "Uzman Ekip" }
]
JSON Data
Kompleks veri yapıları için JSON kullanabilirsiniz:
Key: configuration
Type: JSON
Value: {"layout": "grid", "columns": 3, "gap": 20}
Conditional Rendering
@foreach($sections as $section)
@php
$data = $section['data'];
$bgClass = $data['bg_class'] ?? '';
@endphp
<section class="{{ $bgClass }}">
@includeIf("components.blocks.{$section['type']}", compact('data'))
</section>
@endforeach
📚 Dosya Yapısı
app/
├── Models/
│ └── Page.php (getParsedSectionsAttribute, getSectionData)
├── Http/Controllers/
│ └── PageController.php (parsed_sections kullanımı)
└── Filament/Admin/Resources/Pages/
└── Schemas/
└── PageForm.php (Section Builder UI)
lang/
├── tr/
│ └── pages.php (Türkçe çeviriler)
└── en/
└── pages.php (İngilizce çeviriler)
resources/views/
├── components/blocks/
│ ├── hero.blade.php
│ ├── features.blade.php
│ ├── stats.blade.php
│ └── cta.blade.php
└── templates/
└── home.blade.php (sections render)
🐛 Troubleshooting
Section görünmüyor?
$page->parsed_sectionsdöndüğünden emin olun- Section type'ının doğru yazıldığını kontrol edin
- Blade component'in var olduğunu doğrulayın
Data değerleri boş?
- Admin'de data field'larının key değerlerini kontrol edin
- Value tipinin doğru seçildiğini doğrulayın
- Değerlerin kaydedildiğini kontrol edin
Image görünmüyor?
storagelink'inin oluşturulduğunu kontrol edin:php artisan storage:link- Image path'inin doğru olduğunu doğrulayın
- Disk ayarlarını kontrol edin (
config/filesystems.php)
🎓 Örnekler
Daha fazla örnek için:
database/seeders/PageSeeder.php- Mevcut section örnekleriresources/views/components/blocks/- Component örnekleriresources/views/templates/home.blade.php- Template örneği
📞 Destek
Sorunlarınız için:
- Bu dokümantasyonu kontrol edin
docs/CURSOR_RULES.mddosyasına bakın- Loglara göz atın:
storage/logs/laravel.log
Not: Bu sistem Settings modülünden esinlenerek geliştirilmiş olup, aynı esneklik ve güçle çalışır. Her türlü dinamik sayfa içeriği için kullanılabilir.