# Error Sayfası Yapılandırması

TYPO3 v13'te 404 (Sayfa Bulunamadı) ve 500 (Sunucu Hatası) gibi hata sayfalarının yapılandırılmasını kapsar.

---

## Site Configuration ile Hata Sayfası

### config.yaml

`config/sites/main/config.yaml`:

```yaml
base: 'https://typo3v13.ddev.site/'
rootPageId: 1
errorHandling:
  -
    errorCode: 404
    errorHandler: Page
    errorContentSource: 't3://page?uid=10'
  -
    errorCode: 500
    errorHandler: Page
    errorContentSource: 't3://page?uid=11'
  -
    errorCode: 403
    errorHandler: Page
    errorContentSource: 't3://page?uid=12'
```

### Error Handler Türleri

| Handler | Açıklama |
|---------|----------|
| `Page` | Bir TYPO3 sayfasını hata sayfası olarak gösterir |
| `Fluid` | Fluid template kullanarak özel hata sayfası oluşturur |
| `PHP` | Özel PHP sınıfı ile hata yönetimi |

---

## Yöntem 1: TYPO3 Sayfası ile Hata Sayfası

### Sayfa Oluşturma

1. Backend'de root sayfa altında yeni bir sayfa oluşturun (ör: "404 - Sayfa Bulunamadı")
2. Sayfa türünü **Standard** olarak bırakın
3. **Access** sekmesinde **Visibility > Page > In Menus** işaretini kaldırın (menüde görünmesin)
4. Sayfaya istediğiniz içerik elemanlarını ekleyin

### config.yaml Ayarı

```yaml
errorHandling:
  -
    errorCode: 404
    errorHandler: Page
    errorContentSource: 't3://page?uid=10'
```

> `uid=10` yerine oluşturduğunuz sayfanın UID'sini yazın.

---

## Yöntem 2: Fluid Template ile Hata Sayfası

### config.yaml Ayarı

```yaml
errorHandling:
  -
    errorCode: 404
    errorHandler: Fluid
    errorFluidTemplate: 'EXT:my_site_package/Resources/Private/Templates/Sites/Error404.html'
    errorContentSource: 't3://page?uid=1'
  -
    errorCode: 500
    errorHandler: Fluid
    errorFluidTemplate: 'EXT:my_site_package/Resources/Private/Templates/Sites/Error500.html'
```

### Error404.html

```html
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
      data-namespace-typo3-fluid="true">

<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>404 - Sayfa Bulunamadı</title>
    <style>
        * { margin: 0; padding: 0; box-sizing: border-box; }
        body {
            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background: linear-gradient(135deg, #1e3a5f 0%, #2d5a87 100%);
            color: #ffffff;
        }
        .error-container {
            text-align: center;
            padding: 2rem;
        }
        .error-code {
            font-size: 8rem;
            font-weight: 800;
            line-height: 1;
            opacity: 0.3;
        }
        .error-title {
            font-size: 2rem;
            margin: 1rem 0;
        }
        .error-message {
            font-size: 1.1rem;
            opacity: 0.8;
            max-width: 500px;
            margin: 0 auto 2rem;
        }
        .back-link {
            display: inline-block;
            padding: 0.8rem 2rem;
            background: #ffffff;
            color: #1e3a5f;
            text-decoration: none;
            border-radius: 5px;
            font-weight: 600;
            transition: transform 0.2s;
        }
        .back-link:hover {
            transform: translateY(-2px);
        }
    </style>
</head>
<body>
    <div class="error-container">
        <div class="error-code">404</div>
        <h1 class="error-title">Sayfa Bulunamadı</h1>
        <p class="error-message">
            Aradığınız sayfa mevcut değil veya taşınmış olabilir.
            Lütfen URL'yi kontrol edin veya ana sayfaya dönün.
        </p>
        <a href="/" class="back-link">Ana Sayfaya Dön</a>
    </div>
</body>
</html>

</html>
```

### Error500.html

```html
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
      data-namespace-typo3-fluid="true">

<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>500 - Sunucu Hatası</title>
    <style>
        body {
            font-family: -apple-system, BlinkMacSystemFont, sans-serif;
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background: #f8f9fa;
            color: #333;
            text-align: center;
        }
        .error-code { font-size: 6rem; font-weight: 800; color: #dc3545; }
        .error-title { font-size: 1.8rem; margin: 1rem 0; }
        .back-link {
            display: inline-block;
            margin-top: 1.5rem;
            padding: 0.8rem 2rem;
            background: #007bff;
            color: #fff;
            text-decoration: none;
            border-radius: 5px;
        }
    </style>
</head>
<body>
    <div>
        <div class="error-code">500</div>
        <h1 class="error-title">Sunucu Hatası</h1>
        <p>Bir şeyler yanlış gitti. Lütfen daha sonra tekrar deneyin.</p>
        <a href="/" class="back-link">Ana Sayfaya Dön</a>
    </div>
</body>
</html>

</html>
```

---

## Yöntem 3: PHP Handler ile Özel Hata Yönetimi

### Sınıf Oluşturma

`packages/my_site_package/Classes/Error/CustomErrorHandler.php`:

```php
<?php

declare(strict_types=1);

namespace MySite\SitePackage\Error;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use TYPO3\CMS\Core\Error\PageErrorHandler\PageErrorHandlerInterface;
use TYPO3\CMS\Core\Http\HtmlResponse;

class CustomErrorHandler implements PageErrorHandlerInterface
{
    private int $statusCode;

    public function __construct(int $statusCode, array $configuration)
    {
        $this->statusCode = $statusCode;
    }

    public function handlePageError(
        ServerRequestInterface $request,
        string $message,
        array $reasons = []
    ): ResponseInterface {
        $content = sprintf(
            '<html><body><h1>Hata %d</h1><p>%s</p></body></html>',
            $this->statusCode,
            htmlspecialchars($message)
        );

        return new HtmlResponse($content, $this->statusCode);
    }
}
```

### config.yaml Ayarı

```yaml
errorHandling:
  -
    errorCode: 404
    errorHandler: PHP
    errorPhpClassFQCN: MySite\SitePackage\Error\CustomErrorHandler
```

---

## Tüm Hata Kodlarını Yakalama

```yaml
errorHandling:
  -
    errorCode: 404
    errorHandler: Fluid
    errorFluidTemplate: 'EXT:my_site_package/Resources/Private/Templates/Sites/Error404.html'
  -
    errorCode: 403
    errorHandler: Fluid
    errorFluidTemplate: 'EXT:my_site_package/Resources/Private/Templates/Sites/Error403.html'
  -
    errorCode: 500
    errorHandler: Fluid
    errorFluidTemplate: 'EXT:my_site_package/Resources/Private/Templates/Sites/Error500.html'
  -
    errorCode: 503
    errorHandler: Fluid
    errorFluidTemplate: 'EXT:my_site_package/Resources/Private/Templates/Sites/Error503.html'
  -
    errorCode: 0
    errorHandler: Fluid
    errorFluidTemplate: 'EXT:my_site_package/Resources/Private/Templates/Sites/Error.html'
```

> `errorCode: 0` tüm tanımlanmamış hata kodlarını yakalar.

---

## Kaynaklar

- [TYPO3 Error Handling](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/SiteHandling/ErrorHandling.html)
