v5 27 Şubat 2026

Dinamik İçerik Sistemi — Basit Özet

Ne yapıyoruz, tablolarda ne var, admin'de ne yapılıyor, sitede ne görünüyor.

Ne Yapıyoruz?

Muzibu orta alanını (main) saate, sektöre ve gösterildiği sayfaya (anasayfa, sektör, radyo, genre vb.) göre değişen bir sisteme çeviriyoruz.

Admin panelden "Koleksiyon" denen gruplar oluşturulacak. Her koleksiyonun içine Playlist, Albüm, Radyo, Genre veya Sektör eklenebilecek.

Örnek: "Sabah Kafe Mix" koleksiyonu → sadece 06:00-12:00 arası, sadece anasayfada, sadece Kafe sektörüne gösterilir.

Kullanıcı sayfayı açık bıraksa bile her saat başı içerik otomatik güncellenir, müzik kesilmez.

Neye Dokunuyoruz, Neye Dokunmuyoruz?
Değişecek
Anasayfa + Sektör + Radyo + Genre sayfaları ORTA ALAN (main). Şu an orada: Türler grid, Playlist'ler, Albümler, Radyolar, Sektörler → hepsi kalkacak, yerine koleksiyonlar gelecek.
Dokunulmayacak
Left sidebar, right sidebar, header, player bar, footer — hepsi aynen kalacak. Sadece ortadaki main alan değişiyor.

Her Koleksiyonun 3 Sorusu

Admin bir koleksiyon oluştururken şu 3 şeyi ayarlar. Tasarım (4. soru) otomatik belirlenir.

NEREDE?
Hangi sayfalarda görünsün?
Kolon: show_on
Seçenekler: Anasayfa, Sektör, Radyo, Genre... Birden fazla seçilebilir.
NE ZAMAN?
Hangi saatlerde görünsün?
Kolon: display_rules
06:00-12:00 arası, veya "Her zaman". Gün seçimi de var.
KİME?
Kim görecek? Hangi sayfalarda?
Kolonlar: visibility_rules + corporate_account_id
Herkes: İkisi de boş → tüm kullanıcılar, tüm sayfalarda görür.
Sektöre göre: Kafe sektörüne özel.
Genre'a göre: Rock genre sayfasına özel.
Corporate'a özel: Sadece o firmanın çalışanları.
NASIL?
OTOMATİK
Tasarım admin tarafından seçilmez, içerik tipine göre otomatik belirlenir:
Sadece Genre içeriyorsa → Grid
Şu anki anasayfadaki "Türler" bölümü gibi. 15 kart gösterilir.
┌─────┬─────┬─────┬─────┬─────┐
│ Pop │ Rock│ Jazz│ R&B │ Hip │
├─────┼─────┼─────┼─────┼─────┤
│Metal│Türkü│ Caz │Dance│Latin│
└─────┴─────┴─────┴─────┴─────┘
Diğer tüm durumlar → Yatay Kaydırma
Şu anki Playlist/Albüm/Radyo bölümleri gibi. 10 kart gösterilir.
Başlık          Tümünü Gör ›
┌────┐ ┌────┐ ┌────┐ ┌────┐  →
│ img│ │ img│ │ img│ │ img│
└────┘ └────┘ └────┘ └────┘
  Ad     Ad     Ad     Ad
Bu sayılar (15/10) şu anki anasayfayla aynı. DB'de tutulmaz, kodda sabit (config'den okunur).

visibility_rules Detayı DEĞİŞTİ

Eski sector_rules → yeni visibility_rules. Tek bir JSON kolon, tüm filtreleri kapsar:

Herkese Göster
{"show_to_all": true}
veya NULL / boş → tüm kullanıcılar, tüm sayfalarda görür.
Sektöre Göre
{"sector_ids": [1, 3]}
Anasayfada → bu sektördeki kullanıcılar görür.
Sektör sayfasında → bu sektör sayfalarında görünür.
Genre'a Göre
{"genre_ids": [5, 8]}
Genre sayfasında → bu genre sayfalarında görünür.
Örn: Rock + Jazz sayfalarında "Akustik Seçmeler" koleksiyonu.
Radyoya Göre
{"radio_ids": [2]}
Radyo sayfasında → bu radyo sayfalarında görünür.
Örn: Jazz FM sayfasında "Jazz Klasikleri" koleksiyonu.
Karışık Kullanım Örneği
{"sector_ids": [1], "genre_ids": [5, 8]}
Bu koleksiyon:
show_on: ["homepage"] ise → anasayfada sadece Kafe sektörü kullanıcıları görür
show_on: ["sector"] ise → sadece Kafe sektör sayfasında görünür
show_on: ["genre"] ise → sadece Rock ve Jazz genre sayfalarında görünür
show_on: ["homepage", "genre"] ise → hem anasayfada (Kafe'ye) hem de Rock/Jazz'da görünür
corporate_account_id: Ayrı kolon olarak kalıyor (basit FK). NULL = herkesin koleksiyonu, dolu = o corporate'a özel. visibility_rules ile birlikte çalışır.
Neden değişti?
Eski: sector_rules — sadece sektör filtresi yapabiliyordu. Genre veya radyo sayfası için yeni kolon gerekecekti.
Yeni: visibility_rules — sektör, genre, radyo hepsini tek JSON'da tutar. Yeni sayfa tipi eklenince sadece JSON'a yeni key eklenir.

Kullanılacak Kartlar

Yeni kart tasarımı yapılmayacak. Mevcut kart component'leri aynen kullanılacak:

ComponentNe İçinTıklanıncaTasarım
x-muzibu.playlist-card Çalma listesi Şarkı listesi açılır Yatay kaydırma
x-muzibu.album-card Albüm Albüm detayı açılır Yatay kaydırma
x-muzibu.radio-card Radyo Hemen çalar (sayfa değişmez) Yatay kaydırma
x-muzibu.genre-quick-card Tür Genre sayfası açılır Grid
x-muzibu.sector-card Sektör Sektör sayfası açılır Yatay kaydırma
Koleksiyon sistemi sadece bir organizatör. İçerideki her öğe kendi kartını tetikler. Yeni kart yazmaya gerek yok.

Kart Sayısı ve "Tümünü Gör"

Şu anki anasayfayla aynı mantık. Sabit sayılar, koleksiyon başına ayarlanmaz:

Genre-only → Grid
15 kart
Şu anki "Türler" bölümüyle aynı
Diğerleri → Yatay Kaydırma
10 kart
Şu anki Playlist/Albüm/Radyo bölümüyle aynı
"Tümünü Gör" Butonu
Koleksiyondaki toplam öğe sayısı > gösterilen kart sayısı → "Tümünü Gör" butonu otomatik çıkar.
Örnek: 10 kart gösterilen bir koleksiyonda 14 öğe var → "Tümünü Gör" görünür → tıklanınca grid sayfası açılır.
Örnek: 10 kart gösterilen bir koleksiyonda 8 öğe var → buton gizli, hepsi zaten görünüyor.

Tablo 1: muzibu_content_collections

Her satır bir koleksiyon. Admin panelden oluşturulur.

KolonTipNe İşe YararÖrnek
collection_idBIGINT PKOtomatik numara1, 2, 3
titleJSONKoleksiyon adı (çoklu dil){"tr": "Sabah Kafe Mix"}
slugJSONURL kısa ismi{"tr": "sabah-kafe-mix"}
descriptionJSON NULLAçıklama (opsiyonel){"tr": "Sabah için..."}
show_on JSON NEREDE: Hangi sayfa tiplerinde? ["homepage", "sector", "radio", "genre"]
display_rules JSON NULL NE ZAMAN: Saat + gün kuralı {"start_hour":6, "end_hour":12, "is_always":false}
visibility_rules DEĞİŞTİ JSON NULL KİME: Sektör, genre, radyo filtresi (hepsi tek yerde) {"sector_ids":[1]} veya {"genre_ids":[5,8]} veya {"show_to_all":true}
corporate_account_id FK NULL KİME (firma): NULL = herkes, dolu = o firmaya özel NULL veya 5
iconVARCHAR NULLBaşlık ikonufas fa-coffee
colorVARCHAR NULLRenk kodu#f59e0b
media_idFK NULLKapak görseli42
sort_orderINTSıralama (küçük = üstte)1, 2, 3
is_activeBOOLEANAçık / Kapalı1
Toplam: 12 kolon. v4'ten sector_rules → visibility_rules isim değişikliği. Kolon sayısı aynı (12). Artık sektör, genre ve radyo filtresi tek kolonda.

Tablo 2: muzibu_collection_items

Her satır, bir koleksiyona eklenmiş bir öğe. Radyo + Playlist + Albüm karışık eklenebilir.

KolonTipNe İşe YararÖrnek
idBIGINT PKOtomatik numara1, 2, 3
collection_idFKHangi koleksiyona ait1
itemable_typeVARCHARÖğe türü (5 seçenek)playlist, album, radio, genre, sector
itemable_idBIGINTÖğenin ID'si12
sort_orderINTSıralama (sürükle-bırak)1, 2, 3
is_activeBOOLEANAktif mi?1
Örnek: "Sabah Kafe Mix" koleksiyonu (id=1)
collection_id=1, type=radio, id=5 (Jazz FM), sort_order=1
collection_id=1, type=playlist, id=12 (Sabah Akustik), sort_order=2
collection_id=1, type=playlist, id=45 (Kahve Molası), sort_order=3
collection_id=1, type=album, id=8 (Cafe Classics), sort_order=4

Otomatik Tasarım Tespiti

Admin tasarım seçmez. Sistem, koleksiyondaki öğe tiplerine bakarak kararı kendisi verir:

🔍
Koleksiyondaki tüm öğeler genre mi?
Yani: activeItems->every(fn($i) => $i->itemable_type === 'genre')
EVET → Grid (15 kart)
genre-quick-card component'i, yan yana renkli kutucuklar.
HAYIR → Yatay Kaydırma (10 kart)
Her öğe kendi kartını kullanır (playlist-card, album-card, radio-card, sector-card).

Ek: users Tablosuna Eklenen Kolon

KolonTipNe İşe YararÖrnek
sector_idFK NULLKullanıcının sektörü. Kafe sahibi = Kafe koleksiyonlarını görür.1

Admin Panelde Ne Yapılacak?

1
Koleksiyon Oluştur
İsim ver, ikon ve renk seç. Kapak görseli ekle (opsiyonel).
2
Nerede Görünsün?
Anasayfa, Sektör, Radyo, Genre... Birden fazla seçilebilir.
3
Saat Ayarla
Başlangıç-bitiş saati (00:00-23:00) veya "Her zaman".
4
Kime / Nereye Gösterilsin? GENİŞLEDİ
Herkese → hiçbir şey seçme
Sektöre göre → sektör seç (Kafe, Spor Salonu...)
Genre'a göre → genre seç (Rock, Jazz...)
Radyoya göre → radyo seç (Jazz FM...)
Firmaya özel → corporate hesap seç (X Otel Zinciri)
5
İçerik Ekle
Playlist, Albüm, Radyo, Genre veya Sektör ekle. Sürükle-bırak ile sırala.
6
Koleksiyonları Sırala
Koleksiyonlar arası sıralama: sort_order (sürükle-bırak, küçük numara üstte).
Not: "Tasarım seç" adımı yok! Sistem içerik tiplerine bakarak otomatik karar verir (genre-only → grid, diğer → yatay kaydırma).

Sitede Ne Olacak?

1
Kişisel Karşılama
"Günaydın, Ahmet!" + "Kafe & Restoran için seçilmiş içerikler"
2
Koleksiyonlar Listelenir
O saatte + o sektöre/genre'a/radyoya + o sayfaya uygun koleksiyonlar, otomatik tespit edilen tasarımda sırayla görünür. Genre-only → grid (15 kart), diğer → yatay kaydırma (10 kart).
3
Tıklama
Radyo → hemen çalar (sayfa değişmez)   Playlist/Albüm → şarkı listesi   Genre/Sektör → ilgili sayfa
4
"Tümünü Gör" Butonu
Koleksiyondaki öğe sayısı > görünen kart sayısı → buton otomatik çıkar → tıklanınca grid sayfa.
5
Her Saat Başı Otomatik Güncelleme
Sayfa yenilenmez, müzik kesilmez. Sadece orta alan sessizce güncellenir.

Referans: Şu Anki Anasayfa

Mevcut anasayfadaki değerler (koleksiyon sistemi bunları temel alacak):

BölümKart SayısıTasarımKoleksiyon Karşılığı
Türler (Genres) 15 Grid Genre-only koleksiyon → otomatik grid
Çalma Listeleri 10 Yatay kaydırma Playlist-only koleksiyon → otomatik yatay
Albümler 10 Yatay kaydırma Album-only koleksiyon → otomatik yatay
Radyolar 10 Yatay kaydırma Radio-only koleksiyon → otomatik yatay
Sektörler 10 Yatay kaydırma Sector-only koleksiyon → otomatik yatay
Versiyon Geçmişi
v1: İlk özet. type ENUM (curated/daypart/sector/featured), priority, is_featured, cache_ttl, business_rules.
v2: type kaldırıldı → show_on + template eklendi. priority → sort_order. is_featured + cache_ttl kaldırıldı. Tasarım seçenekleri (grid + yatay kaydırma).
v3: business_rules kaldırıldı (herkes zaten üye). corporate_account_id FK eklendi (firmaya özel koleksiyon). "Kime?" bölümü sadeleşti.
v4: template kolonu kaldırıldı (otomatik tespit). Mevcut kart component'leri bölümü eklendi. Kart sayıları (15/10) ve "Tümünü Gör" mantığı. 13→12 kolon.
v5: sector_rulesvisibility_rules olarak genişletildi. Artık sektör, genre ve radyo filtresi tek JSON kolonda. Genre ve radyo sayfaları için de hedef belirleme. Kolon sayısı aynı (12).

Teknik detaylar, kod örnekleri ve tüm kararlar için:

Tam Dokümantasyon (v10)

Not: v10 henüz v5 değişikliklerini içermiyor, güncellenecek.