Files
bogazici-api/prompts/admin-course-blocks.md
2026-03-27 10:41:54 +03:00

5.4 KiB
Raw Blame History

Admin Panel — Eğitim Blokları (Course Blocks)

Genel Bakış

Eğitim detay sayfalarında artık Page Builder mantığı var. Her eğitimin altına sıralı bloklar eklenebilir. Yapı, Page Blocks ile birebir aynı — aynı blok tipleri, aynı _width desteği, aynı content JSON formatı.


API Endpoints

Tüm endpoint'ler auth:sanctum ile korunuyor. Base URL: {API_URL}/api/admin

Method Endpoint ıklama
GET /admin/courses/{course}/blocks Eğitimin bloklarını listele
POST /admin/courses/{course}/blocks Yeni blok oluştur
GET /admin/courses/{course}/blocks/{block} Blok detayı
PUT /admin/courses/{course}/blocks/{block} Blok güncelle
DELETE /admin/courses/{course}/blocks/{block} Blok sil
POST /admin/courses/{course}/blocks/reorder Sıralama güncelle

GET /admin/courses/{course}/blocks

{
  "data": [
    {
      "id": 1,
      "type": "hero",
      "content": {
        "title": "Köprüüstü Kaynak Yönetimi",
        "subtitle": "BRM",
        "description": "STCW uyumlu ileri düzey eğitim..."
      },
      "order_index": 0
    },
    {
      "id": 2,
      "type": "text",
      "content": {
        "_width": "half",
        "title": "Eğitim Kapsamı",
        "body": "<ul><li>Liderlik</li><li>İletişim</li></ul>"
      },
      "order_index": 1
    }
  ]
}

POST /admin/courses/{course}/blocks — Yeni Blok

Request:

{
  "type": "hero",
  "content": {
    "title": "Blok başlığı",
    "description": "Açıklama..."
  },
  "order_index": 0,
  "is_active": true
}

Response (201):

{
  "id": 5,
  "type": "hero",
  "content": { "title": "Blok başlığı", "description": "Açıklama..." },
  "order_index": 0
}

Validation Kuralları:

Alan Kural
type required, string, max:50
content present, array (boş obje {} gönderilebilir)
order_index optional, integer, min:0 (gönderilmezse otomatik son sıraya eklenir)
is_active optional, boolean

PUT /admin/courses/{course}/blocks/{block} — Güncelle

Sadece değişen alanları gönder:

{
  "content": {
    "_width": "half",
    "title": "Güncel Başlık",
    "body": "<p>Yeni içerik</p>"
  }
}

DELETE /admin/courses/{course}/blocks/{block}

{ "message": "Blok silindi." }

POST /admin/courses/{course}/blocks/reorder — Sıralama

{
  "items": [
    { "id": 3, "order_index": 0 },
    { "id": 1, "order_index": 1 },
    { "id": 2, "order_index": 2 }
  ]
}
{ "message": "Blok sıralaması güncellendi." }

Blok Tipleri

Page Blocks ile aynı blok tipleri kullanılır:

type ıklama Örnek Kullanım
hero Üst banner/başlık alanı Eğitim hero bölümü
text Zengin metin bloğu Eğitim kapsamı, açıklama
text_image Metin + görsel yan yana Eğitim tanıtımı
cards Kart grid Özellikler, sertifikalar
stats_grid İstatistik/adım kartları Süre, katılımcı, başarı oranı
cta Call-to-action Kayıt ol butonu
faq Sıkça sorulan sorular Eğitimle ilgili SSS
gallery Görsel galeri Eğitim ortamı fotoğrafları
video Video embed Tanıtım videosu
testimonials Yorumlar/referanslar Mezun görüşleri
html Serbest HTML Özel içerik

_width Desteği

content JSON içinde _width key'i blok genişliğini belirler:

Değer ıklama
"full" Tam genişlik (varsayılan — key gönderilmezse otomatik full)
"half" Yarım genişlik — ardışık iki half blok yan yana render edilir
// Yan yana iki blok
{ "type": "text", "content": { "_width": "half", "title": "Sol", "body": "..." }, "order_index": 0 }
{ "type": "stats_grid", "content": { "_width": "half", "title": "Sağ", ... }, "order_index": 1 }

Public API — Frontend

GET /api/v1/courses/{slug} artık blocks array'ini de döner:

{
  "data": {
    "id": 1,
    "slug": "kopruustu-kaynak-yonetimi",
    "title": "Köprüüstü Kaynak Yönetimi (BRM)",
    "category": { ... },
    "blocks": [
      { "id": 1, "type": "hero", "content": { ... }, "order_index": 0 },
      { "id": 2, "type": "text", "content": { "_width": "half", ... }, "order_index": 1 },
      { "id": 3, "type": "stats_grid", "content": { "_width": "half", ... }, "order_index": 2 }
    ],
    "schedules": [ ... ],
    ...
  }
}

Frontend, sayfa blokları ile aynı BlockRenderer bileşenini kullanabilir.


Admin Panel Entegrasyonu

Önerilen UI:

Eğitim düzenleme sayfasında (/admin/courses/{id}/edit) mevcut form alanlarının altına bir "Bloklar" sekmesi/bölümü ekle. Bu bölüm Page Builder ile aynı mantıkta çalışır:

  1. Blok listesi order_index sıralı gösterilir
  2. Sürükle-bırak ile sıralama → POST .../reorder
  3. "Blok Ekle" butonu → tip seçimi → POST .../blocks
  4. Blok düzenleme → inline edit veya modal → PUT .../blocks/{id}
  5. Blok silme → onay dialog → DELETE .../blocks/{id}

Aynı bileşenleri paylaşabilirsin:

Page Blocks için yazdığın BlockEditor, BlockTypeSelector, ContentEditor bileşenlerini doğrudan course blocks için de kullan. Sadece API endpoint prefix'i değişir:

  • Page: /admin/pages/{id}/blocks
  • Course: /admin/courses/{id}/blocks