Nette Documentation Preview

syntax
Trucos y consejos
*****************


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

Escriba plantillas en un editor o IDE que tenga soporte para Latte. Será mucho más agradable.

- NetBeans IDE tiene soporte incorporado
- PhpStorm: instale el [plugin |https://plugins.jetbrains.com/plugin/7457-latte] Latte en `Settings > Plugins > Marketplace`
- VS Code: busque en markerplace el plugin de [plantillas |https://marketplace.visualstudio.com/items?itemName=smuuf.latte-lang] [Nette Latte + Neon |https://marketplace.visualstudio.com/items?itemName=Kasik96.latte] o [Nette Latte |https://marketplace.visualstudio.com/items?itemName=smuuf.latte-lang]
- Sublime Text 3: en Package Control busque e instale el paquete `Nette` y seleccione Latte en `View > Syntax`
- en editores antiguos utilice Smarty para resaltar los archivos .latte

El plugin para PhpStorm es muy avanzado y puede perfectamente sugerir código PHP. Para trabajar de forma óptima, utilice [plantillas tipadas |type-system].

[* latte-phpstorm-plugin.webp *]

También se puede encontrar soporte para Latte en el resaltador de código web [Prism.js |https://prismjs.com/#supported-languages] y en el editor [Ace |https://ace.c9.io].


Latte dentro de JavaScript o CSS .[#toc-latte-inside-javascript-or-css]
=======================================================================

Latte puede utilizarse muy cómodamente dentro de JavaScript o CSS. Pero, ¿cómo evitar que Latte considere erróneamente el código JavaScript o el estilo CSS como una etiqueta Latte?

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

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

**Opción 1**

Evite situaciones en las que una letra siga inmediatamente a una `{`, ya sea insertando un espacio, un salto de línea o una comilla entre ellas:

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

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

**Opción 2**

Desactivar completamente el procesamiento de etiquetas Latte dentro de un elemento utilizando [n:syntax |tags#syntax]:

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

**Opción 3**

Cambiar la sintaxis de la etiqueta Latte a doble llave dentro del elemento:

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

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

En JavaScript, [no ponga la variable entre comillas |tags#Printing in JavaScript].


Sustitución de la cláusula `use` .[#toc-replacement-for-use-clause]
===================================================================

¿Cómo sustituir las cláusulas `use` utilizadas en PHP para no tener que escribir un namespace al acceder a una clase? Ejemplo PHP:

```php
use Pets\Model\Dog;

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

**Opción 1**

En lugar de la cláusula `use` almacene el nombre de la clase en una variable y luego en lugar de `Dog` utilice `$Dog`:

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

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

**Opción 2**

Si el objeto `$dog` es una instancia de `Pets\Model\Dog`, entonces se puede utilizar `{if $dog->status === $dog::StatusHungry}`.


Generación de XML en Latte .[#toc-generating-xml-in-latte]
==========================================================

Latte puede generar cualquier formato de texto (HTML, XML, CSV, iCal, etc.), sin embargo, para que escape correctamente de los datos mostrados, debemos indicarle qué formato estamos generando. Para ello se utiliza la etiqueta [`{contentType}` |tags#contentType] se utiliza para ello.

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

Entonces, por ejemplo, podemos generar un mapa del sitio de una manera similar:

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


Pasar datos desde una plantilla incluida .[#toc-passing-data-from-an-included-template]
=======================================================================================

Las variables que creamos con `{var}` o `{default}` en la plantilla incluida sólo existen en ella y no están disponibles en la plantilla incluida.
Si queremos pasar algunos datos de la plantilla incluida de vuelta a la incluida, una de las opciones es pasar un objeto a la plantilla y establecer los datos en él.

Plantilla principal:

```latte
{* creates an empty object $vars *}
{var $vars = (object) null}

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

{* now contains property foo *}
{$vars->foo}
```

Plantilla incluida `included.latte`:

```latte
{* write data to the property foo *}
{var $vars->foo = 123}
```

Trucos y consejos

Editores e IDE

Escriba plantillas en un editor o IDE que tenga soporte para Latte. Será mucho más agradable.

  • NetBeans IDE tiene soporte incorporado
  • PhpStorm: instale el plugin Latte en Settings > Plugins > Marketplace
  • VS Code: busque en markerplace el plugin de plantillas Nette Latte + NeonNette Latte
  • Sublime Text 3: en Package Control busque e instale el paquete Nette y seleccione Latte en View > Syntax
  • en editores antiguos utilice Smarty para resaltar los archivos .latte

El plugin para PhpStorm es muy avanzado y puede perfectamente sugerir código PHP. Para trabajar de forma óptima, utilice plantillas tipadas.

También se puede encontrar soporte para Latte en el resaltador de código web Prism.js y en el editor Ace.

Latte dentro de JavaScript o CSS

Latte puede utilizarse muy cómodamente dentro de JavaScript o CSS. Pero, ¿cómo evitar que Latte considere erróneamente el código JavaScript o el estilo CSS como una etiqueta Latte?

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

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

Opción 1

Evite situaciones en las que una letra siga inmediatamente a una {, ya sea insertando un espacio, un salto de línea o una comilla entre ellas:

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

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

Opción 2

Desactivar completamente el procesamiento de etiquetas Latte dentro de un elemento utilizando n:syntax:

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

Opción 3

Cambiar la sintaxis de la etiqueta Latte a doble llave dentro del elemento:

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

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

En JavaScript, no ponga la variable entre comillas.

Sustitución de la cláusula use

¿Cómo sustituir las cláusulas use utilizadas en PHP para no tener que escribir un namespace al acceder a una clase? Ejemplo PHP:

use Pets\Model\Dog;

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

Opción 1

En lugar de la cláusula use almacene el nombre de la clase en una variable y luego en lugar de Dog utilice $Dog:

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

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

Opción 2

Si el objeto $dog es una instancia de Pets\Model\Dog, entonces se puede utilizar {if $dog->status === $dog::StatusHungry}.

Generación de XML en Latte

Latte puede generar cualquier formato de texto (HTML, XML, CSV, iCal, etc.), sin embargo, para que escape correctamente de los datos mostrados, debemos indicarle qué formato estamos generando. Para ello se utiliza la etiqueta {contentType} se utiliza para ello.

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

Entonces, por ejemplo, podemos generar un mapa del sitio de una manera similar:

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

Pasar datos desde una plantilla incluida

Las variables que creamos con {var} o {default} en la plantilla incluida sólo existen en ella y no están disponibles en la plantilla incluida. Si queremos pasar algunos datos de la plantilla incluida de vuelta a la incluida, una de las opciones es pasar un objeto a la plantilla y establecer los datos en él.

Plantilla principal:

{* creates an empty object $vars *}
{var $vars = (object) null}

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

{* now contains property foo *}
{$vars->foo}

Plantilla incluida included.latte:

{* write data to the property foo *}
{var $vars->foo = 123}