Skip to content

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.


  • Şema: app/db/schema.tsacademyPages
  • Migration: drizzle/0044_academy_pages_seo.sql (SEO alanları ekler)

Önemli alanlar:

  • academyId (FK → academies.id, cascade delete)
  • slug (akademi içinde unique)
  • title
  • isPublished (sayfa canlıda görünsün mü?)

Builder akışı “taslak ayrı, canlı ayrı” olacak şekilde versionlanır:

  • Draft alanları (builder buraya yazar):
    • draftContent (JSON — { blocks: BlockData[] } veya legacy HTML)
    • draftMetaTitle, draftMetaDescription, draftOgImageUrl
    • draftVersion (optimistic locking)
  • Published alanları (öğrenci storefront burayı okur):
    • publishedContent
    • publishedMetaTitle, publishedMetaDescription, publishedOgImageUrl
    • publishedAt
    • publishedVersion (optimistic locking)

Not: content ve metaTitle/metaDescription/ogImageUrl alanları 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)

  • 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_pages listesi (slug, yayın durumu)
  • Satıra tıklayınca ?pageId= navigasyonu ve iframe BUILDER_PREVIEW_NAVIGATE
  • Yeni Sayfa Ekle modal → intent=create-page action → slug otomatik üretim / çakışma çözümü
  • Navbar/footer link picker’da yeni sayfalar anında /p/:slug olarak 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.)

Sayfa düzenleme ekranında (unified builder) SEO paneli, aşağıdaki alanları draft olarak tutar:

  • draftMetaTitle
  • draftMetaDescription
  • draftOgImageUrl

“Yayınla” ile bu alanlar published karşılıklarına kopyalanır:

  • publishedMetaTitle
  • publishedMetaDescription
  • publishedOgImageUrl

Not: /:lang/instructor/academy/pages/:id route’u artık sadece unified builder’a redirect eder.

Slug sanitizasyonu:

  • Küçük harfe çevirir
  • Alfanumerik dışı karakterleri - yapar
  • Baş/son - temizler

Bu modülün tamamlanması için tenant storefront’ta academy_pages.slug üzerinden public render route’u eklenir:

  • Route: /p/:slugapp/routes/p.$slug.tsx
  • Davranış:
    • Host’tan tenant tespit edilir (getTenantByRequest)
    • Sayfa academyId + slug + isPublished=true ile bulunur
    • Bulunamazsa 404
    • Render içeriği öncelikle publishedContent alanından okunur (fallback: legacy content)
    • 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