Nette Documentation Preview

syntax
Sözdizimi
*********

.[perex]
Syntax Latte, web tasarımcılarının pratik gereksinimlerinden doğdu. Aksi takdirde gerçek bir meydan okuma olan yapıları zarif bir şekilde yazabileceğiniz en kullanıcı dostu sözdizimini arıyorduk.
Aynı zamanda, tüm ifadeler PHP'deki ile tamamen aynı şekilde yazılır, bu nedenle yeni bir dil öğrenmeniz gerekmez. Sadece zaten bildiklerinizden en iyi şekilde faydalanırsınız.

Aşağıda birkaç temel öğeyi gösteren minimal bir şablon bulunmaktadır: etiketler, n:attributes, yorumlar ve filtreler.

```latte
{* bu bir yorumdur *}
<ul n:if="$items">               {* n:if is n:atribut *}
{foreach $items as $item}        {* foreach döngüsünü temsil eden etiket *}
	<li>{$item|capitalize}</li>  {* bir değişkeni bir filtre ile yazdıran etiket *}
{/foreach}                       {* döngünün sonu *}
</ul>
```

Şimdi bu önemli unsurlara ve inanılmaz bir şablon oluşturmanıza nasıl yardımcı olabileceklerine daha yakından bakalım.


Etiketler .[#toc-tags]
======================

Bir şablon, şablon mantığını (örneğin, *foreach* döngüleri) veya çıktı ifadelerini kontrol eden etiketler içerir. Her ikisi için de tek bir sınırlayıcı `{ ... }` kullanılır, böylece diğer sistemlerde olduğu gibi hangi durumda hangi sınırlayıcıyı kullanacağınızı düşünmeniz gerekmez.
Eğer `{` karakterinin ardından bir tırnak işareti veya boşluk gelirse, Latte bunu bir etiketin başlangıcı olarak kabul etmez, böylece şablonlarınızda JavaScript yapılarını, JSON'u veya CSS kurallarını sorunsuz bir şekilde kullanabilirsiniz.

[Tüm etiketlere genel bak |tags] ışı görün. Ayrıca, [özel etiketler |extending-latte#tags] de oluşturabilirsiniz.


Latte PHP'yi Anlıyor .[#toc-latte-understands-php]
==================================================

Etiketlerin içinde iyi bildiğiniz PHP ifadelerini kullanabilirsiniz:

- değişkenler
- dizeler (HEREDOC ve NOWDOC dahil), diziler, sayılar, vb.
- [operatörler |https://www.php.net/manual/en/language.operators.php]
- fonksiyon ve metot çağrıları ( [sandbox |sandbox] tarafından kısıtlanabilir)
- [maç |https://www.php.net/manual/en/control-structures.match.php]
- [anonim fonksiyonlar |https://www.php.net/manual/en/functions.arrow.php]
- [geri aramalar |https://www.php.net/manual/en/functions.first_class_callable_syntax.php]
- çok satırlı yorumlar `/* ... */`
- vs...

Buna ek olarak, Latte PHP sözdizimine birkaç [güzel uzantı |#Syntactic Sugar] ekler.


n:öznitelikler .[#toc-n-attributes]
===================================

Tek bir HTML öğesi üzerinde çalışan `{if} … {/if}` gibi her bir çift etiket [n:attribute |#n:attribute] notasyonunda yazılabilir. Örneğin, yukarıdaki örnekte yer alan `{foreach}` bu şekilde de yazılabilir:

```latte
<ul n:if="$items">
	<li n:foreach="$items as $item">{$item|capitalize}</li>
</ul>
```

İşlevsellik daha sonra yazıldığı HTML öğesine karşılık gelir:

```latte
{var $items = ['I', '♥', 'Latte']}

<p n:foreach="$items as $item">{$item}</p>
```

Baskılar:

```latte
<p>I</p>
<p>♥</p>
<p>Latte</p>
```

`inner-` önekini kullanarak davranışı değiştirebilir, böylece işlevselliğin yalnızca öğenin gövdesine uygulanmasını sağlayabiliriz:

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

Baskılar:

```latte
<div>
	<p>I</p>
	<hr>
	<p>♥</p>
	<hr>
	<p>Latte</p>
	<hr>
</div>
```

Veya `tag-` önekini kullanarak işlevsellik yalnızca HTML etiketlerine uygulanır:

```latte
<p><a href={$url} n:tag-if="$url">Title</a></p>
```

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

```latte
// when $url is empty
<p>Title</p>

// when $url equals 'https://nette.org'
<p><a href="https://nette.org">Title</a></p>
```

Bununla birlikte, n:attributes sadece çift etiketler için bir kısayol değildir, bazı saf n:attribute'lar da vardır, örneğin kodlayıcının en iyi arkadaşı n: [class |tags#n:class].


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

[Standart filtrelerin |filters] özetine bakın.

Latte, boru işareti gösterimini kullanarak filtreleri çağırmaya izin verir (önceki boşluğa izin verilir):

```latte
<h1>{$heading|upper}</h1>
```

Filtreler zincirleme olabilir, bu durumda soldan sağa doğru sırayla uygulanırlar:

```latte
<h1>{$heading|lower|capitalize}</h1>
```

Parametreler filtre adından sonra iki nokta üst üste veya virgülle ayrılmış olarak konur:

```latte
<h1>{$heading|truncate:20,''}</h1>
```

İfade üzerinde filtreler uygulanabilir:

```latte
{var $name = ($title|upper) . ($subtitle|lower)}
```

Blokta:

```latte
<h1>{block |lower}{$heading}{/block}</h1>
```

Veya doğrudan değer üzerinde (ile birlikte [`{=expr}` | https://latte.nette.org/tr/tags#printing] etiketi):
```latte
<h1>{='  Hello world  '|trim}<h1>
```


Dinamik HTML Etiketleri .[#toc-dynamic-html-tags]
=================================================

Latte, etiket adlarında esnekliğe ihtiyaç duyduğunuzda yararlı olan dinamik HTML etiketlerini destekler:

```latte
<h{$level}>Heading</h{$level}>
```

Örneğin, yukarıdaki kod şunları üretebilir `<h1>Heading</h1>` veya `<h2>Heading</h2>` değişkeninin değerine bağlı olarak `$level`. Latte'deki dinamik HTML etiketleri her zaman eşleştirilmelidir. Alternatifleri [n:tag |tags#n:tag].

Latte güvenli bir şablonlama sistemi olduğundan, ortaya çıkan etiket adının geçerli olup olmadığını ve istenmeyen veya kötü amaçlı değerler içermediğini kontrol eder. Ayrıca, son etiket adının her zaman açılış etiketi adıyla aynı olmasını sağlar.


Yorumlar .[#toc-comments]
=========================

Yorumlar bu şekilde yazılır ve çıktıya girmez:

```latte
{* Bu Latte dilinde bir yorumdur *}
```

PHP yorumları etiketlerin içinde çalışır:

```latte
{include 'file.info', /* value: 123 */}
```


Sözdizimsel Şeker .[#toc-syntactic-sugar]
=========================================


Tırnak İşareti Olmayan Dizeler .[#toc-strings-without-quotation-marks]
----------------------------------------------------------------------

Basit dizeler için tırnak işaretleri atlanabilir:

```latte
as in PHP:   {var $arr = ['hello', 'btn--default', '€']}

abbreviated: {var $arr = [hello, btn--default, €]}
```

Basit dizeler yalnızca harflerden, rakamlardan, alt çizgilerden, tire işaretlerinden ve noktalardan oluşan dizelerdir. Bir rakamla başlamamalı ve bir tire ile başlamamalı veya bitmemelidir.
Yalnızca büyük harflerden ve alt çizgilerden oluşmamalıdır, çünkü o zaman bir sabit olarak kabul edilir (örn. `PHP_VERSION`).
Ve `and`, `array`, `clone`, `default`, `false`, `in`, `instanceof`, `new`, `null`, `or`, `return`, `true`, `xor` anahtar kelimeleriyle çakışmamalıdır.


Kısa Üçlü Operatör .[#toc-short-ternary-operator]
-------------------------------------------------

Üçlü işlecin üçüncü değeri boşsa, atlanabilir:

```latte
as in PHP:   {$stock ? 'In stock' : ''}

abbreviated: {$stock ? 'In stock'}
```


Dizide Modern Anahtar Notasyonu .[#toc-modern-key-notation-in-the-array]
------------------------------------------------------------------------

Dizi anahtarları, fonksiyonlar çağrılırken adlandırılmış parametrelere benzer şekilde yazılabilir:

```latte
as in PHP:   {var $arr = ['one' => 'item 1', 'two' => 'item 2']}

modern:      {var $arr = [one: 'item 1', two: 'item 2']}
```


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

Filtreler herhangi bir ifade için kullanılabilir, sadece bütünü parantez içine alın:

```latte
{var $content = ($text|truncate: 30|upper)}
```


Operatör `in` .[#toc-operator-in]
---------------------------------

`in` operatörü `in_array()` fonksiyonunun yerine kullanılabilir. Karşılaştırma her zaman katıdır:

```latte
{* gibi in_array($item, $items, true) *}
{if $item in $items}
	...
{/if}
```


Tarihe Açılan Bir Pencere .[#toc-a-window-into-history]
-------------------------------------------------------

Latte, tarihi boyunca, birkaç yıl sonra PHP'nin kendisinde ortaya çıkan bir dizi sözdizimsel şekerleme ile ortaya çıkmıştır. Örneğin, Latte'de dizileri şu şekilde yazmak mümkündü `[1, 2, 3]` yerine `array(1, 2, 3)` veya PHP'de mümkün olmadan çok önce nullsafe operatörünü `$obj?->foo` kullanabilir. Latte ayrıca PHP'nin bugünkü `...$arr` operatörüne eşdeğer olan `(expand) $arr` dizi genişletme operatörünü de tanıttı.

 `?->` nullsafe işlecine benzeyen, ancak değişken mevcut değilse hata vermeyen undefined-safe işleci `??->` tarihsel nedenlerle oluşturulmuştur ve bugün standart PHP işlecini `?->` kullanmanızı öneririz.


Latte'deki PHP Sınırlamaları .[#toc-php-limitations-in-latte]
=============================================================

Latte'de sadece PHP ifadeleri yazılabilir. Yani, noktalı virgül ile biten ifadeler kullanılamaz. Latte'nin [etiketlerini |tags] sunduğu `if`, `foreach`, `switch`, `return`, `try`, `throw` ve diğerleri gibi sınıfları bildiremez veya [kontrol yapılarını |https://www.php.net/manual/en/language.control-structures.php] kullanamazsınız.
Ayrıca [nitelikleri |https://www.php.net/manual/en/language.attributes.php], [geri |https://www.php.net/manual/en/language.operators.execution.php] işaretlerini veya [sihirli sabitleri |https://www.php.net/manual/en/language.constants.magic.php] kullanamazsınız.
`unset`, `echo`, `include`, `require`, `exit`, `eval` bile kullanamazsınız, çünkü bunlar işlev değil, özel PHP dili yapılarıdır ve dolayısıyla ifade değildirler. Sadece çok satırlı yorumlar desteklenir `/* ... */`.

Ancak, şablon yazarının sorumluluğunda `{php ...}` etiketinde herhangi bir PHP kodunu kullanmanıza olanak tanıyan [RawPhpExtension |develop#RawPhpExtension] uzantısını etkinleştirerek bu sınırlamaları aşabilirsiniz.

Sözdizimi

Syntax Latte, web tasarımcılarının pratik gereksinimlerinden doğdu. Aksi takdirde gerçek bir meydan okuma olan yapıları zarif bir şekilde yazabileceğiniz en kullanıcı dostu sözdizimini arıyorduk. Aynı zamanda, tüm ifadeler PHP'deki ile tamamen aynı şekilde yazılır, bu nedenle yeni bir dil öğrenmeniz gerekmez. Sadece zaten bildiklerinizden en iyi şekilde faydalanırsınız.

Aşağıda birkaç temel öğeyi gösteren minimal bir şablon bulunmaktadır: etiketler, n:attributes, yorumlar ve filtreler.

{* bu bir yorumdur *}
<ul n:if="$items">               {* n:if is n:atribut *}
{foreach $items as $item}        {* foreach döngüsünü temsil eden etiket *}
	<li>{$item|capitalize}</li>  {* bir değişkeni bir filtre ile yazdıran etiket *}
{/foreach}                       {* döngünün sonu *}
</ul>

Şimdi bu önemli unsurlara ve inanılmaz bir şablon oluşturmanıza nasıl yardımcı olabileceklerine daha yakından bakalım.

Etiketler

Bir şablon, şablon mantığını (örneğin, foreach döngüleri) veya çıktı ifadelerini kontrol eden etiketler içerir. Her ikisi için de tek bir sınırlayıcı { ... } kullanılır, böylece diğer sistemlerde olduğu gibi hangi durumda hangi sınırlayıcıyı kullanacağınızı düşünmeniz gerekmez. Eğer { karakterinin ardından bir tırnak işareti veya boşluk gelirse, Latte bunu bir etiketin başlangıcı olarak kabul etmez, böylece şablonlarınızda JavaScript yapılarını, JSON'u veya CSS kurallarını sorunsuz bir şekilde kullanabilirsiniz.

Tüm etiketlere genel bak ışı görün. Ayrıca, özel etiketler de oluşturabilirsiniz.

Latte PHP'yi Anlıyor

Etiketlerin içinde iyi bildiğiniz PHP ifadelerini kullanabilirsiniz:

Buna ek olarak, Latte PHP sözdizimine birkaç güzel uzantı ekler.

n:öznitelikler

Tek bir HTML öğesi üzerinde çalışan {if} … {/if} gibi her bir çift etiket n:attribute notasyonunda yazılabilir. Örneğin, yukarıdaki örnekte yer alan {foreach} bu şekilde de yazılabilir:

<ul n:if="$items">
	<li n:foreach="$items as $item">{$item|capitalize}</li>
</ul>

İşlevsellik daha sonra yazıldığı HTML öğesine karşılık gelir:

{var $items = ['I', '♥', 'Latte']}

<p n:foreach="$items as $item">{$item}</p>

Baskılar:

<p>I</p>
<p>♥</p>
<p>Latte</p>

inner- önekini kullanarak davranışı değiştirebilir, böylece işlevselliğin yalnızca öğenin gövdesine uygulanmasını sağlayabiliriz:

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

Baskılar:

<div>
	<p>I</p>
	<hr>
	<p>♥</p>
	<hr>
	<p>Latte</p>
	<hr>
</div>

Veya tag- önekini kullanarak işlevsellik yalnızca HTML etiketlerine uygulanır:

<p><a href={$url} n:tag-if="$url">Title</a></p>

$url değişkeninin değerine bağlı olarak bu yazdırılacaktır:

// when $url is empty
<p>Title</p>

// when $url equals 'https://nette.org'
<p><a href="https://nette.org">Title</a></p>

Bununla birlikte, n:attributes sadece çift etiketler için bir kısayol değildir, bazı saf n:attribute'lar da vardır, örneğin kodlayıcının en iyi arkadaşı n: class.

Filtreler

Standart filtrelerin özetine bakın.

Latte, boru işareti gösterimini kullanarak filtreleri çağırmaya izin verir (önceki boşluğa izin verilir):

<h1>{$heading|upper}</h1>

Filtreler zincirleme olabilir, bu durumda soldan sağa doğru sırayla uygulanırlar:

<h1>{$heading|lower|capitalize}</h1>

Parametreler filtre adından sonra iki nokta üst üste veya virgülle ayrılmış olarak konur:

<h1>{$heading|truncate:20,''}</h1>

İfade üzerinde filtreler uygulanabilir:

{var $name = ($title|upper) . ($subtitle|lower)}

Blokta:

<h1>{block |lower}{$heading}{/block}</h1>

Veya doğrudan değer üzerinde (ile birlikte {=expr} etiketi):

<h1>{='  Hello world  '|trim}<h1>

Dinamik HTML Etiketleri

Latte, etiket adlarında esnekliğe ihtiyaç duyduğunuzda yararlı olan dinamik HTML etiketlerini destekler:

<h{$level}>Heading</h{$level}>

Örneğin, yukarıdaki kod şunları üretebilir <h1>Heading</h1> veya <h2>Heading</h2> değişkeninin değerine bağlı olarak $level. Latte'deki dinamik HTML etiketleri her zaman eşleştirilmelidir. Alternatifleri n:tag.

Latte güvenli bir şablonlama sistemi olduğundan, ortaya çıkan etiket adının geçerli olup olmadığını ve istenmeyen veya kötü amaçlı değerler içermediğini kontrol eder. Ayrıca, son etiket adının her zaman açılış etiketi adıyla aynı olmasını sağlar.

Yorumlar

Yorumlar bu şekilde yazılır ve çıktıya girmez:

{* Bu Latte dilinde bir yorumdur *}

PHP yorumları etiketlerin içinde çalışır:

{include 'file.info', /* value: 123 */}

Sözdizimsel Şeker

Tırnak İşareti Olmayan Dizeler

Basit dizeler için tırnak işaretleri atlanabilir:

as in PHP:   {var $arr = ['hello', 'btn--default', '€']}

abbreviated: {var $arr = [hello, btn--default, €]}

Basit dizeler yalnızca harflerden, rakamlardan, alt çizgilerden, tire işaretlerinden ve noktalardan oluşan dizelerdir. Bir rakamla başlamamalı ve bir tire ile başlamamalı veya bitmemelidir. Yalnızca büyük harflerden ve alt çizgilerden oluşmamalıdır, çünkü o zaman bir sabit olarak kabul edilir (örn. PHP_VERSION). Ve and, array, clone, default, false, in, instanceof, new, null, or, return, true, xor anahtar kelimeleriyle çakışmamalıdır.

Kısa Üçlü Operatör

Üçlü işlecin üçüncü değeri boşsa, atlanabilir:

as in PHP:   {$stock ? 'In stock' : ''}

abbreviated: {$stock ? 'In stock'}

Dizide Modern Anahtar Notasyonu

Dizi anahtarları, fonksiyonlar çağrılırken adlandırılmış parametrelere benzer şekilde yazılabilir:

as in PHP:   {var $arr = ['one' => 'item 1', 'two' => 'item 2']}

modern:      {var $arr = [one: 'item 1', two: 'item 2']}

Filtreler

Filtreler herhangi bir ifade için kullanılabilir, sadece bütünü parantez içine alın:

{var $content = ($text|truncate: 30|upper)}

Operatör in

in operatörü in_array() fonksiyonunun yerine kullanılabilir. Karşılaştırma her zaman katıdır:

{* gibi in_array($item, $items, true) *}
{if $item in $items}
	...
{/if}

Tarihe Açılan Bir Pencere

Latte, tarihi boyunca, birkaç yıl sonra PHP'nin kendisinde ortaya çıkan bir dizi sözdizimsel şekerleme ile ortaya çıkmıştır. Örneğin, Latte'de dizileri şu şekilde yazmak mümkündü [1, 2, 3] yerine array(1, 2, 3) veya PHP'de mümkün olmadan çok önce nullsafe operatörünü $obj?->foo kullanabilir. Latte ayrıca PHP'nin bugünkü ...$arr operatörüne eşdeğer olan (expand) $arr dizi genişletme operatörünü de tanıttı.

?-> nullsafe işlecine benzeyen, ancak değişken mevcut değilse hata vermeyen undefined-safe işleci ??-> tarihsel nedenlerle oluşturulmuştur ve bugün standart PHP işlecini ?-> kullanmanızı öneririz.

Latte'deki PHP Sınırlamaları

Latte'de sadece PHP ifadeleri yazılabilir. Yani, noktalı virgül ile biten ifadeler kullanılamaz. Latte'nin etiketlerini sunduğu if, foreach, switch, return, try, throw ve diğerleri gibi sınıfları bildiremez veya kontrol yapılarını kullanamazsınız. Ayrıca nitelikleri, geri işaretlerini veya sihirli sabitleri kullanamazsınız. unset, echo, include, require, exit, eval bile kullanamazsınız, çünkü bunlar işlev değil, özel PHP dili yapılarıdır ve dolayısıyla ifade değildirler. Sadece çok satırlı yorumlar desteklenir /* ... */.

Ancak, şablon yazarının sorumluluğunda {php ...} etiketinde herhangi bir PHP kodunu kullanmanıza olanak tanıyan RawPhpExtension uzantısını etkinleştirerek bu sınırlamaları aşabilirsiniz.