Nette Documentation Preview

syntax
Latte Etiketleri
****************

.[perex]
Tüm Latte yerleşik etiketlerinin özeti ve açıklaması.

.[table-latte-tags language-latte]
|## Baskı
| `{$var}`, `{...}` veya `{=...}` | [öncelenmiş bir değişken veya ifade yazdırır |#printing]
| `{$var\|filter}` | [filtrelerle yazdırır |#filters]
| `{l}` veya `{r}` | `{` or `}` karakterini yazdırır

.[table-latte-tags language-latte]
|## Koşullar
| `{if}`... `{elseif}`... `{else}`... `{/if}` | [eğer koşulu |#if-elseif-else]
| `{ifset}`... `{elseifset}`... `{/ifset}` | [koşul ifset |#ifset-elseifset]
| `{ifchanged}`... `{/ifchanged}` | [bir değişiklik olup olmadığını test edin|#ifchanged]
| `{switch}` `{case}` `{default}` `{/switch}` | [koşul anahtarı |#switch-case-default]
| `n:else` | [koşullar için alternatif içerik |#n:else]

.[table-latte-tags language-latte]
|## Döngüler
| `{foreach}`... `{/foreach}` | [foreach |#foreach]
| `{for}`... `{/for}` | [için |#for]
| `{while}`... `{/while}` | [while |#while]
| `{continueIf $cond}` | [sonraki yinelemeye devam et|#continueif-skipif-breakif]
| `{skipIf $cond}` | [geçerli döngü yinelemesini atla |#continueif-skipif-breakif]
| `{breakIf $cond}` | [döngüyü kırar |#continueif-skipif-breakif]
| `{exitIf $cond}` | [erken çıkış |#exitif]
| `{first}`... `{/first}` | [bu ilk y ineleme mi?|#first-last-sep]
| `{last}`... `{/last}` | [bu son yineleme mi?|#first-last-sep]
| `{sep}`... `{/sep}` | [bir sonraki yineleme takip edecek mi?|#first-last-sep]
| `{iterateWhile}`... `{/iterateWhile}` | [yapılandırılmış foreach |#iterateWhile]
| `$iterator` | [foreach döngüsü içinde özel değişken |#$iterator]

.[table-latte-tags language-latte]
|## Diğer Şablonları Dahil Etme
| `{include 'file.latte'}` | [başka bir dosyadan şablon içerir |#include]
| `{sandbox 'file.latte'}` | [sandbox modunda bir şablon içerir |#sandbox]

.[table-latte-tags language-latte]
|## Bloklar, düzenler, şablon kalıtımı
| `{block}` | [anonim blok |#block]
| `{block blockname}` | [blok tanımı |template-inheritance#blocks]
| `{define blockname}` | [gelecekteki kullanım için blok tanımı |template-inheritance#definitions]
| `{include blockname}` | [blok yazdırır |template-inheritance#printing-blocks]
| `{include blockname from 'file.latte'}` | [dosyadan bir blok yazdırır |template-inheritance#printing-blocks]
| `{import 'file.latte'}` | [blokları başka bir şablondan yükler |template-inheritance#horizontal-reuse]
| `{layout 'file.latte'}` / `{extends}` | [bir düzen dosyası belirtir |template-inheritance#layout-inheritance]
| `{embed}`... `{/embed}` | [şablonu veya bloğu yükler ve blokların üzerine yazmanıza izin verir |template-inheritance#unit-inheritance]
| `{ifset blockname}`... `{/ifset}` | [blok tanımlanmışsa koşul |template-inheritance#checking-block-existence]

.[table-latte-tags language-latte]
|## İstisna işleme
| `{try}`... `{else}`... `{/try}` | [istisnaları yakalama |#try]
| `{rollback}` | [deneme bloğunu atar |#rollback]

.[table-latte-tags language-latte]
|## Değişkenler
| `{var $foo = value}` | [değişken oluşturma |#var-default]
| `{default $foo = value}` | [değişken bildirilmediğinde varsayılan değer |#var-default]
| `{parameters}` | [değişkenleri bildirir, varsayılan değerleri yazar|#parameters]
| `{capture}`... `{/capture}` | [bir bölümü bir değişkene kaydeder|#capture]

.[table-latte-tags language-latte]
|## Türleri
| `{varType}` | [değişkenin türünü bildirir |type-system#varType]
| `{varPrint}` | [değişken türlerini önerir |type-system#varPrint]
| `{templateType}` | [sınıf kullanarak değişken türlerini bildirir |type-system#templateType]
| `{templatePrint}` | [özellikli sınıf oluşturur |type-system#templatePrint]

.[table-latte-tags language-latte]
|## Çeviri
| `{_string}` | [çevrilmiş olarak yazdırır |#Translation]
| `{translate}`... `{/translate}` | [içeriği çevirir |#Translation]

.[table-latte-tags language-latte]
|## Diğerleri
| `{contentType}` | [kaçış modunu değiştirir ve HTTP başlığı gönderir |#contenttype]
| `{debugbreak}` | [koda kesme noktası koyar |#debugbreak]
| `{do}` | [bir ifadeyi yazdırmadan değerlendirir |#do]
| `{dump}` | [değişkenleri Tracy Bar'a döker |#dump]
| `{php}` | [herhangi bir PHP kodunu çalıştırır |#php]
| `{spaceless}`... `{/spaceless}` | [gereksiz boşlukları kaldırır |#spaceless]
| `{syntax}` | [çalışma zamanında sözdizimini değiştirir |#syntax]
| `{trace}` | [yığın izini gösterir |#trace]

.[table-latte-tags language-latte]
|## HTML etiketi yardımcıları
| `n:class` | [akıllı sınıf niteliği |#n:class]
| `n:attr` | [akıllı HTML nitelikleri |#n:attr]
| `n:tag` | [HTML öğesinin dinamik adı |#n:tag]
| `n:ifcontent` | [Boş HTML etiketini atlayın |#n:ifcontent]

.[table-latte-tags language-latte]
|## Yalnızca Nette Framework'te kullanılabilir
| `n:href` | [`<a>` HTML öğelerindeki bağlantı |application:creating-links#In the Presenter Template]
| `{link}` | [bir bağlantı yazdırır |application:creating-links#In the Presenter Template]
| `{plink}` | [sunum yapan kişiye bir bağlantı yazdırır |application:creating-links#In the Presenter Template]
| `{control}` | [bir bileşen yazdırır |application:components#Rendering]
| `{snippet}`... `{/snippet}` | [AJAX ile gönderilebilecek bir şablon parçacığı |application:ajax#snippets-in-latte]
| `{snippetArea}` | [snippets zarfı |application:ajax#snippet-areas]
| `{cache}`... `{/cache}` | [bir şablon bölümünü önbelleğe alır|caching:#caching-in-latte]

.[table-latte-tags language-latte]
|## Sadece Nette Forms ile kullanılabilir
| `{form}`... `{/form}` | [bir form öğesi yazdırır |forms:rendering#form]
| `{label}`... `{/label}` | [bir form giriş etiketi yazdırır |forms:rendering#label-input]
| `{input}` | [bir form giriş öğesi yazdırır |forms:rendering#label-input]
| `{inputError}` | [form giriş öğesi için hata mesajı yazdırır |forms:rendering#inputError]
| `n:name` | [bir HTML giriş öğesini etkinleştirir |forms:rendering#n:name]
| `{formContainer}`... `{/formContainer}` | [form kapsayıcısını oluşturma |forms:rendering#special-cases]


Baskı .[#toc-printing]
======================


`{$var}` `{...}` `{=...}`
-------------------------

Latte, herhangi bir ifadeyi çıktıya yazdırmak için `{=...}` etiketini kullanır. Eğer ifade bir değişken veya fonksiyon çağrısı ile başlıyorsa, eşittir işareti yazmaya gerek yoktur. Bu da pratikte neredeyse hiçbir zaman yazılmasına gerek olmadığı anlamına gelir:

```latte
Name: {$name} {$surname}<br>
Age: {date('Y') - $birth}<br>
```

PHP'den bildiğiniz her şeyi bir ifade olarak yazabilirsiniz. Sadece yeni bir dil öğrenmek zorunda değilsiniz. Örneğin:


```latte
{='0' . ($num ?? $num * 3) . ', ' . PHP_VERSION}
```

Lütfen önceki örnekte herhangi bir anlam aramayın, ancak orada bir anlam bulursanız bize yazın :-)


Çıkıştan Kaçış .[#toc-escaping-output]
--------------------------------------

Bir şablon sisteminin en önemli görevi nedir? Güvenlik açıklarını önlemek. Ve çıktıya bir şey yazdırdığınızda Latte tam olarak bunu yapar. Her şeyi otomatik olarak kaçar:

```latte
<p>{='one < two'}</p>   {* prints: '<p>one &lt; two</p>' *}
```

Kesin olmak gerekirse, Latte bağlama duyarlı kaçış kullanır, bu o kadar önemli ve benzersiz bir özelliktir ki [ona ayrı bir bölüm |safety-first#context-aware-escaping] ayırdık.

Peki ya güvenilir bir kaynaktan HTML kodlu içerik yazdırıyorsanız? O zaman kaçış özelliğini kolayca kapatabilirsiniz:

```latte
{$trustedHtmlString|noescape}
```

.[warning]
`noescape` filtresinin yanlış kullanımı bir XSS güvenlik açığına yol açabilir! Ne yaptığınızdan ve yazdırdığınız dizenin güvenilir bir kaynaktan geldiğinden **kesinlikle emin** değilseniz asla kullanmayın.


JavaScript'te Yazdırma .[#toc-printing-in-javascript]
-----------------------------------------------------

Bağlama duyarlı kaçış sayesinde, JavaScript içindeki değişkenleri yazdırmak son derece kolaydır ve Latte bunları düzgün bir şekilde kaçacaktır.

Değişken bir dize olmak zorunda değildir, herhangi bir veri türü desteklenir ve daha sonra JSON olarak kodlanır:

```latte
{var $foo = ['hello', true, 1]}
<script>
	alert({$foo});
</script>
```

Üretir:

```latte
<script>
	alert(["hello", true, 1]);
</script>
```

Bu aynı zamanda **değişkeni tırnak içine almayın** nedenidir: Latte bunları dizelerin etrafına ekler. Ve bir dize değişkenini başka bir dizenin içine koymak istiyorsanız, bunları birleştirmeniz yeterlidir:

```latte
<script>
	alert('Hello ' + {$name} + '!');  // OK

	alert({="Hello $name!"});         // OK

	alert('Hello {$name} !');         // ERROR!
</script>
```


Filtreler .[#toc-filters]
-------------------------

Yazdırılan ifade [filtrelerle |syntax#filters] değiştirilebilir. Örneğin, bu örnek dizeyi büyük harfe dönüştürür ve en fazla 30 karakter olacak şekilde kısaltır:

```latte
{$string|upper|truncate:30}
```

Ayrıca, bir ifadenin bölümlerine aşağıdaki gibi filtreler uygulayabilirsiniz:

```latte
{$left . ($middle|upper) . $right}
```


Koşullar .[#toc-conditions]
===========================


`{if}` `{elseif}` `{else}`
--------------------------

Koşullar PHP'deki benzerleriyle aynı şekilde davranır. PHP'den bildiğiniz ifadeleri kullanabilirsiniz, yeni bir dil öğrenmek zorunda değilsiniz.

```latte
{if $product->inStock > Stock::Minimum}
	In stock
{elseif $product->isOnWay()}
	On the way
{else}
	Not available
{/if}
```

Herhangi bir çift etiketi gibi, bir `{if} ... {/ if}` çifti de örneğin [n:attribute |syntax#n:attributes] şeklinde yazılabilir:

```latte
<p n:if="$count > 0">In stock {$count} items</p>
```

n:attributes öğesine `tag-` önekini ekleyebileceğinizi biliyor musunuz? Bu durumda koşul yalnızca HTML etiketlerini etkileyecek ve aralarındaki içerik her zaman yazdırılacaktır:

```latte
<a href="..." n:tag-if="$clickable">Hello</a>

{* prints 'Hello' when $clickable is falsey *}
{* prints '<a href="...">Hello</a>' when $clickable is truthy *}
```

Güzel.


`n:else` .{data-version:3.0.11}
-------------------------------

 `{if} ... {/if}` koşulunu bir [n:niteliği |syntax#n:attributes] biçiminde yazarsanız, `n:else` adresini kullanarak alternatif bir dal belirtme seçeneğiniz vardır:

```latte
<strong n:if="$count > 0">In stock {$count} items</strong>

<em n:else>not available</em>
```

 `n:else` özniteliği aşağıdakilerle birlikte de kullanılabilir [`n:ifset` |#ifset-elseifset], [`n:foreach` |#foreach], [`n:try` |#try], [`n:ifcontent` |#n:ifcontent]ve [`n:ifchanged` |#ifchanged].


`{/if $cond}`
-------------

`{if}` koşulundaki ifadenin end etiketinde de belirtilebilmesi sizi şaşırtabilir. Bu, etiket açıldığında koşulun değerini henüz bilmediğimiz durumlarda kullanışlıdır. Buna ertelenmiş karar diyelim.

Örneğin, veritabanından kayıtları içeren bir tabloyu listelemeye başlıyoruz ve ancak raporu tamamladıktan sonra veritabanında kayıt olmadığını fark ediyoruz. Bu yüzden `{/if}` son etiketine koşul koyarız ve eğer kayıt yoksa hiçbiri yazdırılmaz:

```latte
{if}
	<h1>Printing rows from the database</h1>

	<table>
	{foreach $resultSet as $row}
		...
	{/foreach}
	</table>
{/if isset($row)}
```

Kullanışlı, değil mi?

Ertelenmiş koşulda `{else}` adresini de kullanabilirsiniz, ancak `{elseif}` adresini kullanamazsınız.


`{ifset}` `{elseifset}`
-----------------------

.[note]
Ayrıca bakınız [`{ifset block}` |template-inheritance#checking-block-existence]

Bir değişkenin (veya birden fazla değişkenin) var olup olmadığını ve boş olmayan bir değere sahip olup olmadığını belirlemek için `{ifset $var}` koşulunu kullanın. Aslında PHP'deki `if (isset($var))` ile aynıdır. Herhangi bir çift etiketi gibi, bu da [n:attribute |syntax#n:attributes] şeklinde yazılabilir, bu yüzden örnek olarak gösterelim:

```latte
<meta name="robots" content={$robots} n:ifset="$robots">
```


`{ifchanged}`
-------------

`{ifchanged}` Döngüdeki (foreach, for veya while) son yinelemeden bu yana bir değişkenin değerinin değişip değişmediğini kontrol eder.

Etikette bir veya daha fazla değişken belirtirsek, bunlardan herhangi birinin değişip değişmediğini kontrol eder ve içeriği buna göre yazdırır. Örneğin, aşağıdaki örnek isimleri listelerken her değiştiğinde bir ismin ilk harfini başlık olarak yazdırır:

```latte
{foreach ($names|sort) as $name}
	{ifchanged $name[0]} <h2>{$name[0]}</h2> {/ifchanged}

	<p>{$name}</p>
{/foreach}
```

Ancak, herhangi bir argüman verilmezse, işlenen içeriğin kendisi önceki durumuna göre kontrol edilecektir. Bu, önceki örnekte etiketteki argümanı güvenli bir şekilde atlayabileceğimiz anlamına gelir. Ve tabii ki [n:attribute |syntax#n:attributes] da kullanabiliriz:

```latte
{foreach ($names|sort) as $name}
	<h2 n:ifchanged>{$name[0]}</h2>

	<p>{$name}</p>
{/foreach}
```

Ayrıca `{ifchanged}` içine bir `{else}` cümlesi de ekleyebilirsiniz.


`{switch}` `{case}` `{default}`
-------------------------------
Değeri birden fazla seçenekle karşılaştırır. Bu, PHP'den bildiğiniz `switch` yapısına benzer. Ancak Latte bunu geliştirir:

- katı karşılaştırma kullanır (`===`)
- ihtiyaç duymaz `break`

Yani PHP 8.0 ile birlikte gelen `match` yapısının tam karşılığıdır.

```latte
{switch $transport}
	{case train}
		By train
	{case plane}
		By plane
	{default}
		Differently
{/switch}
```

Madde `{case}` virgülle ayrılmış birden fazla değer içerebilir:

```latte
{switch $status}
{case $status::New}<b>new item</b>
{case $status::Sold, $status::Unknown}<i>not available</i>
{/switch}
```


Döngüler .[#toc-loops]
======================

Latte'de PHP'den bildiğiniz tüm döngüler mevcuttur: foreach, for ve while.


`{foreach}`
-----------

Döngüyü PHP'deki ile tamamen aynı şekilde yazarsınız:

```latte
{foreach $langs as $code => $lang}
	<span>{$lang}</span>
{/foreach}
```

Buna ek olarak, şimdi bahsedeceğimiz bazı kullanışlı ince ayarlar var.

Örneğin, Latte oluşturulan değişkenlerin yanlışlıkla aynı isimli global değişkenlerin üzerine yazılmadığını kontrol eder. Bu, `$lang` adresinin sayfanın geçerli dili olduğunu varsaydığınızda ve `foreach $langs as $lang` adresinin bu değişkenin üzerine yazıldığını fark etmediğinizde sizi kurtaracaktır.

foreach döngüsü de [n:attribute |syntax#n:attributes] ile çok zarif ve ekonomik bir şekilde yazılabilir:

```latte
<ul>
	<li n:foreach="$items as $item">{$item->name}</li>
</ul>
```

`inner-` ön ekini n:attributes öğesinin önüne ekleyebileceğinizi biliyor muydunuz? Artık sadece elemanın iç kısmı döngüde tekrarlanacaktır:

```latte
<div n:inner-foreach="$items as $item">
	<h4>{$item->title}</h4>
	<p>{$item->description}</p>
</div>
```

Yani şöyle bir şey yazdırıyor:

```latte
<div>
	<h4>Foo</h4>
	<p>Lorem ipsum.</p>
	<h4>Bar</h4>
	<p>Sit dolor.</p>
</div>
```


`{else}` .{toc: foreach-else}
-----------------------------

`foreach` döngüsü, verilen dizi boşsa metni görüntülenen isteğe bağlı bir `{else}` cümlesi alabilir:

```latte
<ul>
	{foreach $people as $person}
		<li>{$person->name}</li>
	{else}
		<li><em>Sorry, no users in this list</em></li>
	{/foreach}
</ul>
```


`$iterator`
-----------

`foreach` döngüsü içinde `$iterator` değişkeni başlatılır. Mevcut döngü hakkında önemli bilgiler tutar.

- `$iterator->first` - bu ilk yineleme mi?
- `$iterator->last` - bu son yineleme mi?
- `$iterator->counter` - yineleme sayacı, 1'den başlar
- `$iterator->counter0` - yineleme sayacı, 0'dan başlar
- `$iterator->odd` - bu yineleme tek mi?
- `$iterator->even` - bu yineleme çift mi?
- `$iterator->parent` - mevcut olanı çevreleyen yineleyici
- `$iterator->nextValue` - döngüdeki bir sonraki öğe
- `$iterator->nextKey` - döngüdeki bir sonraki öğenin anahtarı


```latte
{foreach $rows as $row}
	{if $iterator->first}<table>{/if}

	<tr id="row-{$iterator->counter}">
		<td>{$row->name}</td>
		<td>{$row->email}</td>
	</tr>

	{if $iterator->last}</table>{/if}
{/foreach}
```

Latte akıllıdır ve `$iterator->last` yalnızca diziler için değil, aynı zamanda döngü öğe sayısının önceden bilinmediği genel bir yineleyici üzerinde çalıştığında da çalışır.


`{first}` `{last}` `{sep}`
--------------------------

Bu etiketler `{foreach}` döngüsü içinde kullanılabilir. İlk geçiş için `{first}` içeriği işlenir.
`{last}` içeriği ... tahmin edebilir misiniz? Evet, son geçiş için. Bunlar aslında `{if $iterator->first}` ve `{if $iterator->last}` için kısayollardır.

Etiketler [n:attributes |syntax#n:attributes] şeklinde de yazılabilir:

```latte
{foreach $rows as $row}
	{first}<h1>List of names</h1>{/first}

	<p>{$row->name}</p>

	<hr n:last>
{/foreach}
```

Yineleme son değilse `{sep}` içeriği işlenir, bu nedenle listelenen öğeler arasındaki virgüller gibi sınırlayıcıları yazdırmak için uygundur:

```latte
{foreach $items as $item} {$item} {sep}, {/sep} {/foreach}
```

Bu oldukça pratik, değil mi?


`{iterateWhile}`
----------------

Bir koşul sağlanana kadar iç içe bir döngüde yineleme yaparak foreach döngüsünde yineleme sırasında doğrusal verilerin gruplanmasını basitleştirir. [Ayrıntılı talimatları okuyun |cookbook/grouping].

Ayrıca yukarıdaki örnekte `{first}` ve `{last}` adreslerini zarif bir şekilde değiştirebilir:

```latte
{foreach $rows as $row}
	<table>

	{iterateWhile}
	<tr id="row-{$iterator->counter}">
		<td>{$row->name}</td>
		<td>{$row->email}</td>
	</tr>
	{/iterateWhile true}

	</table>
{/foreach}
```

Ayrıca bkz. [toplu |filters#batch] iş ve [grup |filters#group] filtreleri.


`{for}`
-------

Döngüyü PHP'deki ile tamamen aynı şekilde yazıyoruz:

```latte
{for $i = 0; $i < 10; $i++}
	<span>Item #{$i}</span>
{/for}
```

Etiket [n:attribute |syntax#n:attributes] şeklinde de yazılabilir:

```latte
<h1 n:for="$i = 0; $i < 10; $i++">{$i}</h1>
```


`{while}`
---------

Yine, döngüyü PHP'deki ile tamamen aynı şekilde yazıyoruz:

```latte
{while $row = $result->fetch()}
	<span>{$row->title}</span>
{/while}
```

Ya da [n:attribute |syntax#n:attributes] olarak:

```latte
<span n:while="$row = $result->fetch()">
	{$row->title}
</span>
```

Son etiketinde bir koşul bulunan bir varyant PHP'deki do-while döngüsüne karşılık gelir:

```latte
{while}
	<span>{$item->title}</span>
{/while $item = $item->getNext()}
```


`{continueIf}` `{skipIf}` `{breakIf}`
-------------------------------------

Herhangi bir döngüyü kontrol etmek için kullanabileceğiniz özel etiketler vardır - `{continueIf ?}` ve `{breakIf ?}`, koşullar karşılandığında sırasıyla bir sonraki yinelemeye atlar ve döngüyü sonlandırır:

```latte
{foreach $rows as $row}
	{continueIf $row->date < $now}
	{breakIf $row->parent === null}
	...
{/foreach}
```


`{skipIf}` etiketi `{continueIf}` etiketine çok benzer, ancak sayacı artırmaz. Böylece `$iterator->counter` adresini yazdırdığınızda ve bazı öğeleri atladığınızda numaralandırmada delikler oluşmaz. Ayrıca tüm öğeleri atladığınızda {else} cümlesi oluşturulacaktır.

```latte
<ul>
	{foreach $people as $person}
		{skipIf $person->age < 18}
		<li>{$iterator->counter}. {$person->name}</li>
	{else}
		<li><em>Sorry, no adult users in this list</em></li>
	{/foreach}
</ul>
```


`{exitIf}` .{data-version:3.0.5}
--------------------------------

Bir koşul karşılandığında bir şablonun veya bloğun oluşturulmasını sonlandırır (yani "erken çıkış").

```latte
{exitIf !$messages}

<h1>Messages</h1>
<div n:foreach="$messages as $message">
   {$message}
</div>
```


Şablonlar Dahil .[#toc-including-templates]
===========================================


`{include 'file.latte'}` .{toc: include}
----------------------------------------

.[note]
Ayrıca bakınız [`{include block}` |template-inheritance#printing-blocks]

`{include}` etiketi belirtilen şablonu yükler ve işler. Favori PHP dilimizde bu şuna benzer:

```php
<?php include 'header.phtml'; ?>
```

Dahil edilen şablonların aktif bağlamın değişkenlerine erişimi yoktur, ancak global değişkenlere erişimi vardır.

Eklenen şablona değişkenleri aşağıdaki şekilde aktarabilirsiniz:

```latte
{include 'template.latte', foo: 'bar', id: 123}
```

Şablon adı herhangi bir PHP ifadesi olabilir:

```latte
{include $someVar}
{include $ajax ? 'ajax.latte' : 'not-ajax.latte'}
```

Eklenen içerik [filtreler |syntax#filters] kullanılarak değiştirilebilir. Aşağıdaki örnek tüm HTML öğelerini kaldırır ve durumu ayarlar:

```latte
<title>{include 'heading.latte' |stripHtml|capitalize}</title>
```

 [Şablon kalıtımı |template inheritance] **varsayılan olarak buna dahil değildir**. Dahil edilen şablonlara blok etiketleri ekleyebilseniz de, bunlar dahil edildikleri şablondaki eşleşen blokların yerini almayacaktır. İçerikleri, sayfaların veya modüllerin bağımsız ve korumalı parçaları olarak düşünün. Bu davranış `with blocks` değiştiricisi kullanılarak değiştirilebilir:

```latte
{include 'template.latte' with blocks}
```

Etikette belirtilen dosya adı ile diskteki dosya arasındaki ilişki bir [yükleyici |extending-latte#Loaders] meselesidir.


`{sandbox}`
-----------

Bir son kullanıcı tarafından oluşturulan bir şablonu eklerken, bunu korumalı alana almayı düşünmelisiniz (daha fazla bilgi korumalı alan [belgelerinde |sandbox] bulunmaktadır):

```latte
{sandbox 'untrusted.latte', level: 3, data: $menu}
```


`{block}`
=========

.[note]
Ayrıca bakınız [`{block name}` |template-inheritance#blocks]

Adı olmayan bloklar, şablonun bir bölümüne [filtre |syntax#filters] uygulama olanağı sunar. Örneğin, gereksiz boşlukları kaldırmak için bir [şerit |filters#strip] filtresi uygulayabilirsiniz:

```latte
{block|strip}
<ul>
	<li>Hello World</li>
</ul>
{/block}
```


İstisna İşleme .[#toc-exception-handling]
=========================================


`{try}`
-------

Bu etiketler, sağlam şablonlar oluşturmayı son derece kolaylaştırır.

`{try}` bloğu işlenirken bir istisna oluşursa, tüm blok atılır ve işleme bundan sonra devam eder:

```latte
{try}
	<ul>
		{foreach $twitter->loadTweets() as $tweet}
  			<li>{$tweet->text}</li>
		{/foreach}
	</ul>
{/try}
```

İsteğe bağlı `{else}` cümlesinin içeriği yalnızca bir istisna oluştuğunda işlenir:

```latte
{try}
	<ul>
		{foreach $twitter->loadTweets() as $tweet}
  			<li>{$tweet->text}</li>
		{/foreach}
	</ul>
	{else}
	<p>Sorry, the tweets could not be loaded.</p>
{/try}
```

Etiket [n:attribute |syntax#n:attributes] şeklinde de yazılabilir:

```latte
<ul n:try>
	...
</ul>
```

Günlük kaydı için [kendi istisna işleyicisini |develop#exception handler] tanımlamak da mümkündür:


`{rollback}`
------------

`{try}` bloğu `{rollback}` kullanılarak manuel olarak da durdurulabilir ve atlanabilir. Böylece tüm girdi verilerini önceden kontrol etmeniz gerekmez ve yalnızca render sırasında nesneyi render etmenin mantıklı olup olmadığına karar verebilirsiniz.

```latte
{try}
<ul>
	{foreach $people as $person}
 		{skipIf $person->age < 18}
 		<li>{$person->name}</li>
	{else}
		{rollback}
	{/foreach}
</ul>
{/try}
```


Değişkenler .[#toc-variables]
=============================


`{var}` `{default}`
-------------------

Şablonda `{var}` etiketi ile yeni değişkenler oluşturacağız:

```latte
{var $name = 'John Smith'}
{var $age = 27}

{* Çoklu beyan *}
{var $name = 'John Smith', $age = 27}
```

`{default}` etiketi de benzer şekilde çalışır, ancak değişkenleri yalnızca mevcut değillerse oluşturur. Bir değişken zaten mevcutsa ve `null` içeriyorsa, üzerine yazılmaz:

```latte
{default $lang = 'cs'}
```

 [Değişken türlerini |type-system] de belirtebilirsiniz. Şimdilik bunlar bilgilendiricidir ve Latte bunları kontrol etmez.

```latte
{var string $name = $article->getTitle()}
{default int $id = 0}
```


`{parameters}`
--------------

Tıpkı bir fonksiyonun parametrelerini bildirmesi gibi, bir şablon da değişkenlerini başlangıçta bildirebilir:

```latte
{parameters
	$a,
	?int $b,
	int|string $c = 10
}
```

Varsayılan değeri olmayan `$a` ve `$b` değişkenleri otomatik olarak `null` varsayılan değerine sahip olur. Bildirilen türler hala bilgilendiricidir ve Latte bunları kontrol etmez.

Bildirilen değişkenler dışında hiçbir değişken şablona aktarılmaz. Bu, `{default}` etiketinden bir farktır.


`{capture}`
-----------

`{capture}` etiketini kullanarak çıktıyı bir değişkene yakalayabilirsiniz:

```latte
{capture $var}
<ul>
	<li>Hello World</li>
</ul>
{/capture}

<p>Captured: {$var}</p>
```

Bu etiket, herhangi bir ikili etiket gibi [n:attribute |syntax#n:attributes] şeklinde de yazılabilir:

```latte
<ul n:capture="$var">
	<li>Hello World</li>
</ul>
```

HTML çıktısı, yazdırma sırasında [istenmeyen kaçışları önlemek |develop#disabling-auto-escaping-of-variable] için `$var` değişkeninde bir `Latte\Runtime\Html` nesnesi olarak saklanır.


Diğerleri .[#toc-others]
========================


`{contentType}`
---------------

Şablonun ne tür bir içeriği temsil ettiğini belirtmek için etiketi kullanın. Seçenekler şunlardır:

- `html` (varsayılan tip)
- `xml`
- `javascript`
- `css`
- `calendar` (iCal)
- `text`

Kullanımı önemlidir çünkü [bağlama duyarlı |safety-first#context-aware-escaping] kaçış ayarlar ve ancak o zaman Latte doğru şekilde kaçabilir. Örneğin, `{contentType xml}` XML moduna geçer, `{contentType text}` kaçışı tamamen kapatır.

Parametre `application/xml` gibi tam özellikli bir MIME türüyse, tarayıcıya `Content-Type` şeklinde bir HTTP başlığı da gönderir:

```latte
{contentType application/xml}
<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>RSS feed</title>
		<item>
			...
		</item>
	</channel>
</rss>
```


`{debugbreak}`
--------------

Kod yürütmesinin kesileceği yeri belirtir. Programcının çalışma zamanı ortamını incelemesi ve kodun beklendiği gibi çalıştığından emin olması için hata ayıklama amacıyla kullanılır. [Xdebug'ı |https://xdebug.org] destekler. Ek olarak, kodun ne zaman kırılması gerektiğini bir koşul olarak belirtebilirsiniz.

```latte
{debugbreak}                {* programı bozar *}

{debugbreak $counter == 1}  {* koşul yerine getirilirse programı keser *}
```


`{do}`
------

PHP kodunu çalıştırır ve hiçbir şey yazdırmaz. Diğer tüm etiketlerde olduğu gibi, PHP kodu tek bir ifadedir, [PHP sınırlamalarına |syntax#PHP Limitations in Latte] bakınız.

```latte
{do $num++}
```


`{dump}`
--------

Bir değişkeni veya geçerli bağlamı döker.

```latte
{dump $name} {* $name değişkenini döker *}

{dump}       {* tanımlanmış tüm değişkenleri döker *}
```

.[caution]
[Tracy |tracy:] paketi gerektirir.


`{php}`
-------

Herhangi bir PHP kodunu çalıştırmanıza izin verir. Etiket [RawPhpExtension |develop#RawPhpExtension] uzantısı kullanılarak etkinleştirilmelidir.


`{spaceless}`
-------------

Gereksiz boşlukları kaldırır. [Boşluksuz |filters#spaceless] filtreye benzer.

```latte
{spaceless}
	<ul>
		<li>Hello</li>
	</ul>
{/spaceless}
```

Çıkışlar:

```latte
<ul> <li>Hello</li> </ul>
```

Etiket [n:attribute |syntax#n:attributes] şeklinde de yazılabilir:


`{syntax}`
----------

Latte etiketleri yalnızca tek küme parantezi içine alınmak zorunda değildir. Çalışma zamanında bile başka bir ayırıcı seçebilirsiniz. Bu, parametrenin olabileceği `{syntax…}` ile yapılır:

- Çifte: `{{...}}`
- off: Latte etiketlerini tamamen devre dışı bırakır

n:attribute notasyonunu kullanarak Latte'yi yalnızca bir JavaScript bloğu için devre dışı bırakabiliriz:

```latte
<script n:syntax="off">
	var obj = {var: 123}; // this isn't a tag any more
</script>
```

Latte JavaScript içinde çok rahat bir şekilde kullanılabilir, sadece bu örnekteki gibi harfin `{` harfinden hemen sonra geldiği yapılardan kaçının, [JavaScript veya CSS içinde Lat |recipes#Latte inside JavaScript or CSS] te bölümüne bakın.

Latte'yi `{syntax off}` ile kapatırsanız (yani etiket, n:niteliği değil), `{/syntax}` adresine kadar olan tüm etiketleri kesinlikle yok sayacaktır.


{trace}
-------

Yığın izi şablonların ruhuna uygun olan bir `Latte\RuntimeException` istisnası atar. Bu nedenle, işlevleri ve yöntemleri çağırmak yerine, blokları çağırmayı ve şablonları eklemeyi içerir. [Tracy |tracy:] gibi atılan istisnaları açıkça görüntülemek için bir araç kullanırsanız, geçirilen tüm argümanlar da dahil olmak üzere çağrı yığınını açıkça görürsünüz.


HTML Etiket Yardımcıları .[#toc-html-tag-helpers]
=================================================


n:sınıf .[#toc-n-class]
-----------------------

`n:class` sayesinde, `class` HTML özniteliğini tam olarak ihtiyaç duyduğunuz şekilde oluşturmak çok kolaydır.

Örnek: Aktif öğenin `active` sınıfına sahip olmasını istiyorum:

```latte
{foreach $items as $item}
	<a n:class="$item->isActive() ? active">...</a>
{/foreach}
```

Ayrıca ilk öğenin `first` ve `main` sınıflarına sahip olması gerekiyor:

```latte
{foreach $items as $item}
	<a n:class="$item->isActive() ? active, $iterator->first ? 'first main'">...</a>
{/foreach}
```

Ve tüm öğeler `list-item` sınıfına sahip olmalıdır:

```latte
{foreach $items as $item}
	<a n:class="$item->isActive() ? active, $iterator->first ? 'first main', list-item">...</a>
{/foreach}
```

İnanılmaz derecede basit, değil mi?


n:attr .[#toc-n-attr]
---------------------

`n:attr` niteliği, [n:class |#n:class] ile aynı zarafete sahip rastgele HTML nitelikleri oluşturabilir.

```latte
{foreach $data as $item}
	<input type="checkbox" n:attr="value: $item->getValue(), checked: $item->isActive()">
{/foreach}
```

Dönen değerlere bağlı olarak, örn:

```latte
<input type="checkbox">

<input type="checkbox" value="Hello">

<input type="checkbox" value="Hello" checked>
```


n:etiket .[#toc-n-tag]
----------------------

`n:tag` niteliği, bir HTML öğesinin adını dinamik olarak değiştirebilir.

```latte
<h1 n:tag="$heading" class="main">{$title}</h1>
```

Eğer `$heading === null`, ise `<h1>` etiketi değiştirilmeden yazdırılır. Aksi takdirde, öğe adı değişkenin değeriyle değiştirilir, bu nedenle `$heading === 'h3'` için yazar:

```latte
<h3 class="main">...</h3>
```

Latte güvenli bir şablonlama sistemi olduğundan, yeni etiket adının geçerli olup olmadığını ve istenmeyen veya kötü amaçlı değerler içermediğini kontrol eder.


n:ifcontent .[#toc-n-ifcontent]
-------------------------------

Boş bir HTML öğesinin, yani boşluktan başka bir şey içermeyen bir öğenin yazdırılmasını önler.

```latte
<div>
	<div class="error" n:ifcontent>{$error}</div>
</div>
```

`$error` değişkeninin değerlerine bağlı olarak bu yazdırılacaktır:

```latte
{* $error = '' *}
<div>
</div>

{* $error = 'Required' *}
<div>
	<div class="error">Required</div>
</div>
```


Çeviri .[#toc-translation]
==========================

Çeviri etiketlerinin çalışmasını sağlamak için [çevirmen kurmanız |develop#TranslatorExtension] gerekir. Ayrıca şunları da kullanabilirsiniz [`translate` |filters#translate] çeviri için filtre.


`{_...}`
--------

Değerleri diğer dillere çevirir.

```latte
<a href="basket">{_'Basket'}</a>
<span>{_$item}</span>
```

Çevirmene başka parametreler de aktarılabilir:

```latte
<a href="basket">{_'Basket', domain: order}</a>
```


`{translate}`
-------------

Překládá části šablony:

```latte
<h1>{translate}Order{/translate}</h1>

{translate domain: order}Lorem ipsum ...{/translate}
```

Elemanın içini çevirmek için etiket [n:attribute |syntax#n:attributes] olarak da yazılabilir:

```latte
<h1 n:translate>Order</h1>
```

Latte Etiketleri

Tüm Latte yerleşik etiketlerinin özeti ve açıklaması.

Baskı
{$var}, {...} veya {=...} öncelenmiş bir değişken veya ifade yazdırır
{$var|filter} filtrelerle yazdırır
{l} veya {r} { or } karakterini yazdırır
Koşullar
{if}{elseif}{else}{/if} eğer koşulu
{ifset}{elseifset}{/ifset} koşul ifset
{ifchanged}{/ifchanged} bir değişiklik olup olmadığını test edin
{switch} {case} {default} {/switch} koşul anahtarı
n:else koşullar için alternatif içerik
Döngüler
{foreach}{/foreach} foreach
{for}{/for} için
{while}{/while} while
{continueIf $cond} sonraki yinelemeye devam et
{skipIf $cond} geçerli döngü yinelemesini atla
{breakIf $cond} döngüyü kırar
{exitIf $cond} erken çıkış
{first}{/first} bu ilk y ineleme mi?
{last}{/last} bu son yineleme mi?
{sep}{/sep} bir sonraki yineleme takip edecek mi?
{iterateWhile}{/iterateWhile} yapılandırılmış foreach
$iterator foreach döngüsü içinde özel değişken
Diğer Şablonları Dahil Etme
{include 'file.latte'} başka bir dosyadan şablon içerir
{sandbox 'file.latte'} sandbox modunda bir şablon içerir
Bloklar, düzenler, şablon kalıtımı
{block} anonim blok
{block blockname} blok tanımı
{define blockname} gelecekteki kullanım için blok tanımı
{include blockname} blok yazdırır
{include blockname from 'file.latte'} dosyadan bir blok yazdırır
{import 'file.latte'} blokları başka bir şablondan yükler
{layout 'file.latte'} / {extends} bir düzen dosyası belirtir
{embed}{/embed} şablonu veya bloğu yükler ve blokların üzerine yazmanıza izin verir
{ifset blockname}{/ifset} blok tanımlanmışsa koşul
İstisna işleme
{try}{else}{/try} istisnaları yakalama
{rollback} deneme bloğunu atar
Değişkenler
{var $foo = value} değişken oluşturma
{default $foo = value} değişken bildirilmediğinde varsayılan değer
{parameters} değişkenleri bildirir, varsayılan değerleri yazar
{capture}{/capture} bir bölümü bir değişkene kaydeder
Türleri
{varType} değişkenin türünü bildirir
{varPrint} değişken türlerini önerir
{templateType} sınıf kullanarak değişken türlerini bildirir
{templatePrint} özellikli sınıf oluşturur
Çeviri
{_string} çevrilmiş olarak yazdırır
{translate}{/translate} içeriği çevirir
Diğerleri
{contentType} kaçış modunu değiştirir ve HTTP başlığı gönderir
{debugbreak} koda kesme noktası koyar
{do} bir ifadeyi yazdırmadan değerlendirir
{dump} değişkenleri Tracy Bar'a döker
{php} herhangi bir PHP kodunu çalıştırır
{spaceless}{/spaceless} gereksiz boşlukları kaldırır
{syntax} çalışma zamanında sözdizimini değiştirir
{trace} yığın izini gösterir
HTML etiketi yardımcıları
n:class akıllı sınıf niteliği
n:attr akıllı HTML nitelikleri
n:tag HTML öğesinin dinamik adı
n:ifcontent Boş HTML etiketini atlayın
Yalnızca Nette Framework'te kullanılabilir
n:href <a> HTML öğelerindeki bağlantı
{link} bir bağlantı yazdırır
{plink} sunum yapan kişiye bir bağlantı yazdırır
{control} bir bileşen yazdırır
{snippet}{/snippet} AJAX ile gönderilebilecek bir şablon parçacığı
{snippetArea} snippets zarfı
{cache}{/cache} bir şablon bölümünü önbelleğe alır
Sadece Nette Forms ile kullanılabilir
{form}{/form} bir form öğesi yazdırır
{label}{/label} bir form giriş etiketi yazdırır
{input} bir form giriş öğesi yazdırır
{inputError} form giriş öğesi için hata mesajı yazdırır
n:name bir HTML giriş öğesini etkinleştirir
{formContainer}{/formContainer} form kapsayıcısını oluşturma

Baskı

{$var} {...} {=...}

Latte, herhangi bir ifadeyi çıktıya yazdırmak için {=...} etiketini kullanır. Eğer ifade bir değişken veya fonksiyon çağrısı ile başlıyorsa, eşittir işareti yazmaya gerek yoktur. Bu da pratikte neredeyse hiçbir zaman yazılmasına gerek olmadığı anlamına gelir:

Name: {$name} {$surname}<br>
Age: {date('Y') - $birth}<br>

PHP'den bildiğiniz her şeyi bir ifade olarak yazabilirsiniz. Sadece yeni bir dil öğrenmek zorunda değilsiniz. Örneğin:

{='0' . ($num ?? $num * 3) . ', ' . PHP_VERSION}

Lütfen önceki örnekte herhangi bir anlam aramayın, ancak orada bir anlam bulursanız bize yazın :-)

Çıkıştan Kaçış

Bir şablon sisteminin en önemli görevi nedir? Güvenlik açıklarını önlemek. Ve çıktıya bir şey yazdırdığınızda Latte tam olarak bunu yapar. Her şeyi otomatik olarak kaçar:

<p>{='one < two'}</p>   {* prints: '<p>one &lt; two</p>' *}

Kesin olmak gerekirse, Latte bağlama duyarlı kaçış kullanır, bu o kadar önemli ve benzersiz bir özelliktir ki ona ayrı bir bölüm ayırdık.

Peki ya güvenilir bir kaynaktan HTML kodlu içerik yazdırıyorsanız? O zaman kaçış özelliğini kolayca kapatabilirsiniz:

{$trustedHtmlString|noescape}

noescape filtresinin yanlış kullanımı bir XSS güvenlik açığına yol açabilir! Ne yaptığınızdan ve yazdırdığınız dizenin güvenilir bir kaynaktan geldiğinden kesinlikle emin değilseniz asla kullanmayın.

JavaScript'te Yazdırma

Bağlama duyarlı kaçış sayesinde, JavaScript içindeki değişkenleri yazdırmak son derece kolaydır ve Latte bunları düzgün bir şekilde kaçacaktır.

Değişken bir dize olmak zorunda değildir, herhangi bir veri türü desteklenir ve daha sonra JSON olarak kodlanır:

{var $foo = ['hello', true, 1]}
<script>
	alert({$foo});
</script>

Üretir:

<script>
	alert(["hello", true, 1]);
</script>

Bu aynı zamanda değişkeni tırnak içine almayın nedenidir: Latte bunları dizelerin etrafına ekler. Ve bir dize değişkenini başka bir dizenin içine koymak istiyorsanız, bunları birleştirmeniz yeterlidir:

<script>
	alert('Hello ' + {$name} + '!');  // OK

	alert({="Hello $name!"});         // OK

	alert('Hello {$name} !');         // ERROR!
</script>

Filtreler

Yazdırılan ifade filtrelerle değiştirilebilir. Örneğin, bu örnek dizeyi büyük harfe dönüştürür ve en fazla 30 karakter olacak şekilde kısaltır:

{$string|upper|truncate:30}

Ayrıca, bir ifadenin bölümlerine aşağıdaki gibi filtreler uygulayabilirsiniz:

{$left . ($middle|upper) . $right}

Koşullar

{if} {elseif} {else}

Koşullar PHP'deki benzerleriyle aynı şekilde davranır. PHP'den bildiğiniz ifadeleri kullanabilirsiniz, yeni bir dil öğrenmek zorunda değilsiniz.

{if $product->inStock > Stock::Minimum}
	In stock
{elseif $product->isOnWay()}
	On the way
{else}
	Not available
{/if}

Herhangi bir çift etiketi gibi, bir {if} ... {/ if} çifti de örneğin n:attribute şeklinde yazılabilir:

<p n:if="$count > 0">In stock {$count} items</p>

n:attributes öğesine tag- önekini ekleyebileceğinizi biliyor musunuz? Bu durumda koşul yalnızca HTML etiketlerini etkileyecek ve aralarındaki içerik her zaman yazdırılacaktır:

<a href="..." n:tag-if="$clickable">Hello</a>

{* prints 'Hello' when $clickable is falsey *}
{* prints '<a href="...">Hello</a>' when $clickable is truthy *}

Güzel.

n:else

{if} ... {/if} koşulunu bir n:niteliği biçiminde yazarsanız, n:else adresini kullanarak alternatif bir dal belirtme seçeneğiniz vardır:

<strong n:if="$count > 0">In stock {$count} items</strong>

<em n:else>not available</em>

n:else özniteliği aşağıdakilerle birlikte de kullanılabilir n:ifset, n:foreach, n:try, n:ifcontentve n:ifchanged.

{/if $cond}

{if} koşulundaki ifadenin end etiketinde de belirtilebilmesi sizi şaşırtabilir. Bu, etiket açıldığında koşulun değerini henüz bilmediğimiz durumlarda kullanışlıdır. Buna ertelenmiş karar diyelim.

Örneğin, veritabanından kayıtları içeren bir tabloyu listelemeye başlıyoruz ve ancak raporu tamamladıktan sonra veritabanında kayıt olmadığını fark ediyoruz. Bu yüzden {/if} son etiketine koşul koyarız ve eğer kayıt yoksa hiçbiri yazdırılmaz:

{if}
	<h1>Printing rows from the database</h1>

	<table>
	{foreach $resultSet as $row}
		...
	{/foreach}
	</table>
{/if isset($row)}

Kullanışlı, değil mi?

Ertelenmiş koşulda {else} adresini de kullanabilirsiniz, ancak {elseif} adresini kullanamazsınız.

{ifset} {elseifset}

Ayrıca bakınız {ifset block}

Bir değişkenin (veya birden fazla değişkenin) var olup olmadığını ve boş olmayan bir değere sahip olup olmadığını belirlemek için {ifset $var} koşulunu kullanın. Aslında PHP'deki if (isset($var)) ile aynıdır. Herhangi bir çift etiketi gibi, bu da n:attribute şeklinde yazılabilir, bu yüzden örnek olarak gösterelim:

<meta name="robots" content={$robots} n:ifset="$robots">

{ifchanged}

{ifchanged} Döngüdeki (foreach, for veya while) son yinelemeden bu yana bir değişkenin değerinin değişip değişmediğini kontrol eder.

Etikette bir veya daha fazla değişken belirtirsek, bunlardan herhangi birinin değişip değişmediğini kontrol eder ve içeriği buna göre yazdırır. Örneğin, aşağıdaki örnek isimleri listelerken her değiştiğinde bir ismin ilk harfini başlık olarak yazdırır:

{foreach ($names|sort) as $name}
	{ifchanged $name[0]} <h2>{$name[0]}</h2> {/ifchanged}

	<p>{$name}</p>
{/foreach}

Ancak, herhangi bir argüman verilmezse, işlenen içeriğin kendisi önceki durumuna göre kontrol edilecektir. Bu, önceki örnekte etiketteki argümanı güvenli bir şekilde atlayabileceğimiz anlamına gelir. Ve tabii ki n:attribute da kullanabiliriz:

{foreach ($names|sort) as $name}
	<h2 n:ifchanged>{$name[0]}</h2>

	<p>{$name}</p>
{/foreach}

Ayrıca {ifchanged} içine bir {else} cümlesi de ekleyebilirsiniz.

{switch} {case} {default}

Değeri birden fazla seçenekle karşılaştırır. Bu, PHP'den bildiğiniz switch yapısına benzer. Ancak Latte bunu geliştirir:

  • katı karşılaştırma kullanır (===)
  • ihtiyaç duymaz break

Yani PHP 8.0 ile birlikte gelen match yapısının tam karşılığıdır.

{switch $transport}
	{case train}
		By train
	{case plane}
		By plane
	{default}
		Differently
{/switch}

Madde {case} virgülle ayrılmış birden fazla değer içerebilir:

{switch $status}
{case $status::New}<b>new item</b>
{case $status::Sold, $status::Unknown}<i>not available</i>
{/switch}

Döngüler

Latte'de PHP'den bildiğiniz tüm döngüler mevcuttur: foreach, for ve while.

{foreach}

Döngüyü PHP'deki ile tamamen aynı şekilde yazarsınız:

{foreach $langs as $code => $lang}
	<span>{$lang}</span>
{/foreach}

Buna ek olarak, şimdi bahsedeceğimiz bazı kullanışlı ince ayarlar var.

Örneğin, Latte oluşturulan değişkenlerin yanlışlıkla aynı isimli global değişkenlerin üzerine yazılmadığını kontrol eder. Bu, $lang adresinin sayfanın geçerli dili olduğunu varsaydığınızda ve foreach $langs as $lang adresinin bu değişkenin üzerine yazıldığını fark etmediğinizde sizi kurtaracaktır.

foreach döngüsü de n:attribute ile çok zarif ve ekonomik bir şekilde yazılabilir:

<ul>
	<li n:foreach="$items as $item">{$item->name}</li>
</ul>

inner- ön ekini n:attributes öğesinin önüne ekleyebileceğinizi biliyor muydunuz? Artık sadece elemanın iç kısmı döngüde tekrarlanacaktır:

<div n:inner-foreach="$items as $item">
	<h4>{$item->title}</h4>
	<p>{$item->description}</p>
</div>

Yani şöyle bir şey yazdırıyor:

<div>
	<h4>Foo</h4>
	<p>Lorem ipsum.</p>
	<h4>Bar</h4>
	<p>Sit dolor.</p>
</div>

{else}

foreach döngüsü, verilen dizi boşsa metni görüntülenen isteğe bağlı bir {else} cümlesi alabilir:

<ul>
	{foreach $people as $person}
		<li>{$person->name}</li>
	{else}
		<li><em>Sorry, no users in this list</em></li>
	{/foreach}
</ul>

$iterator

foreach döngüsü içinde $iterator değişkeni başlatılır. Mevcut döngü hakkında önemli bilgiler tutar.

  • $iterator->first – bu ilk yineleme mi?
  • $iterator->last – bu son yineleme mi?
  • $iterator->counter – yineleme sayacı, 1'den başlar
  • $iterator->counter0 – yineleme sayacı, 0'dan başlar
  • $iterator->odd – bu yineleme tek mi?
  • $iterator->even – bu yineleme çift mi?
  • $iterator->parent – mevcut olanı çevreleyen yineleyici
  • $iterator->nextValue – döngüdeki bir sonraki öğe
  • $iterator->nextKey – döngüdeki bir sonraki öğenin anahtarı
{foreach $rows as $row}
	{if $iterator->first}<table>{/if}

	<tr id="row-{$iterator->counter}">
		<td>{$row->name}</td>
		<td>{$row->email}</td>
	</tr>

	{if $iterator->last}</table>{/if}
{/foreach}

Latte akıllıdır ve $iterator->last yalnızca diziler için değil, aynı zamanda döngü öğe sayısının önceden bilinmediği genel bir yineleyici üzerinde çalıştığında da çalışır.

{first} {last} {sep}

Bu etiketler {foreach} döngüsü içinde kullanılabilir. İlk geçiş için {first} içeriği işlenir. {last} içeriği … tahmin edebilir misiniz? Evet, son geçiş için. Bunlar aslında {if $iterator->first} ve {if $iterator->last} için kısayollardır.

Etiketler n:attributes şeklinde de yazılabilir:

{foreach $rows as $row}
	{first}<h1>List of names</h1>{/first}

	<p>{$row->name}</p>

	<hr n:last>
{/foreach}

Yineleme son değilse {sep} içeriği işlenir, bu nedenle listelenen öğeler arasındaki virgüller gibi sınırlayıcıları yazdırmak için uygundur:

{foreach $items as $item} {$item} {sep}, {/sep} {/foreach}

Bu oldukça pratik, değil mi?

{iterateWhile}

Bir koşul sağlanana kadar iç içe bir döngüde yineleme yaparak foreach döngüsünde yineleme sırasında doğrusal verilerin gruplanmasını basitleştirir. Ayrıntılı talimatları okuyun.

Ayrıca yukarıdaki örnekte {first} ve {last} adreslerini zarif bir şekilde değiştirebilir:

{foreach $rows as $row}
	<table>

	{iterateWhile}
	<tr id="row-{$iterator->counter}">
		<td>{$row->name}</td>
		<td>{$row->email}</td>
	</tr>
	{/iterateWhile true}

	</table>
{/foreach}

Ayrıca bkz. toplu iş ve grup filtreleri.

{for}

Döngüyü PHP'deki ile tamamen aynı şekilde yazıyoruz:

{for $i = 0; $i < 10; $i++}
	<span>Item #{$i}</span>
{/for}

Etiket n:attribute şeklinde de yazılabilir:

<h1 n:for="$i = 0; $i < 10; $i++">{$i}</h1>

{while}

Yine, döngüyü PHP'deki ile tamamen aynı şekilde yazıyoruz:

{while $row = $result->fetch()}
	<span>{$row->title}</span>
{/while}

Ya da n:attribute olarak:

<span n:while="$row = $result->fetch()">
	{$row->title}
</span>

Son etiketinde bir koşul bulunan bir varyant PHP'deki do-while döngüsüne karşılık gelir:

{while}
	<span>{$item->title}</span>
{/while $item = $item->getNext()}

{continueIf} {skipIf} {breakIf}

Herhangi bir döngüyü kontrol etmek için kullanabileceğiniz özel etiketler vardır – {continueIf ?} ve {breakIf ?}, koşullar karşılandığında sırasıyla bir sonraki yinelemeye atlar ve döngüyü sonlandırır:

{foreach $rows as $row}
	{continueIf $row->date < $now}
	{breakIf $row->parent === null}
	...
{/foreach}

{skipIf} etiketi {continueIf} etiketine çok benzer, ancak sayacı artırmaz. Böylece $iterator->counter adresini yazdırdığınızda ve bazı öğeleri atladığınızda numaralandırmada delikler oluşmaz. Ayrıca tüm öğeleri atladığınızda {else} cümlesi oluşturulacaktır.

<ul>
	{foreach $people as $person}
		{skipIf $person->age < 18}
		<li>{$iterator->counter}. {$person->name}</li>
	{else}
		<li><em>Sorry, no adult users in this list</em></li>
	{/foreach}
</ul>

{exitIf}

Bir koşul karşılandığında bir şablonun veya bloğun oluşturulmasını sonlandırır (yani „erken çıkış“).

{exitIf !$messages}

<h1>Messages</h1>
<div n:foreach="$messages as $message">
   {$message}
</div>

Şablonlar Dahil

{include 'file.latte'}

Ayrıca bakınız {include block}

{include} etiketi belirtilen şablonu yükler ve işler. Favori PHP dilimizde bu şuna benzer:

<?php include 'header.phtml'; ?>

Dahil edilen şablonların aktif bağlamın değişkenlerine erişimi yoktur, ancak global değişkenlere erişimi vardır.

Eklenen şablona değişkenleri aşağıdaki şekilde aktarabilirsiniz:

{include 'template.latte', foo: 'bar', id: 123}

Şablon adı herhangi bir PHP ifadesi olabilir:

{include $someVar}
{include $ajax ? 'ajax.latte' : 'not-ajax.latte'}

Eklenen içerik filtreler kullanılarak değiştirilebilir. Aşağıdaki örnek tüm HTML öğelerini kaldırır ve durumu ayarlar:

<title>{include 'heading.latte' |stripHtml|capitalize}</title>

Şablon kalıtımı varsayılan olarak buna dahil değildir. Dahil edilen şablonlara blok etiketleri ekleyebilseniz de, bunlar dahil edildikleri şablondaki eşleşen blokların yerini almayacaktır. İçerikleri, sayfaların veya modüllerin bağımsız ve korumalı parçaları olarak düşünün. Bu davranış with blocks değiştiricisi kullanılarak değiştirilebilir:

{include 'template.latte' with blocks}

Etikette belirtilen dosya adı ile diskteki dosya arasındaki ilişki bir yükleyici meselesidir.

{sandbox}

Bir son kullanıcı tarafından oluşturulan bir şablonu eklerken, bunu korumalı alana almayı düşünmelisiniz (daha fazla bilgi korumalı alan belgelerinde bulunmaktadır):

{sandbox 'untrusted.latte', level: 3, data: $menu}

{block}

Ayrıca bakınız {block name}

Adı olmayan bloklar, şablonun bir bölümüne filtre uygulama olanağı sunar. Örneğin, gereksiz boşlukları kaldırmak için bir şerit filtresi uygulayabilirsiniz:

{block|strip}
<ul>
	<li>Hello World</li>
</ul>
{/block}

İstisna İşleme

{try}

Bu etiketler, sağlam şablonlar oluşturmayı son derece kolaylaştırır.

{try} bloğu işlenirken bir istisna oluşursa, tüm blok atılır ve işleme bundan sonra devam eder:

{try}
	<ul>
		{foreach $twitter->loadTweets() as $tweet}
  			<li>{$tweet->text}</li>
		{/foreach}
	</ul>
{/try}

İsteğe bağlı {else} cümlesinin içeriği yalnızca bir istisna oluştuğunda işlenir:

{try}
	<ul>
		{foreach $twitter->loadTweets() as $tweet}
  			<li>{$tweet->text}</li>
		{/foreach}
	</ul>
	{else}
	<p>Sorry, the tweets could not be loaded.</p>
{/try}

Etiket n:attribute şeklinde de yazılabilir:

<ul n:try>
	...
</ul>

Günlük kaydı için kendi istisna işleyicisini tanımlamak da mümkündür:

{rollback}

{try} bloğu {rollback} kullanılarak manuel olarak da durdurulabilir ve atlanabilir. Böylece tüm girdi verilerini önceden kontrol etmeniz gerekmez ve yalnızca render sırasında nesneyi render etmenin mantıklı olup olmadığına karar verebilirsiniz.

{try}
<ul>
	{foreach $people as $person}
 		{skipIf $person->age < 18}
 		<li>{$person->name}</li>
	{else}
		{rollback}
	{/foreach}
</ul>
{/try}

Değişkenler

{var} {default}

Şablonda {var} etiketi ile yeni değişkenler oluşturacağız:

{var $name = 'John Smith'}
{var $age = 27}

{* Çoklu beyan *}
{var $name = 'John Smith', $age = 27}

{default} etiketi de benzer şekilde çalışır, ancak değişkenleri yalnızca mevcut değillerse oluşturur. Bir değişken zaten mevcutsa ve null içeriyorsa, üzerine yazılmaz:

{default $lang = 'cs'}

Değişken türlerini de belirtebilirsiniz. Şimdilik bunlar bilgilendiricidir ve Latte bunları kontrol etmez.

{var string $name = $article->getTitle()}
{default int $id = 0}

{parameters}

Tıpkı bir fonksiyonun parametrelerini bildirmesi gibi, bir şablon da değişkenlerini başlangıçta bildirebilir:

{parameters
	$a,
	?int $b,
	int|string $c = 10
}

Varsayılan değeri olmayan $a ve $b değişkenleri otomatik olarak null varsayılan değerine sahip olur. Bildirilen türler hala bilgilendiricidir ve Latte bunları kontrol etmez.

Bildirilen değişkenler dışında hiçbir değişken şablona aktarılmaz. Bu, {default} etiketinden bir farktır.

{capture}

{capture} etiketini kullanarak çıktıyı bir değişkene yakalayabilirsiniz:

{capture $var}
<ul>
	<li>Hello World</li>
</ul>
{/capture}

<p>Captured: {$var}</p>

Bu etiket, herhangi bir ikili etiket gibi n:attribute şeklinde de yazılabilir:

<ul n:capture="$var">
	<li>Hello World</li>
</ul>

HTML çıktısı, yazdırma sırasında istenmeyen kaçışları önlemek için $var değişkeninde bir Latte\Runtime\Html nesnesi olarak saklanır.

Diğerleri

{contentType}

Şablonun ne tür bir içeriği temsil ettiğini belirtmek için etiketi kullanın. Seçenekler şunlardır:

  • html (varsayılan tip)
  • xml
  • javascript
  • css
  • calendar (iCal)
  • text

Kullanımı önemlidir çünkü bağlama duyarlı kaçış ayarlar ve ancak o zaman Latte doğru şekilde kaçabilir. Örneğin, {contentType xml} XML moduna geçer, {contentType text} kaçışı tamamen kapatır.

Parametre application/xml gibi tam özellikli bir MIME türüyse, tarayıcıya Content-Type şeklinde bir HTTP başlığı da gönderir:

{contentType application/xml}
<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>RSS feed</title>
		<item>
			...
		</item>
	</channel>
</rss>

{debugbreak}

Kod yürütmesinin kesileceği yeri belirtir. Programcının çalışma zamanı ortamını incelemesi ve kodun beklendiği gibi çalıştığından emin olması için hata ayıklama amacıyla kullanılır. Xdebug'ı destekler. Ek olarak, kodun ne zaman kırılması gerektiğini bir koşul olarak belirtebilirsiniz.

{debugbreak}                {* programı bozar *}

{debugbreak $counter == 1}  {* koşul yerine getirilirse programı keser *}

{do}

PHP kodunu çalıştırır ve hiçbir şey yazdırmaz. Diğer tüm etiketlerde olduğu gibi, PHP kodu tek bir ifadedir, PHP sınırlamalarına bakınız.

{do $num++}

{dump}

Bir değişkeni veya geçerli bağlamı döker.

{dump $name} {* $name değişkenini döker *}

{dump}       {* tanımlanmış tüm değişkenleri döker *}

Tracy paketi gerektirir.

{php}

Herhangi bir PHP kodunu çalıştırmanıza izin verir. Etiket RawPhpExtension uzantısı kullanılarak etkinleştirilmelidir.

{spaceless}

Gereksiz boşlukları kaldırır. Boşluksuz filtreye benzer.

{spaceless}
	<ul>
		<li>Hello</li>
	</ul>
{/spaceless}

Çıkışlar:

<ul> <li>Hello</li> </ul>

Etiket n:attribute şeklinde de yazılabilir:

{syntax}

Latte etiketleri yalnızca tek küme parantezi içine alınmak zorunda değildir. Çalışma zamanında bile başka bir ayırıcı seçebilirsiniz. Bu, parametrenin olabileceği {syntax…} ile yapılır:

  • Çifte: {{...}}
  • off: Latte etiketlerini tamamen devre dışı bırakır

n:attribute notasyonunu kullanarak Latte'yi yalnızca bir JavaScript bloğu için devre dışı bırakabiliriz:

<script n:syntax="off">
	var obj = {var: 123}; // this isn't a tag any more
</script>

Latte JavaScript içinde çok rahat bir şekilde kullanılabilir, sadece bu örnekteki gibi harfin { harfinden hemen sonra geldiği yapılardan kaçının, JavaScript veya CSS içinde Lat te bölümüne bakın.

Latte'yi {syntax off} ile kapatırsanız (yani etiket, n:niteliği değil), {/syntax} adresine kadar olan tüm etiketleri kesinlikle yok sayacaktır.

{trace}

Yığın izi şablonların ruhuna uygun olan bir Latte\RuntimeException istisnası atar. Bu nedenle, işlevleri ve yöntemleri çağırmak yerine, blokları çağırmayı ve şablonları eklemeyi içerir. Tracy gibi atılan istisnaları açıkça görüntülemek için bir araç kullanırsanız, geçirilen tüm argümanlar da dahil olmak üzere çağrı yığınını açıkça görürsünüz.

HTML Etiket Yardımcıları

n:sınıf

n:class sayesinde, class HTML özniteliğini tam olarak ihtiyaç duyduğunuz şekilde oluşturmak çok kolaydır.

Örnek: Aktif öğenin active sınıfına sahip olmasını istiyorum:

{foreach $items as $item}
	<a n:class="$item->isActive() ? active">...</a>
{/foreach}

Ayrıca ilk öğenin first ve main sınıflarına sahip olması gerekiyor:

{foreach $items as $item}
	<a n:class="$item->isActive() ? active, $iterator->first ? 'first main'">...</a>
{/foreach}

Ve tüm öğeler list-item sınıfına sahip olmalıdır:

{foreach $items as $item}
	<a n:class="$item->isActive() ? active, $iterator->first ? 'first main', list-item">...</a>
{/foreach}

İnanılmaz derecede basit, değil mi?

n:attr

n:attr niteliği, n:class ile aynı zarafete sahip rastgele HTML nitelikleri oluşturabilir.

{foreach $data as $item}
	<input type="checkbox" n:attr="value: $item->getValue(), checked: $item->isActive()">
{/foreach}

Dönen değerlere bağlı olarak, örn:

<input type="checkbox">

<input type="checkbox" value="Hello">

<input type="checkbox" value="Hello" checked>

n:etiket

n:tag niteliği, bir HTML öğesinin adını dinamik olarak değiştirebilir.

<h1 n:tag="$heading" class="main">{$title}</h1>

Eğer $heading === null, ise <h1> etiketi değiştirilmeden yazdırılır. Aksi takdirde, öğe adı değişkenin değeriyle değiştirilir, bu nedenle $heading === 'h3' için yazar:

<h3 class="main">...</h3>

Latte güvenli bir şablonlama sistemi olduğundan, yeni etiket adının geçerli olup olmadığını ve istenmeyen veya kötü amaçlı değerler içermediğini kontrol eder.

n:ifcontent

Boş bir HTML öğesinin, yani boşluktan başka bir şey içermeyen bir öğenin yazdırılmasını önler.

<div>
	<div class="error" n:ifcontent>{$error}</div>
</div>

$error değişkeninin değerlerine bağlı olarak bu yazdırılacaktır:

{* $error = '' *}
<div>
</div>

{* $error = 'Required' *}
<div>
	<div class="error">Required</div>
</div>

Çeviri

Çeviri etiketlerinin çalışmasını sağlamak için çevirmen kurmanız gerekir. Ayrıca şunları da kullanabilirsiniz translate çeviri için filtre.

{_...}

Değerleri diğer dillere çevirir.

<a href="basket">{_'Basket'}</a>
<span>{_$item}</span>

Çevirmene başka parametreler de aktarılabilir:

<a href="basket">{_'Basket', domain: order}</a>

{translate}

Překládá části šablony:

<h1>{translate}Order{/translate}</h1>

{translate domain: order}Lorem ipsum ...{/translate}

Elemanın içini çevirmek için etiket n:attribute olarak da yazılabilir:

<h1 n:translate>Order</h1>