# Tema Koruma

https://dev.wisecp.com/tr/tema-lisanslama-ve-koruma

Temanın modül sınıfı yoktur ve şablonları şifrelenemez. Neyin korunabildiği, lisans kontrolünün nereye konduğu ve bir şablonun dürüstçe neyi zorlayabildiği.

## Genel Bakış

Yalnız PHP şifrelenebilir. Temada bunlar `hooks.php`, `theme.php` ve yalnızca tema `engine: 'php'` bildirdiğinde view dosyalarının kendisidir.

> **Şablona sır ve karar konmaz**
> 
> Şablon yalnız gösterir. Karşılaştırdığı değer ve kararı veren kod şifreli PHP dosyasında yaşar.

## Ön Koşullar

- **Kendi lisans sunucunuz**: Sorunun nereye gideceği ve cevabın ne anlama geldiği size ait: [Pazar Yeri Ürününü Lisanslama](https://dev.wisecp.com/tr/pazar-yeri-urun-lisanslama).
- **Temada bir hooks.php**: Sıradan temada isteğe bağlı, lisanslı temada zorunlu. İlk sayfa gösterilmeden önce çalışan tek dosya odur.
- **Varlıkların açık gittiğini kabul etmek**: CSS, JavaScript ve görseller olduğu gibi gider. Kopyalanabilirler; yalnız onlarla çalışan bir tema kurulamaz.

## Yapı

Üç katman var ve ilk ikisi aynı dosyadır.

| Katman | Nerede | Ne yapar |
| --- | --- | --- |
| Kontrol | `hooks.php`, şifreli | Sunucunuza sorar. İlk sayfa gösterilmeden önce bir kez çalışır, böylece lisanssız kopya en başta yargılanır |
| Yayım | `hooks.php`, şifreli | Cevap "evet" ise şablon verisine bir mühür koyar, değilse hiçbir şey koymaz |
| Zorlama | korunan her şablon | Kendi taşıdığı sabit mühürle karşılaştırır. Paketleyici burada hiçbir şey şifrelemez, karşılaştırmanın kendisi tek dayanaktır |

Dosya yalnız varsa yüklenir. Silinmiş bir `hooks.php` hiç mühür yayımlamaz ve korunan her şablon kapalı tarafa düşer.

## Adım Adım

### Kontrolü hooks.php içine koyun

1. Sunucunuza `hooks.php` içinden sorun. Burası, ilk sayfa gösterilmeden önce bir kez çalışan tek yerdir.
2. Cevabı saklayın. Tema her sayfada devrededir, cache'siz bir kontrol sayfa başına bir istek demektir.
3. Kararı orada, şifreli dosyada verin. Şablonlara ulaşan şey bir değerdir, gerekçe değil.

### Mührü tek kancadan yayımlayın

1. Tema için **tek** bir `filter:template.variables` kancası kaydedin ve temanın ihtiyaç duyduğu her şeyi onun içinde toplayın.
2. Lisans "evet" dediğinde mührü döndürdüğü diziye ekleyin, demediğinde hiç eklemeyin.
3. İkinci bir kanca kaydetmeyin. Yalnız son dönen dizi yaşar, ikinci kayıt birincinin verisini sessizce düşürür.

### Bayrağı değil değeri karşılaştırın

1. Şablonun taşıdığı sabit dizeyle karşılaştırın. Boolean burada işe yaramaz: isteyen kendi kancasını kaydedip "true" yayımlayabilir.
2. Karşılaştırmayı lisanssız çalışmaması gereken her şablona koyun, tek bir ortak sarmalayıcıya değil. Tek kontrol, bulunup silinecek tek dosya demektir.
3. Lisanslı yolun sayfanın ihtiyaç duyduğu bir şeyi üretmesini sağlayın. Böylece kontrolü sökmek uyarıyı gizlemek yerine tasarımı bozar.

### Tam koruma PHP tema demektir

1. Künyede `engine: 'php'` bildirin. View dosyaları PHP olur ve geri kalanla birlikte şifrelenir.
2. Karşılığında sandbox'tan vazgeçer, kaçış sorumluluğunu üstlenirsiniz. Motor seçimi bu takası açıkça söyler.
3. Varlıklar iki durumda da açık kalır.

## Referans

- **hooks.php**: Şifrelenebilir. Kontrol, cache ve yayım burada yaşar.
- **theme.php**: Şifrelenebilir. Künye: motor, meta ve ayar şeması.
- **view, engine php**: Şifrelenebilir, çünkü PHP dosyalarıdır.
- **view, tpl ya da twig**: Şifrelenemez. Herhangi bir kontrol çalışmadan önce diske düz PHP olarak derlenir.
- **varlıklar**: Şifrelenemez. CSS, JavaScript, font ve görseller olduğu gibi gider.

## Örnek

```php
\Hook::add('filter:template.variables', 1, function ($template, $data) {
    $answer = \License::remote_check('https://vendor.example/api/licence', [
        'product' => 'aurora-theme',
        'domain'  => \Utility::getDomain(),
    ]);

    $body = \Utility::jdecode((string) ($answer['body'] ?? ''), true);
    $ok   = $answer === null || ($body['data']['valid'] ?? false) === true;

    // Mühür yalnız "evet" cevabında eklenir. Temanın yayımladığı diğer her şey de aynı
    // dizidedir: ikinci bir kanca hepsini birden düşürür.
    if ($ok) $data['aurora_seal'] = 'a7f3c1d90e5b';

    return $data;
});
```

```smarty
{if $aurora_seal|default:'' !== 'a7f3c1d90e5b'}
    {include file='partials/unlicensed.tpl'}
{else}
    {* bölümün kendisi *}
{/if}
```

## Tuzaklar

> **Mühür bir sır değildir**
> 
> Lisanslı kopyası olan biri, lisanslı yolun ne yayımladığını izleyebilir. Bu, ömrü bir sürüm kadar olan bir anahtardır. Her sürümde yenisini yazın ki eski paketten alınan değer ilk güncellemede ölsün.

> **Tema başına tek kanca**
> 
> Yalnız son dönen dizi yaşar. İkinci bir kayıt mührü, menüleri ve birincinin yayımladığı her şeyi düşürür.

> **Ağırlık iki gerçek savunmada olmalı**
> 
> Lisanslı yol sayfanın ihtiyaç duyduğu bir şeyi taşısın ve kurulumları bildirin ki kopyaların nerede çalıştığını görebilesiniz. Temanın gerçek koruması şifreleme değil, lisanstır.

## İlgili Makaleler

- [Pazar Yeri Ürününü Lisanslama](https://dev.wisecp.com/tr/pazar-yeri-urun-lisanslama)
- [Ürün Yayınlama](https://dev.wisecp.com/tr/pazar-yerinde-urun-yayinlama)
- [Tema Kancaları ve Çıktı Filtreleri](https://dev.wisecp.com/tr/tema-kancalari-ve-cikti-filtreleri)
- [Tema Motoru](https://dev.wisecp.com/tr/tema-motoru)
