# View ve Şablonlar

https://dev.wisecp.com/tr/view-ve-sablonlar

Controller adlandırılmış değerler toplar ve şablon adıyla birlikte view'a verir. Şablon o adları değişken olarak okur ve sayfayı gösterir.

## Genel Bakış

Sayfa üretmek iki çağrıdır. `chose()` şablon dizinini seçer; `render()` o dizindeki bir şablonu o ana kadar toplanan veriyle çalıştırır. Veri şablona anahtar adlarını taşıyan sıradan değişkenler olarak ulaşır; yani bir şablon kendisi için hiçbir şey çekmez.

Yönetim panelinin şablonları düz PHP'dir ve ürünle gelir. Sitenin şablonları bir temaya aittir ve aynı çağrı sabit bir dizin yerine etkin temayı çözer.

## Referans

### İmzalar

Beşi de instance metodudur. Controller içinde instance `$this->view`, başka her yerde tekil nesne `View::$init`'tir.

```php
public function chose($dir, $noTemplate = false): self;
public function render($_name = null, $data = [], $return_output = false, $source = false): mixed;

public function get_template_dir($type = 'website'): string;   // TEMPLATE_DIR . $type . DS
public function get_template_url($type = 'website'): string;   // APP_URI . "/templates/{$type}/"
public function get_resources_url($str = '', $l_slash = true, $r_slash = false): string;
```

### `render()` Metodunun Dört Parametresi

- **$_name**: Seçili dizine göreli şablon yolu, **uzantısız**: `'widgets/list'` → `templates/admin/widgets/list.php`. Dosya yoksa hata fırlatmaz, boş dize döner.
- **$data**: Şablon çalışmadan önce değişkenlere çıkarılan anahtar/değer haritası. Controller'ın topladığı veriyi geçin: `$this->data`. Dizi olmayan her değer boş kabul edilir.
- **$return_output**: `false` işaretlemeyi gösterir ve boş dize döndürür; `true` onun yerine işaretlemeyi döndürür. Sayfa metodu sayfasını döndürdüğü için `true` geçer.
- **$source**: `true` dosyayı dahil eder ve **dosyanın döndürdüğü değeri** verir, hiçbir şey basmaz. Aslında bir veri dosyası olan (dizi döndüren) şablon böyle okunur. Dosya yoksa `false`.

### chose() Neyi Kabul Eder

| Argüman | Çözümlenen | Ne zaman |
| --- | --- | --- |
| `'admin'` | `templates/admin/`, düz PHP | Her yönetim ekranı |
| `'website'` | Etkin temanın dizini ve motoru | Ziyaretçi isteği. Yönetim ya da cron bağlamında düz PHP olarak `templates/website/` dizinine düşer |
| `'system'` | `templates/system/`, düz PHP | Ölümcül hata, bakım, fatura belgesi |
| `$noTemplate = true` ile herhangi bir yol | Yolun kendisi, olduğu gibi | Kendi şablon dizinini kullanan modül |

### Veri Şablona Nasıl Ulaşır

Controller'ın eklediği değerler, şablon çalışmadan önce değişkenlere çıkarılır. `rows` adıyla eklenen bir değer `$rows` olarak okunur. Bunların üstüne view her çağrıya kendi beş değişkenini ekler:

- **$template_dir**: Seçili dizinin dosya sistemi yolu, sonunda ayraçla. Bir şablonun başka bir şablonu nerede olduğunu bilmeden dahil edebilmesini sağlayan budur.
- **$ui_lang**: Bu istek için çözülen dil, örn. `'tr'`. Yalnız controller zaten vermemişse set edilir.
- **$ui_dir**: O dilin yazım yönü: `'ltr'` ya da `'rtl'`. Kök elemana bunu basın, yönü asla sabit yazmayın.
- **$badress, $tadress, $sadress**: Kurulumun, seçili şablon dizininin ve paylaşılan kaynak dizininin adresi. Varlık bağlantılarında URL'i elle birleştirmek yerine bunları kullanın.
- **$setting**: Yalnız temalı site sayfalarında: etkin temanın birleştirilmiş ayarları, şema varsayılanları dahil. Yönetim ve sistem şablonlarında yoktur.

## Örnek

İki yarı bir arada: controller değerleri adlandırır, şablon tam o adları geri okur.

```php
public function page_list(&$links, &$meta, &$breadcrumbs): string
{
    $this->addData('rows', $this->model->list());
    $this->addData('total', $this->model->list(true));

    // Üçüncü argüman true: işaretlemeyi basmak yerine döndür, çünkü sayfa
    // metodunun işi render edilmiş sayfayı DÖNDÜRMEKTİR.
    return $this->view->chose('admin')->render('widgets/list', $this->data, true);
}
```

```php
<?php if (!defined("CORE_DIR")) exit(); ?>

<h1><?= Language::g("widgets-title") ?> (<?= (int) ($total ?? 0) ?>)</h1>

<?php foreach (($rows ?? []) as $row): ?>
    <div class="card">
        <span><?= htmlspecialchars($row['name'] ?? '') ?></span>
    </div>
<?php endforeach; ?>

<?php include $template_dir . "inc" . DS . "footer.php"; ?>
```

Basmak yerine veri döndüren bir şablonu okumak ve arka plan işinden tema view'i üretmek:

```php
// $source = true: dosyanın kendi dönüş değeri geri gelir, hiçbir şey basılmaz.
$columns = View::$init->chose('admin')->render('tables/widgetList', [], false, true);

// Ziyaretçi isteği dışında (cron, mail, PDF) chose('website') temayı ÇÖZMEZ.
// Motoru ve dizini bağlamdan bağımsız çözen temanın kendisine sorun.
$html = Theme::active()->render('account/invoice-pdf', ['invoice' => $invoice]);
```

## Tuzaklar

> **İnsanın yazdığı her şeyi kaçırın**
> 
> Admin şablonu otomatik kaçış yapmayan düz PHP'dir. Bir formdan, API'den ya da uzak bir sağlayıcıdan gelen değer geldiği gibi görünür. Kaçırmak sizin işiniz.

> **Arka plan işi temayı chose('website') ile seçemez**
> 
> Ziyaretçi isteği dışında tema çözümü atlanır ve çağrı düz PHP yoluna düşer. Temada olmayan bir `.php` dosyası arar, **hatasız biçimde boş dize** döndürür. Bunun yerine görünümü tema nesnesi üzerinden üretin.

> **Şablon doğrudan girilmeyi reddeder**
> 
> Her şablon, uygulamanın sabitleri yoksa çıkarak başlar. O satır olmadan dosya, oturumsuz, izinsiz ve verisiz bir sayfa parçasını çalıştıran bir adrestir.

> **Her anahtarı varsayılanla okuyun**
> 
> Döngü içindeki eksik bir anahtar satır başına bir uyarı üretir ve her uyarı bir disk yazımıdır. Bir liste şablonunda bu, hızlı sayfa ile yavaş sayfa arasındaki farktır.

## İlgili Makaleler

- [Controller ve Yönlendirme](https://dev.wisecp.com/tr/controller-ve-yonlendirme)
- [Arayüz Bileşenleri](https://dev.wisecp.com/tr/arayuz-bilesenleri)
- [Şablon Değişkenleri](https://dev.wisecp.com/tr/sablon-degiskenleri)
- [Hata Yönetimi](https://dev.wisecp.com/tr/hata-yonetimi)
