Sintaxe

A sintaxe do Latte nasceu das exigências práticas dos web designers. Estávamos procurando a sintaxe mais fácil de usar, com a qual você pode escrever com elegância construções que de outra forma seriam um verdadeiro desafio. Ao mesmo tempo, todas as expressões são escritas exatamente da mesma forma que em PHP, para que você não tenha que aprender uma nova linguagem. Você apenas aproveita ao máximo o que já sabe.

Abaixo está um modelo mínimo que ilustra alguns elementos básicos: tags, n:atributos, comentários e filtros.

{Este é um comentário *}
<ul n:if="$items">                   {n:se é n:atribut *}
{para cada $items como $item}        {etiqueta que representa o laço frontal *}
	<li>{$item|capitalize}</li>      {* tag que imprime uma variável com um filtro *}
{Fim do ciclo *}                     {* final do ciclo *}

Vamos dar uma olhada mais de perto nestes elementos importantes e como eles podem ajudar você a construir um modelo incrível.

Etiquetas

Um modelo contém tags que controlam a lógica do modelo (por exemplo, para cada laço) ou expressões de saída. Para ambos, é usado um único delimitador { ... }, de modo que não é preciso pensar em qual delimitador usar em qual situação, como acontece com outros sistemas. Se o caractere { for seguido por uma citação ou espaço, Latte não o considera como sendo o início de uma tag, então você pode utilizar construções JavaScript, JSON, ou regras CSS em seus templates sem problemas.

Veja a visão geral de todas as etiquetas. Além disso, você também pode criar etiquetas personalizadas.

Latte Entende PHP

Você pode usar expressões PHP que você conhece bem dentro das tags:

Além disso, Latte acrescenta várias extensões agradáveis à sintaxe PHP.

n:atributos

Cada tag de par, tal como {if} … {/if}, operando sobre um único elemento HTML pode ser escrita em notação de atributo n:n. Por exemplo, {foreach} no exemplo acima também poderia ser escrito desta forma:

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

A funcionalidade corresponde então ao elemento HTML em que está escrito:

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

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

Impressões:

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

Usando o prefixo inner-, podemos alterar o comportamento para que a funcionalidade se aplique apenas ao corpo do elemento:

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

Impressões:

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

Ou usando o prefixo tag-, a funcionalidade é aplicada apenas nas tags HTML:

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

Dependendo do valor da variável $url, isto será impresso:

// when $url is empty
<p>Title</p>

// when $url equals 'https://nette.org'
<p><a href="https://nette.org">Title</a></p>

Entretanto, os n:atributos não são apenas um atalho para etiquetas de pares, existem também alguns n:atributos puros, por exemplo, o melhor amigo do codificador n:classe.

Filtros

Veja o resumo dos filtros padrão.

O Latte permite a chamada de filtros utilizando a notação do sinal de canalização (o espaço precedente é permitido):

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

Os filtros podem ser acorrentados, nesse caso, eles se aplicam por ordem da esquerda para a direita:

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

Os parâmetros são colocados após o nome do filtro separado por dois pontos ou vírgula:

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

Os filtros podem ser aplicados por expressão:

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

Em bloco:

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

Ou diretamente sobre o valor (em combinação com {=expr} tag):

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

Comentários

Os comentários são escritos desta forma e não entram na produção:

{* este é um comentário em Latte *}

Os comentários PHP funcionam dentro das tags:

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

Açúcar Syntactic

Cordas sem marcas de citação

As aspas podem ser omitidas para cordas simples:

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

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

Cordas simples são aquelas que são compostas puramente de letras, dígitos, sublinhados, hífens e pontos. Elas não devem começar com um dígito e não devem começar ou terminar com um hífen. Não devem ser compostas apenas de letras maiúsculas e sublinhados, pois então são consideradas uma constante (por exemplo, PHP_VERSION). E não deve colidir com as palavras-chave and, array, clone, false, default, , in, instanceof, new, null, or, , return, true, xor.

Operador de Ternary curto

Se o terceiro valor do operador ternário estiver vazio, ele pode ser omitido:

as in PHP:   {$stock ? 'In stock' : ''}

abbreviated: {$stock ? 'In stock'}

Notação Chave Moderna no Array

As chaves de matriz podem ser escritas de forma semelhante aos parâmetros nomeados ao chamar funções:

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

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

Filtros

Os filtros podem ser usados para qualquer expressão, basta anexar o todo entre parênteses:

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

Operador in

O operador in pode ser usado para substituir a função in_array(). A comparação é sempre rigorosa:

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

Encadeamento Opcional com Operador de Segurança Indefinida

O operador indefinido e seguro ??-> é semelhante ao operador nulo e seguro ?->, mas não levanta um erro se uma variável, propriedade ou índice não existir de forma alguma.

{$order??->id}

esta é uma forma de dizer que quando $order for definido e não nulo, $order->id será computado, mas quando $order for nulo ou não existir, pare o que estamos fazendo e simplesmente retorne nulo.

Você pode se encontrar usando ?-> para substituir muitos códigos que realizam verificações repetitivas e nulas:

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

Uma Janela para a História

O Latte criou uma série de doces sintáticos ao longo de sua história, que apareceram no próprio PHP alguns anos depois. Por exemplo, em Latte era possível escrever arrays como [1, 2, 3] em vez de array(1, 2, 3) ou usar o operador nullsafe $obj?->foo muito antes de ser possível no próprio PHP. Latte também introduziu o operador de expansão de array (expand) $arr, que é o equivalente ao atual operador ...$arr do PHP.

Limitações do PHP em Latte

Somente expressões PHP podem ser escritas em Latte. Ou seja, você não pode declarar classes ou usar estruturas de controle, tais como if, foreach, switch, return, try, throw e outras, em vez das quais Latte oferece suas tags. Você também não pode usar atributos, backticks ou constantes mágicas, porque isso não faria sentido. Você não pode sequer usar echo, include, require, eval, exit, , unset, porque não são funções, mas construções especiais da linguagem PHP, e, portanto, não expressões.

Entretanto, você pode contornar essas limitações ativando a extensão RawPhpExtension, que permite utilizar qualquer código PHP na tag {php ...} sob a responsabilidade do autor do modelo.