Nette Documentation Preview

syntax
Przekazywanie zmiennych między szablonami
*****************************************

Ten przewodnik wyjaśnia, jak w Latte przekazywane są zmienne między szablonami za pomocą różnych tagów, takich jak `{include}`, `{import}`, `{embed}`, `{layout}`, `{sandbox}` i innych. Dowiesz się także, jak pracować ze zmiennymi wewnątrz tagów `{block}` i `{define}` oraz do czego służy tag `{parameters}`.


Rodzaje zmiennych
-----------------
Zmienne w Latte można podzielić na trzy kategorie według tego, jak i gdzie są definiowane:

**Zmienne wejściowe** to te, które są przekazywane do szablonu z zewnątrz, na przykład ze skryptu PHP albo za pomocą tagu takiego jak `{include}`.

```php
$latte->render('template.latte', ['userName' => 'Jan', 'userAge' => 30]);
```

**Zmienne otaczające** to zmienne istniejące w miejscu konkretnego tagu. Należą do nich wszystkie zmienne wejściowe oraz inne zmienne utworzone tagami takimi jak `{var}`, `{default}` albo wewnątrz pętli `{foreach}`.

```latte
{foreach $users as $user}
	{include 'userBox.latte', user: $user}
{/foreach}
```

**Zmienne jawne** to te, które są podane bezpośrednio w tagu i wysyłane do szablonu docelowego.

```latte
{include 'userBox.latte', name: $user->name, age: $user->age}
```


`{block}`
---------
Tag `{block}` służy do definiowania bloków kodu wielokrotnego użytku, które można dostosowywać lub rozszerzać w szablonach dziedziczących. Zmienne otaczające zdefiniowane przed blokiem są dostępne wewnątrz bloku, ale wszelkie zmiany zmiennych są widoczne tylko w obrębie tego bloku.

```latte
{var $foo = 'original'}
{block example}
	{var $foo = 'modified'}
{/block}

{$foo}    // wypisze: original
```


`{define}`
----------
Tag `{define}` służy do tworzenia bloków, które są renderowane dopiero po wywołaniu przez `{include}`. Zmienne dostępne wewnątrz tych bloków zależą od tego, czy w definicji zadeklarowano parametry. Blok z zadeklarowanymi parametrami ma dostęp zarówno do tych parametrów, jak i do wszystkich zmiennych wejściowych szablonu, w którym został zdefiniowany. Blok bez parametrów ma dostęp do tych zmiennych wejściowych również. W żadnym z przypadków zmienne otaczające nie są dostępne.

```latte
{define hello}
	{* ma dostęp do wszystkich zmiennych wejściowych szablonu *}
{/define}

{define hello $name}
	{* ma dostęp do parametru $name i zmiennych wejściowych *}
{/define}
```


`{parameters}`
--------------
Tag `{parameters}` służy do jawnego zadeklarowania oczekiwanych zmiennych wejściowych na początku szablonu. W ten sposób łatwo udokumentujesz oczekiwane zmienne i ich typy danych. Można też zdefiniować wartości domyślne.

```latte
{parameters int $age, string $name = 'unknown'}
<p>Age: {$age}, Name: {$name}</p>
```


`{include file}`
----------------
Tag `{include file}` służy do wstawienia całego szablonu. Do tego szablonu przekazywane są zarówno zmienne wejściowe szablonu, w którym użyto tagu, jak i zmienne zdefiniowane jawnie. Szablon docelowy może jednak ograniczyć zakres za pomocą `{parameters}`.

```latte
{include 'profile.latte', userId: $user->id}
```


`{include block}`
-----------------
Przy wstawianiu bloku zdefiniowanego w tym samym szablonie przekazywane są do niego wszystkie zmienne otaczające i jawnie zdefiniowane:

```latte
{define blockName}
	<p>Name: {$name}, Age: {$age}</p>
{/define}

{var $name = 'Jan', $age = 30}
{include blockName}
```

W tym przykładzie do bloku `blockName` przekazywane są zmienne `$name` i `$age`. Tak samo zachowuje się `{include parent}`.

Przy wstawianiu bloku z innego szablonu przekazywane są tylko zmienne wejściowe i zmienne zdefiniowane jawnie. Zmienne otaczające nie są automatycznie dostępne.

```latte
{include blockInOtherTemplate, name: $name, age: $age}
```


`{layout}` lub `{extends}`
--------------------------
Te tagi definiują layout, do którego przekazywane są zmienne wejściowe szablonu potomnego oraz zmienne utworzone w kodzie przed blokami:

```latte
{layout 'layout.latte'}
{var $seo = 'index, follow'}
```

Szablon `layout.latte`:

```latte
<head>
	<meta name="robots" content="{$seo}">
</head>
```


`{embed}`
---------
Tag `{embed}` jest podobny do tagu `{include}`, ale pozwala osadzać bloki w szablonie. W odróżnieniu od `{include}` przekazywane są tylko zmienne zadeklarowane jawnie:

```latte
{embed 'menu.latte', items: $menuItems}
{/embed}
```

W tym przykładzie szablon `menu.latte` ma dostęp tylko do zmiennej `$items`.

Odwrotnie, bloki wewnątrz `{embed}` mają dostęp do wszystkich zmiennych otaczających:

```latte
{var $name = 'Jan'}
{embed 'menu.latte', items: $menuItems}
	{block foo}
		{$name}
	{/block}
{/embed}
```


`{import}`
----------
Tag `{import}` służy do wczytania bloków z innych szablonów. Do importowanych bloków przekazywane są zarówno zmienne wejściowe, jak i zadeklarowane jawnie.

```latte
{import 'buttons.latte'}
```


`{sandbox}`
-----------
Tag `{sandbox}` izoluje szablon w celu bezpiecznego przetwarzania. Zmienne przekazywane są wyłącznie jawnie.

```latte
{sandbox 'secure.latte', data: $secureData}
```

Przekazywanie zmiennych między szablonami

Ten przewodnik wyjaśnia, jak w Latte przekazywane są zmienne między szablonami za pomocą różnych tagów, takich jak {include}, {import}, {embed}, {layout}, {sandbox} i innych. Dowiesz się także, jak pracować ze zmiennymi wewnątrz tagów {block} i {define} oraz do czego służy tag {parameters}.

Rodzaje zmiennych

Zmienne w Latte można podzielić na trzy kategorie według tego, jak i gdzie są definiowane:

Zmienne wejściowe to te, które są przekazywane do szablonu z zewnątrz, na przykład ze skryptu PHP albo za pomocą tagu takiego jak {include}.

$latte->render('template.latte', ['userName' => 'Jan', 'userAge' => 30]);

Zmienne otaczające to zmienne istniejące w miejscu konkretnego tagu. Należą do nich wszystkie zmienne wejściowe oraz inne zmienne utworzone tagami takimi jak {var}, {default} albo wewnątrz pętli {foreach}.

{foreach $users as $user}
	{include 'userBox.latte', user: $user}
{/foreach}

Zmienne jawne to te, które są podane bezpośrednio w tagu i wysyłane do szablonu docelowego.

{include 'userBox.latte', name: $user->name, age: $user->age}

{block}

Tag {block} służy do definiowania bloków kodu wielokrotnego użytku, które można dostosowywać lub rozszerzać w szablonach dziedziczących. Zmienne otaczające zdefiniowane przed blokiem są dostępne wewnątrz bloku, ale wszelkie zmiany zmiennych są widoczne tylko w obrębie tego bloku.

{var $foo = 'original'}
{block example}
	{var $foo = 'modified'}
{/block}

{$foo}    // wypisze: original

{define}

Tag {define} służy do tworzenia bloków, które są renderowane dopiero po wywołaniu przez {include}. Zmienne dostępne wewnątrz tych bloków zależą od tego, czy w definicji zadeklarowano parametry. Blok z zadeklarowanymi parametrami ma dostęp zarówno do tych parametrów, jak i do wszystkich zmiennych wejściowych szablonu, w którym został zdefiniowany. Blok bez parametrów ma dostęp do tych zmiennych wejściowych również. W żadnym z przypadków zmienne otaczające nie są dostępne.

{define hello}
	{* ma dostęp do wszystkich zmiennych wejściowych szablonu *}
{/define}

{define hello $name}
	{* ma dostęp do parametru $name i zmiennych wejściowych *}
{/define}

{parameters}

Tag {parameters} służy do jawnego zadeklarowania oczekiwanych zmiennych wejściowych na początku szablonu. W ten sposób łatwo udokumentujesz oczekiwane zmienne i ich typy danych. Można też zdefiniować wartości domyślne.

{parameters int $age, string $name = 'unknown'}
<p>Age: {$age}, Name: {$name}</p>

{include file}

Tag {include file} służy do wstawienia całego szablonu. Do tego szablonu przekazywane są zarówno zmienne wejściowe szablonu, w którym użyto tagu, jak i zmienne zdefiniowane jawnie. Szablon docelowy może jednak ograniczyć zakres za pomocą {parameters}.

{include 'profile.latte', userId: $user->id}

{include block}

Przy wstawianiu bloku zdefiniowanego w tym samym szablonie przekazywane są do niego wszystkie zmienne otaczające i jawnie zdefiniowane:

{define blockName}
	<p>Name: {$name}, Age: {$age}</p>
{/define}

{var $name = 'Jan', $age = 30}
{include blockName}

W tym przykładzie do bloku blockName przekazywane są zmienne $name i $age. Tak samo zachowuje się {include parent}.

Przy wstawianiu bloku z innego szablonu przekazywane są tylko zmienne wejściowe i zmienne zdefiniowane jawnie. Zmienne otaczające nie są automatycznie dostępne.

{include blockInOtherTemplate, name: $name, age: $age}

{layout} lub {extends}

Te tagi definiują layout, do którego przekazywane są zmienne wejściowe szablonu potomnego oraz zmienne utworzone w kodzie przed blokami:

{layout 'layout.latte'}
{var $seo = 'index, follow'}

Szablon layout.latte:

<head>
	<meta name="robots" content="{$seo}">
</head>

{embed}

Tag {embed} jest podobny do tagu {include}, ale pozwala osadzać bloki w szablonie. W odróżnieniu od {include} przekazywane są tylko zmienne zadeklarowane jawnie:

{embed 'menu.latte', items: $menuItems}
{/embed}

W tym przykładzie szablon menu.latte ma dostęp tylko do zmiennej $items.

Odwrotnie, bloki wewnątrz {embed} mają dostęp do wszystkich zmiennych otaczających:

{var $name = 'Jan'}
{embed 'menu.latte', items: $menuItems}
	{block foo}
		{$name}
	{/block}
{/embed}

{import}

Tag {import} służy do wczytania bloków z innych szablonów. Do importowanych bloków przekazywane są zarówno zmienne wejściowe, jak i zadeklarowane jawnie.

{import 'buttons.latte'}

{sandbox}

Tag {sandbox} izoluje szablon w celu bezpiecznego przetwarzania. Zmienne przekazywane są wyłącznie jawnie.

{sandbox 'secure.latte', data: $secureData}