Nette Documentation Preview

syntax
Consigli e trucchi
******************


Editor e IDE
============

Scrivete i template in un editor o in un IDE che supporti Latte: sarà molto più piacevole.

- PhpStorm: installate il [plugin Latte|https://plugins.jetbrains.com/plugin/24218-latte-support] in `Settings > Plugins > Marketplace`
- VS Code: installate [Nette Latte + Neon|https://marketplace.visualstudio.com/items?itemName=Kasik96.latte], [Nette Latte templates|https://marketplace.visualstudio.com/items?itemName=smuuf.latte-lang] oppure il più recente plugin [Nette for VS Code |https://marketplace.visualstudio.com/items?itemName=franken-ui.nette-for-vscode]
- NetBeans IDE: il supporto nativo per Latte è incluso nell'installazione
- Sublime Text 3: cercate e installate il pacchetto `Nette` in Package Control e scegliete Latte in `View > Syntax`
- negli editor più vecchi, usate l'evidenziazione Smarty per i file `.latte`

Il plugin per PhpStorm è molto avanzato e sa offrire ottimi suggerimenti per il codice PHP. Per un funzionamento ottimale usate i [template tipizzati|type-system].

[* latte-phpstorm-plugin.webp *]

Il supporto per Latte si trova anche nell'evidenziatore di codice per il web [Prism.js|https://prismjs.com/#supported-languages] e nell'editor [Ace|https://ace.c9.io].


Latte dentro JavaScript o CSS
=============================

Latte si può usare in modo molto comodo dentro JavaScript o CSS. Come evitare però le situazioni in cui Latte scambia per tag Latte il codice JavaScript o gli stili CSS?

```latte
<style>
	/* ERRORE: viene interpretato come tag {color} */
	body {color: blue}
</style>

<script>
	// ERRORE: viene interpretato come tag {id}
	var obj = {id: 123};
</script>
```

**Opzione 1**

Evitate le situazioni in cui una lettera segue immediatamente `{`, per esempio inserendo prima uno spazio, un a capo o un apice:

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

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

**Opzione 2**

Disattivate completamente l'elaborazione dei tag Latte all'interno di un elemento con [n:syntax |tags#{syntax}]:

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

**Opzione 3**

Cambiate la sintassi dei tag Latte all'interno dell'elemento in doppie parentesi graffe:

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

	{{if $cond}} alert(); {{/if}} // questo è un tag Latte
</script>
```

In JavaScript, [non mettete le variabili tra apici |tags#Stampare in JavaScript].


Sostituto della clausola `use` in Latte
=======================================

Come sostituire in Latte le clausole `use` usate in PHP, per non dover scrivere il namespace quando si accede a una classe? Esempio in PHP:

```php
use Pets\Model\Dog;

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

**Opzione 1**

Al posto della clausola `use`, salvate il nome della classe in una variabile e usate poi `$Dog` invece di `Dog`:

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

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

**Opzione 2**

Se l'oggetto `$dog` è un'istanza di `Pets\Model\Dog`, si può usare `{if $dog->status === $dog::StatusHungry}`.


Generare XML in Latte
=====================

Latte può generare qualsiasi formato di testo (HTML, XML, CSV, iCal e così via), ma per eseguire correttamente l'escaping dei dati stampati dobbiamo dirgli quale formato stiamo generando. A questo serve il tag [`{contentType}` |tags#{contentType}].

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

Poi possiamo generare, per esempio, una sitemap in modo simile:

```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>
```


Passare dati da un template incluso
===================================

Le variabili create con `{var}` o `{default}` in un template incluso esistono solo all'interno di quel template e non sono disponibili nel template che lo include. Se volete restituire dei dati dal template incluso a quello che lo include, una possibilità è passare al template un oggetto e inserirvi i dati.

Template principale:

```latte
{* crea un oggetto vuoto $vars *}
{var $vars = (object) null}

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

{* ora contiene la proprietà foo *}
{$vars->foo}
```

Template incluso `included.latte`:

```latte
{* scrive i dati nella proprietà foo *}
{var $vars->foo = 123}
```

Consigli e trucchi

Editor e IDE

Scrivete i template in un editor o in un IDE che supporti Latte: sarà molto più piacevole.

  • PhpStorm: installate il plugin Latte in Settings > Plugins > Marketplace
  • VS Code: installate Nette Latte + Neon, Nette Latte templates oppure il più recente plugin Nette for VS Code
  • NetBeans IDE: il supporto nativo per Latte è incluso nell'installazione
  • Sublime Text 3: cercate e installate il pacchetto Nette in Package Control e scegliete Latte in View > Syntax
  • negli editor più vecchi, usate l'evidenziazione Smarty per i file .latte

Il plugin per PhpStorm è molto avanzato e sa offrire ottimi suggerimenti per il codice PHP. Per un funzionamento ottimale usate i template tipizzati.

Il supporto per Latte si trova anche nell'evidenziatore di codice per il web Prism.js e nell'editor Ace.

Latte dentro JavaScript o CSS

Latte si può usare in modo molto comodo dentro JavaScript o CSS. Come evitare però le situazioni in cui Latte scambia per tag Latte il codice JavaScript o gli stili CSS?

<style>
	/* ERRORE: viene interpretato come tag {color} */
	body {color: blue}
</style>

<script>
	// ERRORE: viene interpretato come tag {id}
	var obj = {id: 123};
</script>

Opzione 1

Evitate le situazioni in cui una lettera segue immediatamente {, per esempio inserendo prima uno spazio, un a capo o un apice:

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

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

Opzione 2

Disattivate completamente l'elaborazione dei tag Latte all'interno di un elemento con n:syntax:

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

Opzione 3

Cambiate la sintassi dei tag Latte all'interno dell'elemento in doppie parentesi graffe:

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

	{{if $cond}} alert(); {{/if}} // questo è un tag Latte
</script>

In JavaScript, non mettete le variabili tra apici.

Sostituto della clausola use in Latte

Come sostituire in Latte le clausole use usate in PHP, per non dover scrivere il namespace quando si accede a una classe? Esempio in PHP:

use Pets\Model\Dog;

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

Opzione 1

Al posto della clausola use, salvate il nome della classe in una variabile e usate poi $Dog invece di Dog:

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

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

Opzione 2

Se l'oggetto $dog è un'istanza di Pets\Model\Dog, si può usare {if $dog->status === $dog::StatusHungry}.

Generare XML in Latte

Latte può generare qualsiasi formato di testo (HTML, XML, CSV, iCal e così via), ma per eseguire correttamente l'escaping dei dati stampati dobbiamo dirgli quale formato stiamo generando. A questo serve il tag {contentType}.

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

Poi possiamo generare, per esempio, una sitemap in modo simile:

{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>

Passare dati da un template incluso

Le variabili create con {var} o {default} in un template incluso esistono solo all'interno di quel template e non sono disponibili nel template che lo include. Se volete restituire dei dati dal template incluso a quello che lo include, una possibilità è passare al template un oggetto e inserirvi i dati.

Template principale:

{* crea un oggetto vuoto $vars *}
{var $vars = (object) null}

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

{* ora contiene la proprietà foo *}
{$vars->foo}

Template incluso included.latte:

{* scrive i dati nella proprietà foo *}
{var $vars->foo = 123}