Nette Documentation Preview

syntax
Porady i sztuczki
*****************


Edytory i IDE
=============

Szablony pisz w edytorze lub IDE, które obsługuje Latte. Będzie o wiele przyjemniej.

- PhpStorm: zainstaluj [plugin Latte|https://plugins.jetbrains.com/plugin/24218-latte-support] w `Settings > Plugins > Marketplace`
- VS Code: zainstaluj [Nette Latte + Neon|https://marketplace.visualstudio.com/items?itemName=Kasik96.latte], [Nette Latte templates|https://marketplace.visualstudio.com/items?itemName=smuuf.latte-lang] albo najnowszy plugin [Nette for VS Code |https://marketplace.visualstudio.com/items?itemName=franken-ui.nette-for-vscode]
- NetBeans IDE: natywna obsługa Latte jest częścią instalacji
- Sublime Text 3: w Package Control znajdź i zainstaluj pakiet `Nette`, a w `View > Syntax` wybierz Latte
- w starszych edytorach używaj dla plików `.latte` podświetlania Smarty

Plugin do PhpStorm jest bardzo zaawansowany i potrafi doskonale podpowiadać kod PHP. Aby działał optymalnie, używaj [typowanych szablonów|type-system].

[* latte-phpstorm-plugin.webp *]

Obsługę Latte znajdziesz też w webowym podświetlaczu kodu [Prism.js|https://prismjs.com/#supported-languages] i w edytorze [Ace|https://ace.c9.io].


Latte wewnątrz JavaScriptu lub CSS
==================================

Latte da się bardzo wygodnie używać wewnątrz JavaScriptu lub CSS. Jak jednak uniknąć sytuacji, w której Latte omyłkowo uzna kod JavaScriptu albo style CSS za tagi Latte?

```latte
<style>
	/* BŁĄD: zinterpretuje jako tag {color} */
	body {color: blue}
</style>

<script>
	// BŁĄD: zinterpretuje jako tag {id}
	var obj = {id: 123};
</script>
```

**Możliwość 1**

Unikaj sytuacji, w których bezpośrednio po `{` następuje litera, na przykład wstawiając przed nią spację, nowy wiersz albo cudzysłów:

```latte
<style>
	body {
		color: blue
	}
</style>

<script>
	var obj = {'id': 123};
</script>
```

**Możliwość 2**

Całkowicie wyłącz przetwarzanie tagów Latte wewnątrz elementu za pomocą [n:syntax |tags#{syntax}]:

```latte
<script n:syntax="off">
	var obj = {id: 123};
</script>
```

**Możliwość 3**

Przełącz składnię tagów Latte wewnątrz elementu na podwójne klamry:

```latte
<script n:syntax="double">
	var obj = {id: 123};          // to jest JavaScript

	{{if $cond}} alert(); {{/if}} // to jest tag Latte
</script>
```

W JavaScripcie [nie umieszczaj zmiennej w cudzysłowach |tags#Wypisywanie w JavaScripcie].


Zamiennik klauzuli `use` w Latte
================================

Czym w Latte zastąpić klauzule `use` używane w PHP, aby przy odwołaniu do klasy nie trzeba było pisać przestrzeni nazw? Przykład w PHP:

```php
use Pets\Model\Dog;

if ($dog->status === Dog::StatusHungry) {
	// ...
}
```

**Możliwość 1**

Zamiast klauzuli `use` zapisz nazwę klasy do zmiennej, a następnie używaj `$Dog` zamiast `Dog`:

```latte
{var $Dog = Pets\Model\Dog::class}

<div>
	{if $dog->status === $Dog::StatusHungry}
		...
	{/if}
</div>
```

**Możliwość 2**

Jeśli obiekt `$dog` jest instancją `Pets\Model\Dog`, można użyć `{if $dog->status === $dog::StatusHungry}`.


Generowanie XML w Latte
=======================

Latte potrafi generować dowolny format tekstowy (HTML, XML, CSV, iCal itd.), ale aby poprawnie escapować wypisywane dane, musimy mu powiedzieć, jaki format generujemy. Służy do tego tag [`{contentType}` |tags#{contentType}].

```latte
{contentType application/xml}
<?xml version="1.0" encoding="UTF-8"?>
...
```

Następnie możemy w podobny sposób wygenerować na przykład mapę strony:

```latte
{contentType application/xml}
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" >
	<url n:foreach="$urls as $url">
		<loc>{$url->loc}</loc>
		<lastmod>{$url->lastmod->format('Y-m-d')}</lastmod>
		<changefreq>{$url->frequency}</changefreq>
		<priority>{$url->priority}</priority>
	</url>
</urlset>
```


Przekazywanie danych z dołączonego szablonu
===========================================

Zmienne utworzone przez `{var}` albo `{default}` w dołączonym szablonie istnieją tylko w tym szablonie i nie są dostępne w szablonie dołączającym. Jeśli chcesz przekazać jakieś dane z dołączonego szablonu z powrotem do dołączającego, jedną z możliwości jest przekazanie do szablonu obiektu i zapisanie danych do niego.

Szablon główny:

```latte
{* tworzymy pusty obiekt $vars *}
{var $vars = (object) null}

{include 'included.latte', vars: $vars}

{* teraz zawiera właściwość foo *}
{$vars->foo}
```

Dołączony szablon `included.latte`:

```latte
{* zapisujemy dane do właściwości foo *}
{var $vars->foo = 123}
```

Porady i sztuczki

Edytory i IDE

Szablony pisz w edytorze lub IDE, które obsługuje Latte. Będzie o wiele przyjemniej.

  • PhpStorm: zainstaluj plugin Latte w Settings > Plugins > Marketplace
  • VS Code: zainstaluj Nette Latte + Neon, Nette Latte templates albo najnowszy plugin Nette for VS Code
  • NetBeans IDE: natywna obsługa Latte jest częścią instalacji
  • Sublime Text 3: w Package Control znajdź i zainstaluj pakiet Nette, a w View > Syntax wybierz Latte
  • w starszych edytorach używaj dla plików .latte podświetlania Smarty

Plugin do PhpStorm jest bardzo zaawansowany i potrafi doskonale podpowiadać kod PHP. Aby działał optymalnie, używaj typowanych szablonów.

Obsługę Latte znajdziesz też w webowym podświetlaczu kodu Prism.js i w edytorze Ace.

Latte wewnątrz JavaScriptu lub CSS

Latte da się bardzo wygodnie używać wewnątrz JavaScriptu lub CSS. Jak jednak uniknąć sytuacji, w której Latte omyłkowo uzna kod JavaScriptu albo style CSS za tagi Latte?

<style>
	/* BŁĄD: zinterpretuje jako tag {color} */
	body {color: blue}
</style>

<script>
	// BŁĄD: zinterpretuje jako tag {id}
	var obj = {id: 123};
</script>

Możliwość 1

Unikaj sytuacji, w których bezpośrednio po { następuje litera, na przykład wstawiając przed nią spację, nowy wiersz albo cudzysłów:

<style>
	body {
		color: blue
	}
</style>

<script>
	var obj = {'id': 123};
</script>

Możliwość 2

Całkowicie wyłącz przetwarzanie tagów Latte wewnątrz elementu za pomocą n:syntax:

<script n:syntax="off">
	var obj = {id: 123};
</script>

Możliwość 3

Przełącz składnię tagów Latte wewnątrz elementu na podwójne klamry:

<script n:syntax="double">
	var obj = {id: 123};          // to jest JavaScript

	{{if $cond}} alert(); {{/if}} // to jest tag Latte
</script>

W JavaScripcie nie umieszczaj zmiennej w cudzysłowach.

Zamiennik klauzuli use w Latte

Czym w Latte zastąpić klauzule use używane w PHP, aby przy odwołaniu do klasy nie trzeba było pisać przestrzeni nazw? Przykład w PHP:

use Pets\Model\Dog;

if ($dog->status === Dog::StatusHungry) {
	// ...
}

Możliwość 1

Zamiast klauzuli use zapisz nazwę klasy do zmiennej, a następnie używaj $Dog zamiast Dog:

{var $Dog = Pets\Model\Dog::class}

<div>
	{if $dog->status === $Dog::StatusHungry}
		...
	{/if}
</div>

Możliwość 2

Jeśli obiekt $dog jest instancją Pets\Model\Dog, można użyć {if $dog->status === $dog::StatusHungry}.

Generowanie XML w Latte

Latte potrafi generować dowolny format tekstowy (HTML, XML, CSV, iCal itd.), ale aby poprawnie escapować wypisywane dane, musimy mu powiedzieć, jaki format generujemy. Służy do tego tag {contentType}.

{contentType application/xml}
<?xml version="1.0" encoding="UTF-8"?>
...

Następnie możemy w podobny sposób wygenerować na przykład mapę strony:

{contentType application/xml}
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" >
	<url n:foreach="$urls as $url">
		<loc>{$url->loc}</loc>
		<lastmod>{$url->lastmod->format('Y-m-d')}</lastmod>
		<changefreq>{$url->frequency}</changefreq>
		<priority>{$url->priority}</priority>
	</url>
</urlset>

Przekazywanie danych z dołączonego szablonu

Zmienne utworzone przez {var} albo {default} w dołączonym szablonie istnieją tylko w tym szablonie i nie są dostępne w szablonie dołączającym. Jeśli chcesz przekazać jakieś dane z dołączonego szablonu z powrotem do dołączającego, jedną z możliwości jest przekazanie do szablonu obiektu i zapisanie danych do niego.

Szablon główny:

{* tworzymy pusty obiekt $vars *}
{var $vars = (object) null}

{include 'included.latte', vars: $vars}

{* teraz zawiera właściwość foo *}
{$vars->foo}

Dołączony szablon included.latte:

{* zapisujemy dane do właściwości foo *}
{var $vars->foo = 123}