✅ 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

  1. Hero widget: has_items = 0 yap
  2. Hero için settings.json oluştur
  3. View'dan items döngüsünü kaldır
  4. Test et!
🤖 Claude AI - Düzeltilmiş Widget Planı (v2) - 2025-12-04