# Şablon Değişkenleri

https://dev.wisecp.com/tr/sablon-degiskenleri

Bir view'ın gösterebildiği her şey adlandırılmış bir değişken olarak gelir. Her birini üç katmandan biri yazar: motor, müşteri sayfa paketi ya da temanın kanca dosyası.

## Genel Bakış

Tema sorgu yapmaz. Veriyi platform hazırlar, view kendisine verileni gösterir. Bir değişkeni hangi katmanın yazdığını bilmek, o değişken yokken nereye bakacağınızı ve temanın onu değiştirip değiştiremeyeceğini söyler.

Katmanların sırası hep aynıdır. Motor, her sayfada görünüm ortamını yazar. Ardından `set_predefined_data("client")` her müşteri sayfasının ihtiyacını yazar; geri kalanı temanın `hooks.php` dosyası ekler, temaya ait olan tek katman odur.

## Yapı

### Üç Katman

| Katman | Yazan | Oraya ne ait |
| --- | --- | --- |
| Görünüm ortamı | `View::render()`, admin paneli dahil her sayfada | Dil, yazım yönü, varlık adresleri, tema ayarları |
| Müşteri içeriği | `set_predefined_data("client")`, her müşteri controller'ından | Marka, menüler, para birimi, sepet, oturum durumu, sözleşme bağlantıları |
| Tema verisi | `hooks.php`, `filter:template.variables` üzerinden | Sadece bu temanın ihtiyaç duyduğu, çekirdek değerlerden türetilen her şey |

Değerle yanıt veren tek katman tema katmanıdır ve o değer kümeye eklenmez, kümenin tamamının yerine geçer. Dinleyici, kendisine verilen diziyi kendi anahtarlarıyla döndürür; dizi olmayan bir dönüş kümeye dokunmaz.

Sayfa verisi bu üçünün üstünde durur: controller onu `addData()` ile ekler ve yalnız isteyen sayfa alır.

## Referans

### Motorun Her Sayfada Yazdıkları

Bunlar view katmanının tema dalında, kanca çalıştıktan sonra atanır. Bir dinleyici onları silemez. Düz PHP motorunda liste daha dardır. Orada `$cookie_domain`, `$demo_mode` ve `$demo_themes` sadece etiket motoru yolunda yazılır. `$template_dir` temanın adından kurulmuş bir yolu gösterir; o motoru bildiren tema dizinini tema nesnesinden sorar.

- **$template_dir**: Aktif tema dizininin dosya sistemi yolu, sonunda ayraçla. Adres değildir; sadece dosya okumak için kullanın.
- **$tadress**: Tema dizininin adresi. Tercih edilen yol `{asset path='...'}`: `assets/` içini gösterir ve CSS ile JS'e önbellek kırıcı damga ekler.
- **$badress**: Kurulumun taban adresi, sonunda eğik çizgiyle. Bağlı bir alt alan adında bu, ana site değil o hosttur.
- **$sadress**: Hiçbir temaya ait olmayan paylaşılan kaynak dizininin adresi (yüklemeler, ülke simgeleri, eklenti varlıkları).
- **$ui_lang**: Aktif dil kodu. Sayfa oluşturulurken çözülür; geç yapılan bir dil değişimi de yansır.
- **$ui_dir**: Dil paketinden gelen `ltr` ya da `rtl`. html etiketine bunu basın; yönü sabit yazmayın.
- **$cookie_domain**: Bu kurulumun çerezlerinin yazıldığı host kapsamı; tek hostlu kurulumda boştur. Çerez yazan tema JavaScript'i aynı kapsamı kullanmalıdır.
- **$demo_mode · $demo_themes**: Sadece demo kabuğu içindir. Tema listesi demo modu açıkken hesaplanır.
- **$setting**: Bu temanın ayar şemasındaki her alanın kayıtlı değeriyle birleşmiş hâli; kaynağı `Theme::allSettings()`. Renk alanları ayrıca bir `_rgb` ikizi sunar.

### Her Müşteri Sayfasının Eklediği Değişkenler

- **$company_name**: Ticari ad; dil paketinin sabitlerinden gelir, yoksa şirket bilgisi bloğunun ilk satırına düşer.
- **$light_logo_link · $dark_logo_link**: Renk moduna göre site logosu. Müşteri paneli ve fatura belgesi kendi çiftini taşır (`$client_logo_light_link`, `$invoice_logo_light_link` ve koyu ikizleri). Her biri site logosuna düşer.
- **$favicon_link**: Kare marka işareti; kelime logosunun sığmadığı yerler için (daraltılmış ray, uygulama simgesi).
- **$current_year**: Altbilgi telif satırı için içinde bulunulan yıl. View içinde tarih hesaplamayın.
- **$lang_list · $lang_count · $selected_lang_key**: Aktif diller, her dil için hazır bağlantı, dil sayısı ve seçili kodun büyük harfli hâli. Yerleşim onları alternatif dil bağlantısı olarak da gösterir.
- **$currencies · $currencies_count · $selected_currency · $selected_currency_code**: Ziyaretçiye sunulan para birimleri (gizlenenler süzülmüş) ve aktif olan. Değiştirme sunucu turudur: aynı sayfaya `currency` parametresiyle bağlantı verin.
- **$currency_formats_json · $currency_ids_json · $currency_rates_json · $currency_default**: Temanın para betiği için hazır JSON. Her biçim, betiğin o para biriminin ayraçlarını çıkardığı örnek bir dizedir.
- **$header_menu · $footer_menu · $mobile_menu**: Operatörün yönettiği üç menü ağacı. Mobil ağaç boşsa üst menü ağacına düşer.
- **$social_links · $contact_email · $contact_phone**: Sosyal profiller liste olarak; ayrıca yapılandırılmış ilk adres ve numara düz dize olarak, üst ve alt şeritler için.
- **$visibility_cart · $cart_count**: Mağazanın açık olup olmadığı ve anlık kalem sayısı. Sayaç her zaman set edilir; rozet sayfa yenilenmeden görünür kılınabilir.
- **$login_enabled · $registration_enabled · $account_actions_enabled**: Operatörün hesap anahtarları. Üçüncüsü ne giriş ne kayıt mümkünken false olur; hesap menüsüyle sepeti birlikte gizleyen budur.
- **$affiliate_enabled · $reseller_enabled · $only_client_panel**: Hesap menüsü için program anahtarları ve yalnız-panel modu; o modda tema genel siteye dönen bağlantılarını gizler.
- **$is_logged_in · $client_id**: Kanonik oturum işareti ve giriş yapmış kimlik. Her "giriş yapmış mı, misafir mi" dalı bu tek işarete bakar.
- **$privacy_contract_link · $terms_contract_link · $cookie_contract_link**: Operatörün eşlediği sözleşme sayfaları; eşlenmemişse boştur. Boşken ölü bağlantı basmak yerine bağlantıyı gizleyin.
- **$cookie_notice**: Çerez rızası istemi hazır bir yük olarak; rıza kapalıysa boş dizi. Kararı sunucu verir: çerezler tarayıcıdan okunamaz.
- **$notification_count · $notification_count_text**: Zil sayacı ve rozet metni (iki basamağın ötesinde kırpılır). Her zaman set edilir, ama yalnız müşteri kabuğunu isteyen sayfa için sorgulanır.
- **$password_min_length · $password_special_chars · $default_country**: Parola öneri butonu için operatörün parola kuralları; ayrıca telefon ve adres alanlarında son çare olarak sitenin varsayılan ülkesi.
- **$links · $meta · $breadcrumb · $local_l · $show_powered_by**: Sayfa çerçevesi: controller'ın bağlantı haritası, sayfa üstverisi, iz, kurulumun varsayılan dili ve altbilginin platform imzasını basıp basmayacağı.

### Giriş Yapılmış Sayfanın Eklediği Değişkenler

Bunlar yalnız üye giriş yapmışken vardır. Genel bir sayfa bunları `$is_logged_in` ile korumadan okumamalıdır.

- **$account_info · $user_info**: Kabuk için gösterim kimliği (ad, avatar, baş harfler, biçimlenmiş bakiye, destek PIN'i, önceki giriş) ve arkasındaki ham hesap satırı.
- **$announcements**: Hesap kabuğu için operatör duyuruları; dile ve aktif hesabın ülkesine göre süzülmüş olarak gelir.
- **$show_services · $show_domains · $show_invoices · $show_support · $show_sms**: Bölüm görünürlüğü: verilmiş alt kullanıcı izni VE operatörün özellik anahtarı. Ziyaretçinin açamayacağı bölüme bağlantı verilmez.
- **$is_self_account · $switch_accounts**: Aktif hesabın üyenin kendi hesabı olup olmadığı ve geçebileceği hesaplar.
- **$client_badges · $client_badges_text**: Bölüm başına dikkat sayaçları ham sayı olarak, ayrıca rozet metinleri. Ham sayılar erişilebilir adlar için durur; onlar gerçek rakamı söyler.
- **$order_service_link**: "Hizmet satın al" bağlantısının hedefi; alt kullanıcı sipariş veremiyorsa boştur. Kataloğu kapatan bir tema bunu kanca dosyasında ezer.
- **$dashboard_modal · $twofa_required · $password_required**: Pano kapı zinciri. Her yüklemede tek bir diyalog açılır ve hangisi olduğu view'da değil burada adlandırılır.
- **$client_addon_links**: Etkin addon modüllerinin müşteri paneline kattığı sayfalar; her biri ad, adres ve ikon taşır.
- **$verification_required · $verify_link**: Üyenin kimlik doğrulaması beklerken set edilir. Bant yerleşime aittir; kapalı sayfalar için yönlendirme view çalışmadan önce yapılmıştır.

### Bileşik Değerlerin Biçimi

```php
// $lang_list : AKTİF dil başına bir satır, sıralı, kurulumun varsayılan dili başta.
$lang_list = [
    ['rank' => 1, 'local' => 1, 'selected' => true, 'key' => 'en', 'name' => 'English',
     'global-name' => 'English', 'link' => 'https://example.com/home',
     'cc' => 'gb', 'cname' => 'United Kingdom', 'pc' => '44', 'flag-img' => 'https://example.com/resources/assets/images/flags/gb.svg'],
];

// $currencies : aktif ve gizlenmemiş para birimi satırları.
$currencies = [
    ['id' => 1, 'code' => 'USD', 'name' => 'US Dollar', 'prefix' => '$', 'suffix' => '',
     'rate' => '1.00000000', 'local' => 1, 'hidden' => 0],
];

// $social_links : yapılandırılmış her profil için bir giriş.
$social_links = [
    ['name' => 'X', 'url' => 'https://x.com/example', 'icon' => 'bi bi-twitter-x'],
];

// $account_info : biçimlenmiş gösterim kimliği. `balance` sembolüyle birlikte bir DİZEDİR.
$account_info = [
    'name' => 'Ada', 'surname' => 'Lovelace', 'full_name' => 'Ada Lovelace',
    'email' => 'ada@example.com', 'avatar' => '', 'initials' => 'AL',
    'balance' => '$120.00', 'support_pin' => '481625', 'two_factor' => true,
    'is_reseller' => false, 'last_login' => [], 'last_login_date' => '02/08/2026 - 11:40',
    'last_login_ip' => '203.0.113.9', 'last_login_country' => 'GB', 'last_login_city' => 'London',
    'dealership' => [],
];

// $client_badges : ham sayılar; $client_badges_text aynı anahtarları rozet dizesi olarak taşır.
$client_badges = ['invoices' => 2, 'support' => 1, 'domains' => 0, 'services' => 0];

// $cookie_notice : rıza kapalıyken boş dizi.
$cookie_notice = [
    'needs_prompt' => true, 'text' => 'Çerez kullanıyoruz…', 'policy_link' => 'https://example.com/cookie-policy',
    'policy_label' => 'Çerez politikası', 'accept' => 'Kabul Et', 'reject' => 'Reddet',
    'prefs' => 'Tercihler', 'save' => 'Kaydet', 'prefs_title' => 'Çerez Tercihleri',
    'categories' => [
        ['key' => 'necessary', 'label' => 'Zorunlu', 'desc' => '…', 'locked' => true, 'granted' => true],
    ],
    'url' => 'https://example.com/cookie-consent',
];
```

### İmzalar

```php
// Controllers : sayfa ve paket.
public function set_predefined_data(string $type = 'client', array $meta = [], array $breadcrumbs = [], array $links = []): void;
public function addData($k = '', $v = ''): void;
public function getData($key);

// View : render'ın kendisi. $return_output = true HTML'i basmak yerine döndürür.
public function chose($dir, $noTemplate = false): self;
public function render($_name = null, $data = [], $return_output = false, $source = false): mixed;

// Theme : $setting'in arkasındaki ayar haritası ve istek dışında kullanılan bağlamsız render.
public function allSettings(): array;
public function render(string $view, array $data = []): string;
```

## Örnek

Bir müşteri sayfası ve onu geri okuyan view. Controller sadece bu sayfaya ait olanı ekler.

```php
public function page_overview(&$links, &$meta, &$breadcrumbs): string
{
    // set_predefined_data İÇİNDE okunur, bu yüzden çağrıdan ÖNCE set edilmelidir.
    $this->addData("show_client_subnav", true);

    $this->set_predefined_data("client", $meta, $breadcrumbs, $links);

    // Paketin üstüne sayfa verisi. Koşulsuz set edilir: view'ın okuduğu anahtar her
    // render'da var olmalıdır, boş olsa bile; yoksa view tanımsız anahtara düşer.
    $this->addData("recent_orders", $this->model->recent_orders((int) $this->getData("client_id")));

    echo $this->view->chose("website")->render("account/overview", $this->data, true);

    return '';
}
```

```smarty
{* Ortam katmanı: yön ve dil motordan gelir, asla sabit yazılmaz. *}
<section dir="{$ui_dir}" lang="{$ui_lang}">

    {* Müşteri katmanı: yalnız-giriş değerine dokunmadan önce oturum bayrağıyla koru. *}
    {if $is_logged_in}
        <p>{$account_info.full_name} · {$account_info.balance}</p>
        {if $client_badges.invoices > 0}
        <span class="badge">{$client_badges_text.invoices}</span>
        {/if}
    {/if}

    {* Tema katmanı: bu temanın bildirdiği bir ayar, doğrudan $setting'ten okunur. *}
    {if $setting.topbar_enabled}<div class="topbar">{$setting.topbar_text nofilter}</div>{/if}

    {* Sayfa katmanı: default:[] sayesinde boş sayfa satır başına uyarı maliyeti üretmez. *}
    {foreach $recent_orders|default:[] as $order}
        <a href="{link route='invoice-detail' p1=$order.id}">{$order.number}</a>
    {/foreach}
</section>
```

## Tuzaklar

> **Koşul içinde set edilen değişken, o koşulu atlayan sayfalarda yoktur**
> 
> Her global değeri koşulsuz set edin, görünürlüğe view'da karar verin. Yokluk "false" demek değildir: view tanımsız anahtara düşer ve her biri bir günlük yazımına mal olur. Döngü içinde bu, ölçülebilir bir yavaşlamadır.

> **Değişken kancası diziyi birleştirmez, yerine koyar**
> 
> Kendisine verilen dizi dışında bir şey döndüren dinleyici, platformun topladığı bütün anahtarları düşürür ve yerleşim ilk eksik adreste kırılır. Gelen diziden başlayın, üzerine ekleyin, tamamını döndürün.

> **Arka plan sayfası ortamı alır, müşteri paketini almaz**
> 
> Zamanlanmış bir görevden ya da belge üreticisinden kurulan view doğrudan tema nesnesi üzerinden gider. Paketi dolduracak bir controller çalışmamıştır. Sadece ortam katmanı ve tema ayarları oradadır; geri kalanı sayfa verisi olarak geçirilir.

> **Adresler view'da kurulur, değişken olarak paslanmaz**
> 
> Controller, temanın kendi kurabileceği sayfalar için hazır bağlantı dağıtmaz. Bunları bağlantı fonksiyonu ve bir rota anahtarıyla kurun. Bir sayfayı yeniden adlandıran tema için controller değişmez.

## İlgili Makaleler

- [Tema Motoru](https://dev.wisecp.com/tr/tema-motoru)
- [Tema Kancaları ve Çıktı Filtreleri](https://dev.wisecp.com/tr/tema-kancalari-ve-cikti-filtreleri)
- [Tema Ayarları](https://dev.wisecp.com/tr/tema-ayarlari)
- [Menüler ve Navigasyon](https://dev.wisecp.com/tr/menuler-ve-navigasyon)
- [Controller ve Yönlendirme](https://dev.wisecp.com/tr/controller-ve-yonlendirme)
