v4 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?
Kolonlar: sector_rules + corporate_account_id
Herkes: İkisi de boş → tüm kullanıcılar görür.
Sektöre göre: Sadece Kafe sektöründekiler görür.
Corporate'a özel: Sadece o firmanın çalışanları görür.
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).

"Kime?" Detayı

Herkes zaten üye olduğu için abonelik filtresi yok. İki filtre var:

Herkese
sector_rules = boş veya show_to_all
corporate_account_id = NULL
Tüm kullanıcılar bu koleksiyonu görür.
Sektöre Göre
sector_rules = {sector_ids: [1,3]}
corporate_account_id = NULL
Örn: Kafe sektöründeki kullanıcılar anasayfalarında bunu görür. Diğerleri görmez.
Corporate'a Özel
sector_rules = boş
corporate_account_id = 5
Örn: X Otel Zinciri çalışanları anasayfalarında bunu görür. Diğer hiç kimse görmez.
corporate_account_id: Basit bir FK. NULL = herkesin koleksiyonu, dolu = o corporate'a özel. Her corporate aynı "alanı" kullanır — sıralama sort_order ile belirlenir, diğer koleksiyonlarla karışır. 1-2 corporate kullanacak.

Kullanılacak Kartlar YENİ

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" YENİ

Ş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 sayfalarda görünsün? ["homepage", "sector", "radio", "genre"]
display_rules JSON NULL NE ZAMAN: Saat + gün kuralı {"start_hour":6, "end_hour":12, "is_always":false}
sector_rules JSON NULL KİME (sektör): Hangi sektörlere? {"show_to_all":true} veya {"mode":"include", "sector_ids":[1]}
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. v3'ten template kaldırıldı (otomatik tespit ediliyor, DB'de tutmaya gerek yok). v1'den bu yana: 5 kaldırıldı (type, is_featured, cache_ttl, business_rules, template), 2 eklendi (show_on, corporate_account_id).

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 YENİ

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 Gösterilsin?
Herkese → hiçbir şey seçme
Sektöre göre → sektör seç (Kafe, Spor Salonu...)
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 + 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 YENİ

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ığı. Admin'den "Tasarım Seç" adımı kaldırıldı. Şu anki anasayfa referans tablosu. 13→12 kolon.

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

Tam Dokümantasyon (v10)

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