Şablonlar arasında değişken aktarma
Bu kılavuz, Latte'de değişkenlerin {include}, {import}, {embed},
{layout}, {sandbox} ve diğerleri gibi çeşitli etiketler kullanılarak şablonlar arasında nasıl
aktarıldığını anlatır. Ayrıca {block} ve {define} etiketleri içinde değişkenlerle nasıl
çalışılacağını ve {parameters} etiketinin amacını da öğreneceksiniz.
Değişken tipleri
Latte'deki değişkenler, nasıl ve nerede tanımlandıklarına göre üç kategoriye ayrılabilir:
Girdi değişkenleri, şablona dışarıdan, örneğin bir PHP betiğinden veya {include} gibi bir etiketle
aktarılanlardır.
$latte->render('template.latte', ['userName' => 'Jan', 'userAge' => 30]);
Çevredeki değişkenler, belirli bir etiketin bulunduğu yerde var olan değişkenlerdir. Buna tüm girdi
değişkenleri ile {var}, {default} gibi etiketlerle ya da bir {foreach} döngüsünün
içinde oluşturulan diğer değişkenler dahildir.
{foreach $users as $user}
{include 'userBox.latte', user: $user}
{/foreach}
Açık değişkenler, doğrudan bir etiketin içinde belirtilen ve hedef şablona gönderilenlerdir.
{include 'userBox.latte', name: $user->name, age: $user->age}
{block}
{block} etiketi, kalıtım alan şablonlarda özelleştirilebilen veya genişletilebilen, yeniden kullanılabilir
kod blokları tanımlamaya yarar. Bloktan önce tanımlanan çevredeki değişkenler bloğun içinde erişilebilirdir, ama
değişkenlerdeki her değişiklik yalnızca o bloğun içinde yansır.
{var $foo = 'original'}
{block example}
{var $foo = 'modified'}
{/block}
{$foo} // çıktı: original
{define}
{define} etiketi, yalnızca {include} ile çağrıldıklarında render edilen bloklar oluşturmaya
yarar. Bu blokların içinde erişilebilen değişkenler, tanımda parametre bildirilip bildirilmediğine bağlıdır.
Bildirilmiş parametreleri olan bir blok hem o parametrelere hem de tanımlandığı şablonun tüm girdi değişkenlerine
erişebilir. Parametresiz bir blok da o girdi değişkenlerine erişebilir. Hiçbir durumda çevredeki değişkenler
erişilebilir değildir.
{define hello}
{* şablonun tüm girdi değişkenlerine erişebilir *}
{/define}
{define hello $name}
{* $name parametresine ve girdi değişkenlerine erişebilir *}
{/define}
{parameters}
{parameters} etiketi, beklenen girdi değişkenlerini şablonun başında açıkça bildirmeye yarar. Böylece
beklenen değişkenleri ve veri tiplerini kolayca belgeleyebilirsiniz. Varsayılan değerler tanımlamak da mümkündür.
{parameters int $age, string $name = 'unknown'}
<p>Age: {$age}, Name: {$name}</p>
{include file}
{include file} etiketi, bir şablonun tamamını eklemeye yarar. Bu şablona hem etiketin kullanıldığı
şablonun girdi değişkenleri hem de açıkça tanımlanan değişkenler aktarılır. Ancak hedef şablon, kapsamı
{parameters} ile sınırlayabilir.
{include 'profile.latte', userId: $user->id}
{include block}
Aynı şablonda tanımlanmış bir blok eklenirken, ona tüm çevredeki ve açıkça tanımlanan değişkenler aktarılır:
{define blockName}
<p>Name: {$name}, Age: {$age}</p>
{/define}
{var $name = 'Jan', $age = 30}
{include blockName}
Bu örnekte $name ve $age değişkenleri blockName bloğuna aktarılır. Aynı
davranış {include parent} için de geçerlidir.
Başka bir şablondan blok eklenirken yalnızca girdi değişkenleri ve açıkça tanımlanan değişkenler aktarılır. Çevredeki değişkenler otomatik olarak erişilebilir değildir.
{include blockInOtherTemplate, name: $name, age: $age}
{layout} veya {extends}
Bu etiketler, alt şablonun girdi değişkenlerinin ve bloklardan önceki kodda oluşturulan değişkenlerin aktarıldığı bir layout tanımlar:
{layout 'layout.latte'}
{var $seo = 'index, follow'}
layout.latte şablonu:
<head>
<meta name="robots" content="{$seo}">
</head>
{embed}
{embed} etiketi {include} etiketine benzer, ama şablona blok gömmeyi sağlar.
{include}'un aksine yalnızca açıkça bildirilen değişkenler aktarılır:
{embed 'menu.latte', items: $menuItems}
{/embed}
Bu örnekte menu.latte şablonu yalnızca $items değişkenine erişebilir.
Buna karşılık {embed} içindeki bloklar tüm çevredeki değişkenlere erişebilir:
{var $name = 'Jan'}
{embed 'menu.latte', items: $menuItems}
{block foo}
{$name}
{/block}
{/embed}
{import}
{import} etiketi, başka şablonlardan blok yüklemeye yarar. İçe aktarılan bloklara hem girdi değişkenleri
hem de açıkça bildirilen değişkenler aktarılır.
{import 'buttons.latte'}
{sandbox}
{sandbox} etiketi, güvenli işleme için şablonu yalıtır. Değişkenler yalnızca açıkça aktarılır.
{sandbox 'secure.latte', data: $secureData}