Nette Documentation Preview

syntax
Wskazówki i triki
*****************


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

Pisz szablony w edytorze lub IDE, który ma wsparcie dla Latte. Będzie to znacznie przyjemniejsze.

- PhpStorm: zainstaluj w `Settings > Plugins > Marketplace` [wtyczkę Latte|https://plugins.jetbrains.com/plugin/7457-latte]
- 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] lub najnowszą [Nette for VS Code |https://marketplace.visualstudio.com/items?itemName=franken-ui.nette-for-vscode] wtyczkę
- NetBeans IDE: natywne wsparcie Latte jest częścią instalacji
- Sublime Text 3: w Package Control znajdź i zainstaluj pakiet `Nette` i wybierz Latte w `View > Syntax`
- w starych edytorach użyj dla plików .latte podświetlania Smarty

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

[* latte-phpstorm-plugin.webp *]

Wsparcie dla Latte znajdziesz również w webowym podświetlaczu kodu [Prism.js|https://prismjs.com/#supported-languages] i edytorze [Ace|https://ace.c9.io].


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

Latte można bardzo wygodnie używać również wewnątrz JavaScriptu lub CSS. Jak jednak uniknąć sytuacji, w której Latte błędnie uznałoby kod JavaScript lub styl CSS za znacznik Latte?

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

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

**Wariant 1**

Unikaj sytuacji, w której litera następuje bezpośrednio po `{`, na przykład wstawiając przed nią spację, znak nowej linii lub cudzysłów:

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

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

**Wariant 2**

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

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

**Wariant 3**

Przełącz wewnątrz elementu składnię znaczników Latte na podwójne nawiasy klamrowe:

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

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

W JavaScript [nie pisze się cudzysłowów wokół zmiennej |tags#Wyświetlanie w JavaScript].


Zastąpienie klauzuli `use` w Latte
==================================

Jak w Latte zastąpić klauzule `use`, które są używane w PHP, aby nie trzeba było pisać przestrzeni nazw przy dostępie do klasy? Przykład w PHP:

```php
use Pets\Model\Dog;

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

**Wariant 1**

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

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

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

**Wariant 2**

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


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

Latte może generować dowolny format tekstowy (HTML, XML, CSV, iCal itp.), jednak aby poprawnie escapować wyświetlane dane, musimy mu powiedzieć, jaki format generujemy. Do tego służy znacznik [`{contentType}` |tags#contentType].

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

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

```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, które tworzymy za pomocą `{var}` czy `{default}` w dołączonym szablonie, istnieją tylko w nim i nie są dostępne w szablonie dołączającym. Jeśli chcielibyśmy przekazać jakieś dane z dołączonego szablonu z powrotem do dołączającego, jedną z możliwości jest przekazanie do szablonu obiektu i włożenie do niego danych.

Główny szablon:

```latte
{* tworzy 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}
```

Wskazówki i triki

Edytory i IDE

Pisz szablony w edytorze lub IDE, który ma wsparcie dla Latte. Będzie to znacznie przyjemniejsze.

  • PhpStorm: zainstaluj w Settings > Plugins > Marketplace wtyczkę Latte
  • VS Code: zainstaluj Nette Latte + Neon, Nette Latte templates lub najnowszą Nette for VS Code wtyczkę
  • NetBeans IDE: natywne wsparcie Latte jest częścią instalacji
  • Sublime Text 3: w Package Control znajdź i zainstaluj pakiet Nette i wybierz Latte w View > Syntax
  • w starych edytorach użyj dla plików .latte podświetlania Smarty

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

Wsparcie dla Latte znajdziesz również w webowym podświetlaczu kodu Prism.js i edytorze Ace.

Latte wewnątrz JavaScriptu lub CSS

Latte można bardzo wygodnie używać również wewnątrz JavaScriptu lub CSS. Jak jednak uniknąć sytuacji, w której Latte błędnie uznałoby kod JavaScript lub styl CSS za znacznik Latte?

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

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

Wariant 1

Unikaj sytuacji, w której litera następuje bezpośrednio po {, na przykład wstawiając przed nią spację, znak nowej linii lub cudzysłów:

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

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

Wariant 2

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

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

Wariant 3

Przełącz wewnątrz elementu składnię znaczników Latte na podwójne nawiasy klamrowe:

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

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

W JavaScript nie pisze się cudzysłowów wokół zmiennej.

Zastąpienie klauzuli use w Latte

Jak w Latte zastąpić klauzule use, które są używane w PHP, aby nie trzeba było pisać przestrzeni nazw przy dostępie do klasy? Przykład w PHP:

use Pets\Model\Dog;

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

Wariant 1

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

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

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

Wariant 2

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

Generowanie XML w Latte

Latte może generować dowolny format tekstowy (HTML, XML, CSV, iCal itp.), jednak aby poprawnie escapować wyświetlane dane, musimy mu powiedzieć, jaki format generujemy. Do tego służy znacznik {contentType}.

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

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

{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, które tworzymy za pomocą {var} czy {default} w dołączonym szablonie, istnieją tylko w nim i nie są dostępne w szablonie dołączającym. Jeśli chcielibyśmy przekazać jakieś dane z dołączonego szablonu z powrotem do dołączającego, jedną z możliwości jest przekazanie do szablonu obiektu i włożenie do niego danych.

Główny szablon:

{* tworzy 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}