# Workspaces & Editorial Workflow

TYPO3 Workspaces ile içerik düzenleme iş akışı, onay süreçleri ve versiyonlama yönetimini kapsar. Editörler canlı sayfaları etkilemeden taslak ortamında değişiklik yapabilir, ardından onay sürecinden geçerek yayına alınır.

---

## Workspaces Nedir?

Workspaces, TYPO3'ün yerleşik versiyonlama sistemidir:

- **Editörler** canlı siteden bağımsız çalışabilir
- **Değişiklikler** workspace içinde izole edilir — canlıyı etkilemez
- **Gözden geçirme** süreci — reviewer onaylanmadan yayın yapılmaz
- **İçerik kontrol** — admin düzeyinde kim, ne yayınlayabilir kuralları belirlenebilir

---

## Kurulum

```bash
ddev composer require typo3/cms-workspaces
ddev exec vendor/bin/typo3 extension:setup
ddev exec vendor/bin/typo3 cache:flush
```

---

## Workspace Oluşturma

### Backend'de

1. **System > Workspaces** modülüne gidin
2. **Yeni Workspace Oluştur** (+) düğmesine tıklayın
3. Aşağıdaki gerekli alanları doldurun:

| Alan | Açıklama | Örnek |
|------|----------|-------|
| **Title** | Workspace adı | "Şubat Kampanyası", "Web Sitesi Yenileme" |
| **Description** | Amacı açıklayan açıklama | "Şubat ayı pazarlama kampanyası içeriği" |
| **Owners** | Admin/Onaylayan kişiler | Yönetici kullanıcılar |
| **Members** | Editör/Yazarlar | İçerik ekibi |
| **Reviewers** | İnceleme yapacak kişiler | Muhabir, Editör-şef |

### Erişim Kontrolü

**DB Mounts** ve **File Mounts** ile erişim sınırlayabilirsiniz:

```
DB Mounts (Veritabanı Erişimi):
  ✓ Root Sayfa
  ├─ Haber Sayfası (erişim verilir)
  ├─ Blog Sayfası (erişim verilir)
  └─ Admin Sayfası (erişim yok — güvenlik)

File Mounts (Dosya Erişimi):
  ✓ /public/uploads/news (yazarlar buraya yükleyebilir)
  ✓ /public/images/campaigns (resim ekleme izni)
```

Böyle yaparak editörler sadece atandıkları içerik alanlarında çalışabilirler.

### Örnek: Haber Ekibi Workspace'i

```
Title: Haber Ekibi - Mart 2026
Description: Haber kategorisinde yaşanan tüm değişikliklerin hazırlandığı workspace
Owners: 
  - admin (administrator)
  - editor-chief (Editör Şefi)
Members:
  - journalist1 (Yazışmacı 1)
  - journalist2 (Yazışmacı 2)
Reviewers:
  - editor-chief (İçerik Onayı)
DB Mounts:
  - News (Haber sayfası)
  - News Categories (Haber Kategorileri)
File Mounts:
  - /public/uploads/news
```

---

## İş Akışı (Workflow)

### Durum Geçişleri

```
┌────────────────────────────────────────────────────────┐
│      WORKSPACE YAŞAM DÖNGÜSÜ VE DURUM GEÇIŞLERI        │
└────────────────────────────────────────────────────────┘

1. OLUŞTURMA (Creation)
   └─→ Workspace oluşturulur, editörler atanır

2. DÜZENLEME (Editing) ⭐ Editör Çalışması
   ├─ Sayfalar düzenlenir
   ├─ İçerik eklenir/silinir
   ├─ Resimler güncellenir
   └─ Canlıyı etkilemez

3. İNCELEMEYE GÖNDERME (Ready for Review)
   └─ Editör "Send to Review" butonu ile reviewer'ı haberdar eder

4. GÖZDEN GEÇIRME (Reviewing) ⭐ Reviewer Görevi
   ├─ Değişiklikleri kontrol eder
   ├─ İçerik doğruluğu, yazım, tasarım kontrol eder
   ├─ Uygun: "Approve" butonu
   └─ Yetersiz: "Reject" butonu (düzeltme için geri gönder)

5. YANSILANMIŞ (Approved)
   └─ Yayına hazır durumdadır

6. YAYINLAMA (Publishing) ⭐ Admin/Owner Görevi
   ├─ Admin "Publish" tuşu ile değişiklikleri canlıya alır
   ├─ Tüm versiyon değişiklikleri canlı veritabanına yazılır
   └─ Frontend sitesi anında güncellenir

7. TAMAMLANDI (Published)
   └─ Workspace'in değişiklikleri artık canlıda görünür
```

### Durum Özeti Tablosu

| Durum | Sorumlu | Ne Olur? | Sonraki Adım |
|-------|---------|---------|--------------|
| **Editing** | Editör | Workspace içinde çalışma | Send to Review |
| **Under Review** | Reviewer | Gözden geçirilir | Approve / Reject |
| **Ready to Publish** | Admin | Yayına hazır | Publish |
| **Published** | Admin | Canlıda yayınlandı | Workspace arşivlene bilir |

---

## Kullanım Adımları

### 1. Workspace Seçimi

Backend'in üst sağ köşesinde **Workspace Seçicisi** vardır (varsayılan: "Live"):

```
┌─ Workspace: [Live ▼]
│  ├─ Live (canlı ortam)
│  ├─ Taslak Çalışma
│  ├─ Haber Güncellemesi
│  └─ Tasarım Değişiklikleri
```

Çalışmak istediğiniz workspace'i seçin.

### 2. Editör Olarak Değişiklik Yapma

**Workspace modunda:**

1. Bir sayfa/içerik öğesi seçin
2. Değişiklikleri yapın (metin, resim, yeni blok ekleme vb.)
3. **Kaydet** (`Ctrl+S` veya Save butonu) — değişiklikler workspace içinde kaydedilir
4. **"Save Locally"** (Yerel Kaydet) — sadece workspace'te görünür
5. **"Save and View"** (Kaydet ve Önizle) — frontend'i yeni sürümle kontrol edin

Backend'deki değişiklikler **canlı siteyi hiç etkilemez**.

### 3. Gözden Geçirmeye Gönderme (Reviewer Rol Gerekli)

Değişiklikler tamamlanınca:

1. **System > Workspaces** modülüne gidin
2. Workspace'i seçin
3. **"Send to Review"** (İncelemeye Gönder) butonu → Reviewer'a bildirim gider
4. **Durum** → "Under Review" (İnceleme Altında) olur

### 4. Reviewer Onayı

**Reviewer rolü verilmiş kullanıcı:**

1. **System > Workspaces** modülüne gider
2. Bekleme listesinde workspace'i görür
3. Sayfaları açıp değişiklikleri kontrol eder
4. **Approve** (Onayla) → Yayına hazır hale getirir
5. **Reject** (Reddet) → Editöre geri gönderir

### 5. Canlıya Alma (Publish)

**Admin/Owner rolü:**

1. **System > Workspaces** modülüne gidin
2. Onaylanmış workspace seçin
3. **Publish** (Yayınla) → Tüm değişiklikler canlı ortama geçer
4. **Durum** → "Published" olur
5. Canlı site anında güncellenir

---

---

## Teknik Detaylar (Geliştiriciler)

### Workspace Tespiti (PHP)

Kodunuzda şu anki workspace'i kontrol etmek için:

```php
<?php

use TYPO3\CMS\Core\Context\Context;
use TYPO3\CMS\Core\Utility\GeneralUtility;

// Şu anki workspace ID'sini al
$workspaceId = GeneralUtility::makeInstance(Context::class)
    ->getPropertyFromAspect('workspace', 'id', 0);

if ($workspaceId === 0) {
    // Live ortam
    echo "Canlı ortamdasınız";
} else {
    // Workspace ortamı
    echo "Workspace #{$workspaceId} içindesiniz";
}
```

### Backend Kullanıcı Workspace Bilgisi

```php
<?php

// Backend kullanıcısının şu anki workspace'ini kontrol et
$currentWorkspace = $GLOBALS['BE_USER']->workspace;

// Workspace kaydını al (eğer varsa)
$workspaceRecord = $GLOBALS['BE_USER']->workspaceRec;

if (!empty($workspaceRecord)) {
    echo "Workspace: " . $workspaceRecord['title'];
    echo "Sahipler: " . $workspaceRecord['owners'];
}
```

### İçerik Ön İzlemesi (Frontend)

Workspace'teki değişiklikleri frontend'de göstermek için:

```php
<?php

// config/system/additional.php içinde

if (\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Context\Context::class)
    ->getPropertyFromAspect('workspace', 'id', 0) > 0) {
    // Workspace modunda ön izleme göster
    $GLOBALS['TYPO3_CONF_VARS']['BE']['versioningWSNotice'] = 1;
}
```

---

## Yapılandırma

### TSconfig ile Workspace Davranışı

[page.tsconfig](../packages/testproject/Configuration/Sets/SitePackage/page.tsconfig) içinde:

```typoscript
# Workspaces — Editorial workflow configuration
options.workspaces.swapMode = any
# Değişikliklerin nasıl uygulanacağını belirler
# Değerler: any, pages, pointer, all

options.workspaces.changeStageMode = any
# Sahiplerin değişiklikleri ki aşamada yayınlayabileceğini kontrol eder
```

---

## Pratik Örnekler

### Örnek 1: Tek Yazarın Basit İş Akışı

```
▼ JOURNALIST1 (Yazışmacı)
1. Workspace: "News March 2026" seçer
2. "News" kategorisi altına yeni haber sayfası oluşturur
3. Sayfayı düzenler, resim ekler, yayınlar
4. Backend'de "Save Locally" ile kaydeder
5. "Web > View" ile frontend'de nasıl göründüğünü kontrol eder

▼ EDITOR-CHIEF (Editör Şefi) - Reviewer
6. Email/Bildirim alır: "Haber Onaya Gönderildi"
7. Workspace'i seçer
8. Sayfayı açar ve okuması kontrol eder
9. İçerik tamam → "Approve" tıklar
10. Durum: "Ready to Publish" olur

▼ ADMIN
11. Admin paneline girer
12. Workspaces modülü
13. "News March 2026" → "Publish" tıklar
14. Sayfalar canlı siteye yayınlanır
15. Kullanıcılar yeni haberleri görür
```

### Örnek 2: Grup Çalışması (Kampanya)

```
Scenario: 3 yazarın işbirliğiyle kamp ayını hazırlaması

WORKSPACE: "February Campaign 2026"
├─ Members:
│  ├─ author1 (Blog yazarı)
│  ├─ author2 (Sosyal medya yazarı)
│  └─ designer (Özel tasarım sayfaları)
├─ Reviewers:
│  └─ marketing-head
└─ Owners:
   └─ admin

GÜN 1-2: Yazarlar çalışır
  author1 → Blog kritik sayfaları yazar
  author2 → Sosyal medya gönderileri yaratır
  designer → Özel kamp sayfa tasarımı

GÜN 3: İncelemelerde
  marketing-head → Tüm içeriği kontrol eder
  Sorun varsa "Reject" + yorum bırakır
  Yazarlar düzeltir → yeniden gönderir

GÜN 4: Yayınlama
  admin → Approve edilen tüm sayfaları publish eder
  Tüm kampanya içeriği canlıya alınır
```

---

## En İyi Uygulamalar

| Uygulamalar | ✅ Yapılmalı | ❌ Yapılmamalı |
|-----------|----------|-------------|
| **Workspace Adlandırması** | Açıklayıcı: "February Campaign 2026" | Belirsiz: "Test123", "Workspace1" |
| **Reviewer Atama** | Bağımsız kişi (editör kendini onaylamasın) | Editör kendisini reviewer yapmasın |
| **Erişim Kontrol** | DB/File Mounts ile sınırlama | Herkesin tüm alanlara erişimi |
| **Yayınlama** | Reviewer onayı sonrası yayınla | Onay beklemeden yayınla |
| **Temizlik** | Tamamlanan workspace'leri archive et | Eski workspace'leri silme |
| **Geri Alma** | Yayın öncesi reject ve düzeltme isteme | Yayın sonrası siteyi düzeltme |
| **İletişim** | Reject sırasında detaylı yorum bırak | Sessizce reddet |

---

## Sorun Giderme

### "Publish" Butonu İnaktif

**Sebep:** Reviewer onayı alınmamış veya yeterli izin yok.

**Çözüm:**
1. Workspace durumunu kontrol et → "Ready to Publish" olmalı
2. Admin/Owner kullanıcısı olup olmadığını kontrol et
3. Reviewer'in "Approve" basıp basmadığını kontrol et

### Değişiklikler Gözükmüyor

**Sebep:** Farklı workspace seçili veya workspace değişiklikleri yayınlanmamış.

**Çözüm:**
1. Workspace seçicisini kontrol et
2. Live (0) workspace'ine geç ve yayınlanmış versiyonu gör
3. Workspace'i publish et (admin olarak)

### Editör Workspace'i Görmüyor

**Sebep:** DB Mounts doğru atanmamış veya haklı eksik.

**Çözüm:**
1. System > Workspaces'teki DB Mounts kontrol et
2. Editörün atandığı sayfaları kontrol et
3. Kullanıcı izinlerini kontrol et: Modules → Workspaces

---

## Kaynaklar

- [TYPO3 Workspaces Resmi Dökümentasyonu](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/Workspaces/)
- [TYPO3 TSconfig Workspaces](https://docs.typo3.org/m/typo3/reference-tsconfig/main/en-us/UsersOperators/Workspace/Index.html)
- [TYPO3 Backend Module Permissions](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/Backend/Modules/)
