# Bildirim Düzeni

https://dev.wisecp.com/tr/bildirim-duzeni

Bütün bildirimlerin paylaştığı çerçeveyi ve logoları yöneten dört uç.

## Genel Bakış

Her bildirim ortak bir **çerçeve** içinde gider: üstte bir başlık, ortada şablonun kendi gövdesi, altta bir imza. Bu makale o çerçeveyi ve içindeki logoları yönetir.

Çerçeve dil başına ayrı tutulur, çünkü metni ve yönü dile bağlıdır. Şablon motoru ise **kurulum geneli** tek bir seçimdir ve değişkenlerin hangi yazımla çözüleceğini belirler.

Yazma çağrısı çerçeveyi kaydetmeden önce denetler: bilinmeyen bir değişken ya da bozuk sözdizimi reddedilir. Böylece bozuk bir çerçeve bütün bildirimleri düşürmez.

## Referans

### Düzeni Okuma

get/api/v1/admin/notifications/settings

`Notifications/GetNotificationSettings` admin

Bütün bildirimlerin paylaştığı çerçeveyi ve logoları döndürür.

Dönen alanlar data — 3

enginestringŞablon motoru. Değişkenlerin hangi yazımla çözüleceğini belirler.

layoutobject layout.Dil başına çerçeve parçaları.

headerstringÜst parça.

contentstringGövdenin yerleşeceği orta parça.

footerstringAlt parça.

logosobjectÜst ve alt logonun adresleri. Yüklenmemişse boş gelir.

Hatalar 1

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/notifications/settings' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/notifications/settings', {
  headers: { Authorization: `Bearer ${apiKey}` },
});

const { data } = await res.json();
const syntax = data.engine;   // degiskenlerin yazimi buna bagli
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/notifications/settings');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Motor degisirse TUM sablonlardaki degisken yazimi degisir; once hangi motorda oldugunuzu okuyun.
$cfg = Api::Notifications()->GetNotificationSettings()['data'];
$engine = $cfg['engine'];
```

### Düzeni Yazma

put/api/v1/admin/notifications/settings

`Notifications/UpdateNotificationSettings` admin sözdizimi denetlenir

Şablon motorunu ve çerçeve parçalarını değiştirir.

Gövde 2

enginestringŞablon motoru: motor yok, Smarty ya da Twig.

layoutobject layout.Dil başına çerçeve parçaları. Gönderilen her dil, değişken ve sözdizimi için tam çerçeve olarak denetlenir. Göndermediğiniz parça kayıtlı kopyasını korur; yalnız footer gönderebilirsiniz.

headerstringÜst parça.

contentstringGövdenin yerleşeceği orta parça.

footerstringAlt parça.

Dönen alanlar data — 3

dataobjectGüncel düzen. Okuma ucuyla aynı şekildedir.

Hatalar 3

invalid_variable422Bilinmeyen bir değişken kullanılmış.

invalid_syntax422Şablon sözdizimi hatalı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X PUT 'https://panel.ornek.com/api/v1/admin/notifications/settings' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"engine":"twig","layout":{"en":{"header":"<header></header>","content":"{{ content }}","footer":"<footer></footer>"}}}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/notifications/settings', {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    engine: 'twig',
    layout: { en: { header, content: '{{ content }}', footer } },
  }),
});

if (res.status === 422) showSyntaxError(await res.json());
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/notifications/settings');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PUT',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['engine' => 'twig', 'layout' => $layout]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Denetim YALNIZ duzen parcalarina bakar: sablonlarin kendi govdeleri motor degisiminde denetlenmez.
Api::Notifications()->UpdateNotificationSettings([
    'engine' => 'twig', 'layout' => $layout,
]);
```

### Logo Yükleme

post/api/v1/admin/notifications/logos/{type}

`Notifications/UploadNotificationLogo` admin

Bildirimlerin üst ya da alt logosunu yükler.

Gövde 1

filestringreqGörsel. Kodlanmış içerik ya da uzak adres olarak gönderilir.

Dönen alanlar data — 2

typestringLogo türü.

logostringYüklenen logonun tam adresi.

Hatalar 5

invalid_type422Logo türü üst ya da alt değil.

file_required422Dosya verilmedi.

file_invalid422Dosya okunamadı.

upload_failed422Yükleme başarısız.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X POST 'https://panel.ornek.com/api/v1/admin/notifications/logos/header' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"file":"data:image/png;base64,iVBORw0KGgo..."}'
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/notifications/logos/${type}`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ file: dataUri }),
});

const { data } = await res.json();
```

```php
$uri = 'data:image/png;base64,' . base64_encode(file_get_contents($path));

$ch = curl_init('https://panel.ornek.com/api/v1/admin/notifications/logos/' . $type);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['file' => $uri]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Yeni logo ESKISINI SILER: geri donus yolu yoktur, once mevcut dosyayi indirip saklayin.
$cur = Api::Notifications()->GetNotificationSettings()['data']['logos']['header'] ?? '';
if ($cur) file_put_contents('logo-backup.png', file_get_contents($cur));

Api::Notifications()->UploadNotificationLogo(['type' => 'header', 'file' => $uri]);
```

### Logoyu Kaldırma

delete/api/v1/admin/notifications/logos/{type}

`Notifications/DeleteNotificationLogo` admin

Üst ya da alt logoyu kaldırır.

Dönen alanlar data — 2

typestringLogo türü.

deletedboolSilme çalıştı mı.

Hatalar 2

invalid_type422Logo türü üst ya da alt değil.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/notifications/logos/header' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/notifications/logos/${type}`, {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/notifications/logos/' . $type);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Logoyu kaldirmak duzendeki gorsel etiketini KALDIRMAZ: cerceve kirik gorsel gosterebilir.
Api::Notifications()->DeleteNotificationLogo(['type' => 'header']);
// duzendeki <img> satirini da temizleyin
```

## Tuzaklar

> **Motor değişimi bütün şablonları etkiler**
> 
> Şablon motoru kurulum genelinde tektir; değiştirmek **her bildirimin** değişken yazımını değiştirir. Yazma çağrısı yalnız gönderdiğiniz çerçeveyi denetler, şablonların kendi gövdelerini **denetlemez**. Motoru değiştirmeden önce şablon metinlerinin yeni yazıma uyduğunu kendiniz doğrulayın.

> **Yeni logo eskisini siler**
> 
> Logo yüklemek eski dosyayı sunucudan **kaldırır**; bir sürüm geçmişi yoktur. Yanlış bir görsel yüklemek eskisini geri getirilemez biçimde götürür. Yüklemeden önce mevcut logoyu adresinden indirip saklayın.

> **Logoyu kaldırmak çerçeveyi düzeltmez**
> 
> Logo kaldırma dosyayı ve ayar kaydını siler, ama çerçevedeki **görsel etiketini kaldırmaz**. Çerçeve o adrese işaret etmeye devam ederse müşteriye giden e-postada kırık bir görsel görünür. Logoyu kaldırdıktan sonra çerçeveyi de düzenleyin.

> **Çerçeve dil başınadır, motor değildir**
> 
> Çerçeve parçalarını dil başına yazarsınız, ama motor tek bir kurulum ayarıdır. Bir dilin çerçevesini yeni motora göre yazıp diğerlerini eski hâlinde bırakmak, **bırakılan dillerde** ham değişken metni gösterir. Motoru değiştirirken bütün dilleri birlikte geçirin.

> **Denetim yalnız gönderilen dilleri kapsar**
> 
> Yazma çağrısı, gövdede gönderdiğiniz her dilin birleşik çerçevesini denetler. Göndermediğiniz diller **denetlenmez** ve bozuk kalmışlarsa öyle kalırlar. Kurulum genelinde bir doğrulama istiyorsanız bütün dilleri gönderin.

## İlgili Makaleler

- [Bildirim Şablonları](https://dev.wisecp.com/tr/bildirim-sablonu-yonetimi)
- [Dil Paketleri](https://dev.wisecp.com/tr/dil-paketleri)
