✅ Widget FILE Sistemi - Düzeltilmiş Plan (v2)
📅 Tarih: 2025-12-04 | 🔄 Versiyon: 2 (Düzeltilmiş) | 🎯 Mantık: Settings vs Items
🔧 Düzeltme
v1'deki hata: Hero widget için items kullanılacak denilmişti.
Doğru mantık: Hero TEK banner → Sadece settings kullanılmalı!
📐 Doğru Mantık: Settings vs Items
Items Ne Zaman Kullanılır?
Kural: Items sadece DÖNGÜDE render edilecek veriler için kullanılır.
| Widget Tipi |
has_items |
Kullanım |
Örnek |
| Slider |
1 |
@foreach($items) - Her slide |
3 slide → 3 item |
| Gallery |
1 |
@foreach($items) - Her resim |
10 resim → 10 item |
| Testimonials |
1 |
@foreach($items) - Her yorum |
5 yorum → 5 item |
| Feature List |
1 |
@foreach($items) - Her özellik |
6 özellik → 6 item |
| Hero Banner |
0 |
Döngü YOK - Tek banner |
Tüm veri settings'te |
| Contact Form |
0 |
Döngü YOK - Tek form |
Form ayarları settings'te |
🔍 Hero Widget - Yanlış vs Doğru
❌ YANLIŞ (v1 Planı)
Widget DB:
has_items: 1 ← YANLIŞ!
item_schema: {...} ← YANLIŞ!
View.blade.php:
@foreach($items as $item)
<div>{{ $item['title'] }}</div>
@endforeach
Sorun: Hero tek banner, döngüye gerek yok!
✅ DOĞRU (v2 Planı)
Widget DB:
has_items: 0 ← DOĞRU!
item_schema: NULL ← DOĞRU!
settings_schema: {...} ← Tüm veri burada
View.blade.php:
<h1>{{ $settings['title'] }}</h1>
<p>{{ $settings['description'] }}</p>
<a href="{{ $settings['cta_url'] }}">
{{ $settings['cta_text'] }}
</a>
Sonuç: Tüm hero verisi settings'te, döngü yok!
📋 Düzeltilmiş İmplementasyon Planı
Faz 1: Hero Widget (has_items = 0)
1.1. Database Düzeltmesi
Önce: Widget #69'u kontrol et ve düzelt
-- Mevcut durumu kontrol et
SELECT id, name, has_items FROM widgets WHERE id = 69;
-- Düzelt: has_items 1 ise 0'a çevir
UPDATE widgets SET has_items = 0 WHERE id = 69;
-- item_schema varsa temizle (kullanılmayacak)
UPDATE widgets SET item_schema = NULL WHERE id = 69;
1.2. Settings Schema (Tüm Hero Verisi)
Dosya: blocks/hero/ixtif-hero/settings.json
{
// ANA BAŞLIK
"title_line1": {
"type": "text",
"label": "Ana Başlık (1. Satır)",
"default": "Endüstriyel Ekipman"
},
"title_line2": {
"type": "text",
"label": "Ana Başlık (2. Satır)",
"default": "Çözümleri"
},
// AÇIKLAMA
"description": {
"type": "textarea",
"label": "Açıklama Metni",
"rows": 3
},
// CTA BUTTON
"cta_text": {
"type": "text",
"label": "Buton Metni",
"default": "Hemen Keşfet"
},
"cta_url": {
"type": "text",
"label": "Buton URL",
"default": "/urunler"
},
"cta_icon": {
"type": "text",
"label": "Buton İkon (FontAwesome)",
"placeholder": "fas fa-arrow-right"
},
// GÖRSEL
"hero_image": {
"type": "media",
"label": "Hero Görseli",
"accept": "image/*"
},
"hero_image_alt": {
"type": "text",
"label": "Görsel Alt Metni (SEO)"
},
// ÖZELLİKLER (3 ADET SABİT - İTEMS DEĞİL!)
"feature_1_icon": {
"type": "text",
"label": "Özellik 1 - İkon",
"default": "fas fa-truck"
},
"feature_1_title": {
"type": "text",
"label": "Özellik 1 - Başlık",
"default": "Hızlı Teslimat"
},
"feature_1_subtitle": {
"type": "text",
"label": "Özellik 1 - Alt Başlık"
},
"feature_2_icon": { "type": "text", "label": "Özellik 2 - İkon" },
"feature_2_title": { "type": "text", "label": "Özellik 2 - Başlık" },
"feature_2_subtitle": { "type": "text", "label": "Özellik 2 - Alt Başlık" },
"feature_3_icon": { "type": "text", "label": "Özellik 3 - İkon" },
"feature_3_title": { "type": "text", "label": "Özellik 3 - Başlık" },
"feature_3_subtitle": { "type": "text", "label": "Özellik 3 - Alt Başlık" }
}
1.3. View Template Düzeltmesi
Dosya: blocks/hero/ixtif-hero/view.blade.php
Değişiklik: Items kullanımı KALDIR, sadece settings kullan
❌ KALDIRILAN KOD (items döngüsü):
@if(!empty($items))
@foreach($items as $item)
<div>{{ $item['title'] }}</div>
@endforeach
@endif
✅ YENİ KOD (sabit 3 özellik):
<div class="grid grid-cols-3 gap-6">
@if(!empty($settings['feature_1_title']))
<div class="feature">
<i class="{{ $settings['feature_1_icon'] }}"></i>
<h4>{{ $settings['feature_1_title'] }}</h4>
<p>{{ $settings['feature_1_subtitle'] }}</p>
</div>
@endif
@if(!empty($settings['feature_2_title']))
<div class="feature">...</div>
@endif
@if(!empty($settings['feature_3_title']))
<div class="feature">...</div>
@endif
</div>
Faz 2: Contact Form Widget (has_items = 0)
2.1. Form Settings Schema
Mantık: Form alanları SABİT (name, email, message), sadece labels özelleştirilebilir
{
// FORM GENEL
"form_title": { "type": "text", "label": "Form Başlığı" },
"form_description": { "type": "textarea", "label": "Açıklama" },
// FORM ALANLARI (SABİT)
"field_name_label": { "type": "text", "label": "İsim Alanı Etiketi", "default": "Adınız" },
"field_email_label": { "type": "text", "label": "Email Alanı Etiketi", "default": "Email" },
"field_message_label": { "type": "text", "label": "Mesaj Alanı Etiketi", "default": "Mesajınız" },
// BUTON
"submit_text": { "type": "text", "label": "Gönder Butonu", "default": "Gönder" },
// MESAJLAR
"success_message": { "type": "text", "label": "Başarı Mesajı" },
"error_message": { "type": "text", "label": "Hata Mesajı" },
// BACKEND
"notification_email": { "type": "email", "label": "Bildirim Gönderilecek Email" }
}
Faz 3: Slider/Gallery Widget (has_items = 1)
3.1. Slider - DOĞRU Items Kullanımı
Mantık: Her slide bir item, döngüde render edilir
Settings (Slider genel ayarları):
{
"autoplay": { "type": "checkbox", "label": "Otomatik Geçiş" },
"delay": { "type": "number", "label": "Geçiş Süresi (ms)", "default": 5000 },
"show_arrows": { "type": "checkbox", "label": "Okları Göster" }
}
Items (Her slide için):
{
"slide_image": { "type": "media", "label": "Slide Görseli" },
"slide_title": { "type": "text", "label": "Başlık" },
"slide_description": { "type": "textarea", "label": "Açıklama" },
"slide_button_text": { "type": "text", "label": "Buton Metni" },
"slide_button_url": { "type": "text", "label": "Buton URL" }
}
View (Döngü ile render):
@foreach($items as $item)
<div class="slide">
<img src="{{ $item['slide_image'] }}">
<h3>{{ $item['slide_title'] }}</h3>
</div>
@endforeach
✅ Özet: Settings vs Items
| Özellik |
Settings |
Items |
| Kullanım |
Tek seferlik ayarlar |
Döngüde render edilecek veriler |
| Render |
{{ $settings['key'] }} |
@foreach($items as $item) |
| has_items |
0 |
1 |
| Örnekler |
Hero, Contact Form, Text Block |
Slider, Gallery, Testimonials, Features |
| Adet |
Sabit field'lar |
Dinamik, sınırsız |
🎯 İlk Adım
- Hero widget:
has_items = 0 yap
- Hero için
settings.json oluştur
- View'dan items döngüsünü kaldır
- Test et!
🤖 Claude AI - Düzeltilmiş Widget Planı (v2) - 2025-12-04