📊 Page → Shop Widget Sistemi

📅 Tarih: 2025-12-04 06:30 | 🎯 Tenant: ixtif.com | 👤 Talep: PageController'dan Shop bağımlılığını kaldır, WidgetManagement kullan

🔴 Mevcut Durum - Problemler

❌ Cross-Module Dependency

Sorun: PageController (Page modülü) direkt olarak ShopProduct (Shop modülü) kullanıyor.

Modules/Page/app/Http/Controllers/Front/PageController.php

Satır 52-140 arası 92 satır Shop kodu var!

❌ Tenant-Aware Değil

Sorun: Muzibu.com gibi Shop modülü olmayan tenant'larda homepage çalışıyor ama gereksiz kod yükü var.

Şu anda class_exists() ile kontrol ediliyor ama bu emergency fix, kalıcı çözüm değil.

❌ Kod Tekrarı

Sorun: Aynı ürün verisi çekme mantığı birden fazla yerde tekrarlanıyor:

  • PageController::homepage()
  • ShopController::index()
  • Mega-menu products

🎯 Hedef - Modüler Yapı

✅ Widget Management Entegrasyonu

Sistemde zaten mevcut olan WidgetManagement modülünü kullanarak Shop ürünlerini göstermek.

✅ Modül Bağımsızlığı

Page modülü artık Shop modülünden bağımsız çalışacak. Shop yoksa boş array dönecek, homepage çökmeyecek.

✅ Tek Sorumluluk İlkesi

Her modül kendi verilerini kendisi yönetecek. Page modülü sadece sayfa render etmekten sorumlu.

🏗️ Mimari Tasarım

PageController
WidgetService
ShopModules
ShopProduct

📋 Nasıl Çalışacak?

  1. ShopModules.php oluşturulacak (WidgetManagement/resources/views/blocks/modules/shop/)
  2. getData() metodu içinde Shop ürünleri çekilecek
  3. PageController bu widget'tan veri alacak: $widgetService->getModuleData('shop/homepage')
  4. Homepage view aynı kalacak - $homepageProducts array'i aynı formatta gelecek

🛠️ Yapılacaklar

1. ShopModules.php Oluştur Yüksek Öncelik

Dosya: Modules/WidgetManagement/resources/views/blocks/modules/shop/ShopModules.php

İçerik:

  • Namespace: Modules\WidgetManagement\Resources\views\blocks\modules\shop
  • getData(array $settings = []): array metodu
  • PageController'daki tüm Shop product logic buraya taşınacak (satır 52-140)
  • Tenant-aware: class_exists(ShopProduct) kontrolü

Beklenen Sonuç: Shop modülü kendi verilerini yöneten ayrı bir sınıf.

2. PageController Güncelle Yüksek Öncelik

Dosya: Modules/Page/app/Http/Controllers/Front/PageController.php

Değişiklik:

  • Satır 49-140 arası 92 satır Shop kodu SİLİNECEK
  • Yerine 5 satır widget çağrısı gelecek
$homepageProducts = collect([]); if (class_exists('\\Modules\\WidgetManagement\\App\\Services\\WidgetService')) { $widgetService = app(\Modules\WidgetManagement\App\Services\WidgetService::class); $products = $widgetService->getModuleData('shop/homepage', []); $homepageProducts = collect($products); }

Beklenen Sonuç: PageController 92 satır daha az, modüler yapı.

3. Test - İxtif (Shop Var) Orta Öncelik

Test Senaryosu:

  • Homepage açılıyor mu? ✓
  • Ürünler listeleniyor mu? ✓
  • Fiyat, KDV, currency doğru mu? ✓
  • USD → TRY dönüşümü çalışıyor mu? ✓

4. Test - Muzibu (Shop Yok) Orta Öncelik

Test Senaryosu:

  • Homepage açılıyor mu? ✓
  • Hata vermiyor mu? ✓
  • $homepageProducts boş array mı? ✓
  • Sayfa render oluyor mu? ✓

📈 Beklenen Faydalar

✅ Modüler Yapı

Her modül kendi sorumluluğunu taşıyor. Page modülü Shop'a bağımlı değil.

✅ Tenant-Aware

Shop modülü olmayan tenant'larda (Muzibu) sistem çökmüyor, boş array dönüyor.

✅ Bakım Kolaylığı

Shop product logic tek yerde (ShopModules.php). Değişiklik gerekirse tek dosya güncellenir.

✅ Genişletilebilirlik

İleride başka modüller de (Blog, Portfolio) widget sistemi ile entegre edilebilir.

⚠️ Dikkat Edilmesi Gerekenler

🔒 Veri Formatı Uyumluluğu

ShopModules::getData() metodu aynı array formatını döndürmeli ki homepage.blade.php değişmesin.

Mevcut format:

  • id, title, description
  • price, currency, formatted_price
  • image, category, badges
  • try_price, compare_at_price, auto_discount_percentage

🧪 Test Coverage

Her iki tenant'ta da test edilmeli:

  • ixtif.com: Shop var, ürünler gösteriliyor
  • muzibu.com: Shop yok, homepage açılıyor