Sintaxis

Syntax Latte nació de las necesidades prácticas de los diseñadores web. Buscábamos la sintaxis más fácil de usar, con la que poder escribir con elegancia construcciones que de otro modo supondrían un verdadero reto. Al mismo tiempo, todas las expresiones se escriben exactamente igual que en PHP, por lo que no es necesario aprender un nuevo lenguaje. Sólo tienes que aprovechar al máximo lo que ya sabes.

A continuación se muestra una plantilla mínima que ilustra algunos elementos básicos: etiquetas, n:attributes, comentarios y filtros.

{* esto es un comentario *}
<ul n:if="$items">                {* n:if es n:atributos *}
{foreach $items as $item}         {* etiqueta que representa el bucle foreach *}
	<li>{$item|capitalize}</li>   {* etiqueta que imprime una variable con un filtro *}
{/foreach}                        {* fin de ciclo *}

Echemos un vistazo más de cerca a estos importantes elementos y cómo pueden ayudarte a construir una plantilla increíble.

Tags

Una plantilla contiene etiquetas que controlan la lógica de la plantilla (por ejemplo, bucles foreach) o las expresiones de salida. Para ambos, se utiliza un único delimitador { ... }, por lo que no hay que pensar qué delimitador utilizar en cada situación, como ocurre con otros sistemas. Si el carácter { va seguido de una comilla o un espacio, Latte no lo considera el comienzo de una etiqueta, por lo que puede utilizar construcciones JavaScript, JSON o reglas CSS en sus plantillas sin ningún problema.

Ver resumen de todas las etiquetas. Además, también puede crear etiquetas personalizadas.

Latte entiende PHP

Puedes usar expresiones PHP que conozcas bien dentro de las etiquetas:

Además, Latte añade varias buenas extensiones a la sintaxis PHP.

n:atributos

Cada etiqueta de par, como {if} … {/if}, que opera sobre un único elemento HTML puede escribirse en notación n:attribute. Por ejemplo, {foreach} en el ejemplo anterior también podría escribirse de esta manera:

<ul n:if="$items">
	<li n:foreach="$items as $item">{$item|capitalize}</li>
</ul>

La funcionalidad corresponde entonces al elemento HTML en el que está escrita:

{var $items = ['I', '♥', 'Latte']}

<p n:foreach="$items as $item">{$item}</p>

Imprime:

<p>I</p>
<p>♥</p>
<p>Latte</p>

Utilizando el prefijo inner- podemos alterar el comportamiento para que la funcionalidad se aplique sólo al cuerpo del elemento:

<div n:inner-foreach="$items as $item">
	<p>{$item}</p>
	<hr>
</div>

Imprime:

<div>
	<p>I</p>
	<hr>
	<p>♥</p>
	<hr>
	<p>Latte</p>
	<hr>
</div>

O utilizando tag- prefijo la funcionalidad se aplica en las etiquetas HTML solamente:

<p><a href="{$url}" n:tag-if="$url">Title</a></p>

Dependiendo del valor de la variable $url se imprimirá:

// cuando $url está vacía
<p>Título</p>

// cuando $url es igual a 'https://nette.org'
<p><a href="https://nette.org">Título</a></p>

Sin embargo, los atributos n:no son sólo un atajo para las etiquetas de pares, también hay algunos atributos n:puros, por ejemplo el mejor amigo del programador, n:class.

Filtros

Consulte el resumen de filtros estándar.

Latte permite llamar a los filtros utilizando la notación del signo pipa (se permite el espacio precedente):

<h1>{$heading|upper}</h1>

Los filtros pueden encadenarse, en cuyo caso se aplican en orden de izquierda a derecha:

<h1>{$heading|lower|capitalize}</h1>

Los parámetros se ponen después del nombre del filtro separados por dos puntos o coma:

<h1>{$heading|truncate:20,''}</h1>

Los filtros se pueden aplicar sobre la expresión:

{var $name = ($title|upper) . ($subtitle|lower)}

En bloque:

<h1>{block |lower}{$heading}{/block}</h1>

O directamente sobre el valor (en combinación con {=expr} etiqueta):

<h1>{='  Hello world  '|trim}<h1>

Comentarios

Los comentarios se escriben de esta manera y no entran en la salida:

{* esto es un comentario en Latte *}

Los comentarios PHP funcionan dentro de las etiquetas:

{include 'file.info', /* value: 123 */}

Azúcar sintáctico

Cadenas sin comillas

Las comillas pueden omitirse en las cadenas simples:

como en PHP: {var $arr = ['hello', 'btn--default', '€']}

abreviado:   {var $arr = [hello, btn--default, €]}

Las cadenas simples son las que están formadas únicamente por letras, cifras, guiones bajos y guiones. No deben empezar por un dígito ni comenzar o terminar con un guión. No debe estar compuesto únicamente por letras mayúsculas y guiones bajos, porque entonces se considera una constante (por ejemplo, PHP_VERSION). Y no debe colisionar con las palabras clave and, array, clone, default, false, in, instanceof, new, null, or, return, true, xor.

Operador ternario corto

Si el tercer valor del operador ternario está vacío, puede omitirse:

como en PHP: {$stock ? 'In stock' : ''}

abreviado:   {$stock ? 'In stock'}

Notación moderna de clave en el array

Las claves de los arrays pueden escribirse de forma similar a los parámetros con nombre al llamar a funciones:

como en PHP: {var $arr = ['one' => 'item 1', 'two' => 'item 2']}

modern:      {var $arr = [one: 'item 1', two: 'item 2']}

Filtros

Los filtros pueden utilizarse para cualquier expresión, basta con encerrar el conjunto entre paréntesis:

{var $content = ($text|truncate: 30|upper)}

Operador in

El operador in puede utilizarse para sustituir a la función in_array(). La comparación es siempre estricta:

{* like in_array($item, $items, true) *}
{if $item in $items}
	...
{/if}

Encadenamiento opcional con el operador Undefined-Safe

El operador undefined-safe ??-> es similar al operador nullsafe ?->, pero no lanza un error si una variable, propiedad o índice no existe en absoluto.

{$order??->id}

esto es una forma de decir que cuando $order está definido y no es nulo, $order->id será computado, pero cuando $order es nulo o no existe, deja de hacer lo que estamos haciendo y simplemente devuelve null.

Puede que utilices ?-> para reemplazar mucho código que realiza comprobaciones repetitivas de null:

{$user??->address??->street}
// roughly means isset($user) && isset($user->address) ? $user->address->street : null

Una ventana a la historia

Latte ha ideado una serie de caramelos sintácticos a lo largo de su historia, que aparecieron en el propio PHP unos años más tarde. Por ejemplo, en Latte era posible escribir arrays como [1, 2, 3] en lugar de array(1, 2, 3) o usar el operador nullsafe $obj?->foo mucho antes de que fuera posible en el propio PHP. Latte también introdujo el operador de expansión de arrays (expand) $arr, que es el equivalente al actual operador ...$arr de PHP.

Limitaciones de PHP en Latte

En Latte sólo se pueden escribir expresiones PHP. Es decir, no se pueden declarar clases ni utilizar estructuras de control, como if, foreach, switch, return, try, throw y otras, en lugar de las cuales Latte ofrece sus etiquetas. Tampoco puedes usar atributos, backticksconstantes mágicas, porque no tendría sentido. Ni siquiera puedes usar echo, include, require, exit, eval, unset, porque no son funciones, sino construcciones especiales del lenguaje PHP, y por tanto no son expresiones.

Sin embargo, puede trabajar alrededor de estas limitaciones activando la extensión RawPhpExtension, que le permite usar cualquier código PHP en la etiqueta {php ...} bajo la responsabilidad del autor de la plantilla.