Nette Documentation Preview

syntax
Dicas e truques
***************


Editores e IDE .[#toc-editors-and-ide]
======================================

Escreva os modelos em um editor ou IDE que tenha suporte para Latte. Será muito mais agradável.

- NetBeans IDE tem suporte integrado
- PhpStorm: instale o [plugin Latte |https://plugins.jetbrains.com/plugin/7457-latte] `Settings > Plugins > Marketplace`
- Código VS: procure no markerplace pelo plug-in [Nette Latte + Neon |https://marketplace.visualstudio.com/items?itemName=Kasik96.latte] ou [Nette Latte templates |https://marketplace.visualstudio.com/items?itemName=smuuf.latte-lang]
- Texto Sublime 3: em Package Control find and install `Nette` e selecione Latte in `View > Syntax`
- em editores antigos usam Smarty highlighting para arquivos .latte

O plugin para PhpStorm é muito avançado e pode perfeitamente sugerir código PHP. Para funcionar de forma ideal, use [modelos datilografados |type-system].

[* latte-phpstorm-plugin.webp *]

O suporte para o Latte também pode ser encontrado no código de barras [Prism.js |https://prismjs.com/#supported-languages] e no editor [Ace |https://ace.c9.io].


Latte Inside JavaScript ou CSS .[#toc-latte-inside-javascript-or-css]
=====================================================================

O Latte pode ser usado com muito conforto dentro do JavaScript ou CSS. Mas como evitar que o Latte seja equivocadamente considerado código JavaScript ou estilo CSS como uma tag Latte?

```latte
<style>
	/* ERROR: interprets as tag {color} */
	body {color: blue}
</style>

<script>
	// ERROR: interprets as tag {id}
	var obj = {id: 123};
</script>
```

**Opção 1***

Evite situações em que uma carta siga imediatamente um `{`, seja inserindo um espaço, quebra de linha ou aspas entre eles:

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

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

**Opção 2***

Desligue completamente o processamento de tags Latte dentro de um elemento usando a [sintaxe n:syntax |tags#syntax]:

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

**Opção 3***

Mude a sintaxe da etiqueta Latte para o elemento de dupla cinta dentro do elemento:

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

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

Em JavaScript, [não coloque variável entre aspas |tags#Printing in JavaScript].


Substituição para `use` Cláusula .[#toc-replacement-for-use-clause]
===================================================================

Como substituir as cláusulas `use` utilizadas no PHP para que você não tenha que escrever um namespace ao acessar uma classe? Exemplo em PHP:

```php
use Pets\Model\Dog;

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

**Opção 1***

Em vez da cláusula `use` armazenar o nome da classe em uma variável e depois em vez de `Dog` usar `$Dog`:

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

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

**Opção 2***

Se o objeto `$dog` é uma instância de `Pets\Model\Dog`, então `{if $dog->status === $dog::StatusHungry}` pode ser usado.


Geração de XML em Latte .[#toc-generating-xml-in-latte]
=======================================================

O Latte pode gerar qualquer formato de texto (HTML, XML, CSV, iCal, etc.), no entanto, para escapar adequadamente dos dados exibidos, devemos dizer-lhe qual formato estamos gerando. O [`{contentType}` |tags#contentType] é usada para isso.

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

Então, por exemplo, podemos gerar um mapa do site de maneira semelhante:

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


Passagem de dados de um modelo incluído .[#toc-passing-data-from-an-included-template]
======================================================================================

As variáveis que criamos com `{var}` ou `{default}` no modelo incluído só existem nele e não estão disponíveis no modelo incluído.
Se quisermos passar alguns dados do modelo incluído de volta ao modelo incluído, uma das opções é passar um objeto para o modelo e definir os dados para ele.

Modelo principal:

```latte
{* cria um objeto vazio $vars *}
{var $vars = (object) null}

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

{* agora contém foo de propriedade *}
{$vars->foo}
```

Modelo incluído `included.latte`:

```latte
{* escrever dados para o foo da propriedade *}
{var $vars->foo = 123}
```

Dicas e truques

Editores e IDE

Escreva os modelos em um editor ou IDE que tenha suporte para Latte. Será muito mais agradável.

  • NetBeans IDE tem suporte integrado
  • PhpStorm: instale o plugin Latte Settings > Plugins > Marketplace
  • Código VS: procure no markerplace pelo plug-in Nette Latte + Neon ou Nette Latte templates
  • Texto Sublime 3: em Package Control find and install Nette e selecione Latte in View > Syntax
  • em editores antigos usam Smarty highlighting para arquivos .latte

O plugin para PhpStorm é muito avançado e pode perfeitamente sugerir código PHP. Para funcionar de forma ideal, use modelos datilografados.

O suporte para o Latte também pode ser encontrado no código de barras Prism.js e no editor Ace.

Latte Inside JavaScript ou CSS

O Latte pode ser usado com muito conforto dentro do JavaScript ou CSS. Mas como evitar que o Latte seja equivocadamente considerado código JavaScript ou estilo CSS como uma tag Latte?

<style>
	/* ERROR: interprets as tag {color} */
	body {color: blue}
</style>

<script>
	// ERROR: interprets as tag {id}
	var obj = {id: 123};
</script>

**Opção 1***

Evite situações em que uma carta siga imediatamente um {, seja inserindo um espaço, quebra de linha ou aspas entre eles:

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

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

**Opção 2***

Desligue completamente o processamento de tags Latte dentro de um elemento usando a sintaxe n:syntax:

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

**Opção 3***

Mude a sintaxe da etiqueta Latte para o elemento de dupla cinta dentro do elemento:

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

	{{if $cond}} alert(); {{/if}} // this is Latte tag
</script>

Em JavaScript, não coloque variável entre aspas.

Substituição para use Cláusula

Como substituir as cláusulas use utilizadas no PHP para que você não tenha que escrever um namespace ao acessar uma classe? Exemplo em PHP:

use Pets\Model\Dog;

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

**Opção 1***

Em vez da cláusula use armazenar o nome da classe em uma variável e depois em vez de Dog usar $Dog:

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

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

**Opção 2***

Se o objeto $dog é uma instância de Pets\Model\Dog, então {if $dog->status === $dog::StatusHungry} pode ser usado.

Geração de XML em Latte

O Latte pode gerar qualquer formato de texto (HTML, XML, CSV, iCal, etc.), no entanto, para escapar adequadamente dos dados exibidos, devemos dizer-lhe qual formato estamos gerando. O {contentType} é usada para isso.

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

Então, por exemplo, podemos gerar um mapa do site de maneira semelhante:

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

Passagem de dados de um modelo incluído

As variáveis que criamos com {var} ou {default} no modelo incluído só existem nele e não estão disponíveis no modelo incluído. Se quisermos passar alguns dados do modelo incluído de volta ao modelo incluído, uma das opções é passar um objeto para o modelo e definir os dados para ele.

Modelo principal:

{* cria um objeto vazio $vars *}
{var $vars = (object) null}

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

{* agora contém foo de propriedade *}
{$vars->foo}

Modelo incluído included.latte:

{* escrever dados para o foo da propriedade *}
{var $vars->foo = 123}