# 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 1. **Pages** modülünden bir sayfa açın veya yeni sayfa oluşturun 2. **Sayfa Bölümleri** (Page Sections) sekmesine gidin 3. **Yeni Bölüm Ekle** butonuna tıklayın 4. Section tipini seçin (örn: Hero, Features) 5. **Yeni Alan Ekle** ile section data'larını ekleyin ### 2. Data Field Ekleme Her section için data field'ları eklerken: 1. **Key (Anahtar)**: Data'nın anahtarı (örn: `title`, `subtitle`, `image`) 2. **Type (Değer Tipi)**: Değerin tipini seçin (örn: Text, Image, HTML) 3. **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 Web" │ ├─────────────────────────────────────────┤ │ 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ı ```php // 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 Web', '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 ```php 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 ```blade @foreach($sections as $section) @if($section['type'] === 'hero') @elseif($section['type'] === 'features') @elseif($section['type'] === 'stats') @endif @endforeach ``` ### Component'te Data Kullanımı ```blade {{-- resources/views/components/blocks/hero.blade.php --}} @props(['data'])
@if(isset($data['badge'])) {{ $data['badge'] }} @endif @if(isset($data['title']))

{!! $data['title'] !!}

@endif @if(isset($data['subtitle']))

{{ $data['subtitle'] }}

@endif @if(isset($data['button_text']) && isset($data['button_url'])) {{ $data['button_text'] }} @endif
``` ## 🎨 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: ```php // 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 ```blade @foreach($sections as $section) @php $data = $section['data']; $bgClass = $data['bg_class'] ?? ''; @endphp
@includeIf("components.blocks.{$section['type']}", compact('data'))
@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? 1. `$page->parsed_sections` döndüğünden emin olun 2. Section type'ının doğru yazıldığını kontrol edin 3. Blade component'in var olduğunu doğrulayın ### Data değerleri boş? 1. Admin'de data field'larının key değerlerini kontrol edin 2. Value tipinin doğru seçildiğini doğrulayın 3. Değerlerin kaydedildiğini kontrol edin ### Image görünmüyor? 1. `storage` link'inin oluşturulduğunu kontrol edin: `php artisan storage:link` 2. Image path'inin doğru olduğunu doğrulayın 3. Disk ayarlarını kontrol edin (`config/filesystems.php`) ## 🎓 Örnekler Daha fazla örnek için: - `database/seeders/PageSeeder.php` - Mevcut section örnekleri - `resources/views/components/blocks/` - Component örnekleri - `resources/views/templates/home.blade.php` - Template örneği ## 📞 Destek Sorunlarınız için: 1. Bu dokümantasyonu kontrol edin 2. `docs/CURSOR_RULES.md` dosyasına bakın 3. 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.