Şablon Değişkenleri
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.
{asset path='...'}: assets/ içini gösterir ve CSS ile JS'e önbellek kırıcı damga ekler.
ltr ya da rtl. html etiketine bunu basın; yönü sabit yazmayın.
Theme::allSettings(). Renk alanları ayrıca bir _rgb ikizi sunar.
Her Müşteri Sayfasının Eklediği Değişkenler
$client_logo_light_link, $invoice_logo_light_link ve koyu ikizleri). Her biri site logosuna düşer.
currency parametresiyle bağlantı verin.
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.
Bileşik Değerlerin Biçimi
// $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' => '[email protected]', '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
// 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.
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 '';
}
{* 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
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.
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.
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.
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
Geri bildiriminiz için teşekkürler!
Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.