210 lines
5.4 KiB
Markdown
210 lines
5.4 KiB
Markdown
# 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 | Açı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
|
||
|
||
```json
|
||
{
|
||
"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:
|
||
```json
|
||
{
|
||
"type": "hero",
|
||
"content": {
|
||
"title": "Blok başlığı",
|
||
"description": "Açıklama..."
|
||
},
|
||
"order_index": 0,
|
||
"is_active": true
|
||
}
|
||
```
|
||
|
||
### Response (201):
|
||
```json
|
||
{
|
||
"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:
|
||
|
||
```json
|
||
{
|
||
"content": {
|
||
"_width": "half",
|
||
"title": "Güncel Başlık",
|
||
"body": "<p>Yeni içerik</p>"
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## DELETE /admin/courses/{course}/blocks/{block}
|
||
|
||
```json
|
||
{ "message": "Blok silindi." }
|
||
```
|
||
|
||
---
|
||
|
||
## POST /admin/courses/{course}/blocks/reorder — Sıralama
|
||
|
||
```json
|
||
{
|
||
"items": [
|
||
{ "id": 3, "order_index": 0 },
|
||
{ "id": 1, "order_index": 1 },
|
||
{ "id": 2, "order_index": 2 }
|
||
]
|
||
}
|
||
```
|
||
|
||
```json
|
||
{ "message": "Blok sıralaması güncellendi." }
|
||
```
|
||
|
||
---
|
||
|
||
## Blok Tipleri
|
||
|
||
Page Blocks ile aynı blok tipleri kullanılır:
|
||
|
||
| type | Açı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 | Açı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 |
|
||
|
||
```json
|
||
// 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:
|
||
|
||
```json
|
||
{
|
||
"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`
|