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:
- variáveis
- cordas (incluindo HEREDOC e NOWDOC), matrizes, números, etc.
- operadores
- função e chamadas de método (que podem ser restringidas pelo sandbox)
- jogo
- funções anônimas
- ligações de retorno
- comentários de várias linhas
/* ... */
- etc…
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.