Academy Page Manager (Dinamik Sayfalar)
Eğitmenin sınırsız sayfa (slug) üretmesini sağlayan Page Manager: academy_pages tablosu, template ile sayfa oluşturma, unified Visual Builder ile düzenleme ve SEO alanları.
Academy CMS’in “tam CMS” olmasını sağlayan kritik parça Dinamik Sayfa Yöneticisidir. Eğitmen; “Hakkımızda”, “İletişim”, “Vizyonumuz” gibi sınırsız sayfayı belirlediği slug ile oluşturabilir ve içeriği aynı Visual Builder arayüzüyle (blok tabanlı) düzenleyebilir.
Draft/published ayrımı, deploy geçmişi ve rollback akışı için: Storefront Publishing, Versioning & Rollback.
Veritabanı: academy_pages
Section titled “Veritabanı: academy_pages”- Şema:
app/db/schema.ts→academyPages - Migration:
drizzle/0044_academy_pages_seo.sql(SEO alanları ekler)
Önemli alanlar:
academyId(FK →academies.id, cascade delete)slug(akademi içinde unique)titleisPublished(sayfa canlıda görünsün mü?)
Draft vs Published (taslak/canlı)
Section titled “Draft vs Published (taslak/canlı)”Builder akışı “taslak ayrı, canlı ayrı” olacak şekilde versionlanır:
- Draft alanları (builder buraya yazar):
draftContent(JSON —{ blocks: BlockData[] }veya legacy HTML)draftMetaTitle,draftMetaDescription,draftOgImageUrldraftVersion(optimistic locking)
- Published alanları (öğrenci storefront burayı okur):
publishedContentpublishedMetaTitle,publishedMetaDescription,publishedOgImageUrlpublishedAtpublishedVersion(optimistic locking)
Not:
contentvemetaTitle/metaDescription/ogImageUrlalanları geriye dönük uyumluluk için korunur; yeni render akışı published alanlarını tercih eder.
Unique constraint:
uniqueIndex("academy_slug_idx").on(academyId, slug)
Eğitmen arayüzü
Section titled “Eğitmen arayüzü”1) Listeleme ekranı (Page Manager)
Section titled “1) Listeleme ekranı (Page Manager)”- Route:
/:lang/instructor/academy/pages - Dosya:
app/routes/instructor.academy.pages._index.tsx
Yetenekler:
- Akademiye ait sayfaları listeler (publish/taslak durum badge’i)
- “Yeni Sayfa Ekle” veya template seçerek oluşturma ile taslak sayfa oluşturur
- “Düzenle” aksiyonu sayfayı unified builder üzerinden açar:
/:lang/instructor/academy/builder?pageId=... - Sayfa silme (confirm + delete)
1b) Builder içi sayfa yöneticisi (Faz 6)
Section titled “1b) Builder içi sayfa yöneticisi (Faz 6)”Aynı işlevler Visual Builder’ın Sayfalar sekmesinden de kullanılabilir (instructor.academy.builder.tsx):
- Sabit Anasayfa satırı + tüm
academy_pageslistesi (slug, yayın durumu) - Satıra tıklayınca
?pageId=navigasyonu ve iframeBUILDER_PREVIEW_NAVIGATE - Yeni Sayfa Ekle modal →
intent=create-pageaction → slug otomatik üretim / çakışma çözümü - Navbar/footer link picker’da yeni sayfalar anında
/p/:slugolarak seçilebilir
Bu akış, ayrı /instructor/academy/pages ekranına gitmeden sayfa oluşturmayı ve önizlemede test etmeyi hızlandırır.
2) Unified Visual Builder (Sayfa düzenleme)
Section titled “2) Unified Visual Builder (Sayfa düzenleme)”- Route:
/:lang/instructor/academy/builder?pageId=:id - Dosya:
app/routes/instructor.academy.builder.tsx
Yetenekler:
- Aynı builder UI ile sayfaya blok ekleme/sıralama/silme
- Sayfa özel SEO ayarları (meta title/description/og image)
- Template ile başlangıç blokları (About/Contact/FAQ vb.)
SEO Manager (sayfa bazlı)
Section titled “SEO Manager (sayfa bazlı)”Sayfa düzenleme ekranında (unified builder) SEO paneli, aşağıdaki alanları draft olarak tutar:
draftMetaTitledraftMetaDescriptiondraftOgImageUrl
“Yayınla” ile bu alanlar published karşılıklarına kopyalanır:
publishedMetaTitlepublishedMetaDescriptionpublishedOgImageUrl
Not:
/:lang/instructor/academy/pages/:idroute’u artık sadece unified builder’a redirect eder.
Slug sanitizasyonu:
- Küçük harfe çevirir
- Alfanumerik dışı karakterleri
-yapar - Baş/son
-temizler
Tenant tarafı (ziyaretçi)
Section titled “Tenant tarafı (ziyaretçi)”Bu modülün tamamlanması için tenant storefront’ta academy_pages.slug üzerinden public render route’u eklenir:
- Route:
/p/:slug→app/routes/p.$slug.tsx - Davranış:
- Host’tan tenant tespit edilir (
getTenantByRequest) - Sayfa
academyId + slug + isPublished=trueile bulunur - Bulunamazsa 404
- Render içeriği öncelikle
publishedContentalanından okunur (fallback: legacycontent) - Eğer JSON
{ blocks }formatındaysa, builder blokları render edilir - Aksi halde legacy içerik (HTML) fallback olarak gösterilebilir
- SEO meta tag’leri öncelikle
publishedMeta*alanlarından üretilir (fallback: title + içerik özeti) - Canonical URL
https://{subdomain}.achidemy.net/p/{slug}olarak basılır
- Host’tan tenant tespit edilir (