構文
Syntax Latteは、ウェブデザイナーの実用的な要求から生まれました。私たちは、最も使いやすい構文を探していました。この構文を使えば、他の方法では本当に難しい構文をエレガントに書くことができます。 同時に、すべての表現はPHPと全く同じに記述されるので、新しい言語を学ぶ必要はありません。すでに知っていることを最大限に活用すればいいのです。
以下に、基本的な要素であるタグ、n:属性、コメント、フィルタを説明する最小限のテンプレートを示します。
{* this is a comment *}
<ul n:if="$items"> {* n:if is n:atribut *}
{foreach $items as $item} {* tag representing foreach loop *}
<li>{$item|capitalize}</li> {* tag that prints a variable with a filter *}
{/foreach} {* end of cycle *}
</ul>
これらの重要な要素を詳しく見て、それらがどのように素晴らしいテンプレートを構築するのに役立つかを見てみましょう。
タグ
テンプレートには、テンプレートのロジック(例えば、foreachループ)や出力式を制御するタグが含まれています。どちらも一つの区切り文字{ ... }
が使われますので、他のシステムのように、どの場面でどの区切り文字を使うか考える必要はありません。
また、{
文字の後に引用符やスペースが続く場合、Latteはそれをタグの先頭とは見なさないので、テンプレート内でJavaScriptの構成要素やJSON、CSSルールを問題なく使用することができます。
全タグの概要を見るさらに、カスタムタグを作成することも可能です。
ラテはPHPを理解する
タグの中によく知っているPHPの表現を使うことができます。
- 変数
- 文字列 (HEREDOC および NOWDOC を含む), 配列, 数値, など。
- 演算子
- 関数やメソッドの呼び出し (サンドボックスで制限されることがあります)
- マッチ
- 無名関数
- コールバック
- 複数行コメント
/* ... */
- など
さらに、LatteはPHPの文法にいくつかの素晴らしい拡張を加えています。
n:属性
一つのHTML要素に作用する{if} … {/if}
のような各ペアタグは、n:attribute記法で書くことができます。例えば、上の例の{foreach}
は、次のように書くこともできる。
<ul n:if="$items">
<li n:foreach="$items as $item">{$item|capitalize}</li>
</ul>
この場合、機能は、それが記述されているHTML要素に対応する。
{var $items = ['I', '♥', 'Latte']}
<p n:foreach="$items as $item">{$item}</p>
プリント
<p>I</p>
<p>♥</p>
<p>Latte</p>
inner-
プレフィックスを使用することで、その機能が要素の本体のみに適用されるように動作を変更することができます。
<div n:inner-foreach="$items as $item">
<p>{$item}</p>
<hr>
</div>
印刷します。
<div>
<p>I</p>
<hr>
<p>♥</p>
<hr>
<p>Latte</p>
<hr>
</div>
また、tag-
という接頭辞をつけると、HTML タグにのみ機能が適用されます。
<p><a href={$url} n:tag-if="$url">Title</a></p>
変数$url
の値によって、このように表示されます。
// when $url is empty
<p>Title</p>
// when $url equals 'https://nette.org'
<p><a href="https://nette.org">Title</a></p>
しかし、n:attributesはペアタグのショートカットであるだけでなく、純粋なn:attributesもあります。
フィルター
標準フィルタの概要をご覧ください。
Latteでは、パイプ記号を使った記法でフィルタを呼び出すことができます(前方にスペースがあっても可)。
<h1>{$heading|upper}</h1>
フィルターは連結することができ、その場合、左から右の順に適用されます。
<h1>{$heading|lower|capitalize}</h1>
パラメータはコロンまたはカンマで区切られたフィルタ名の後に置かれます。
<h1>{$heading|truncate:20,''}</h1>
フィルタは式に対して適用することができる。
{var $name = ($title|upper) . ($subtitle|lower)}
ブロックの場合。
<h1>{block |lower}{$heading}{/block}</h1>
または直接値(と組み合わせ {=expr}
タグ)。
<h1>{=' Hello world '|trim}<h1>
ダイナミックHTMLタグ
Latteは動的HTMLタグをサポートしており、タグ名に柔軟性が必要な場合に便利です:
<h{$level}>Heading</h{$level}>
例えば、上記のコードでは <h1>Heading</h1>
または
<h2>Heading</h2>
$level
を生成することができる。LatteのダイナミックHTMLタグは常にペアでなければなりません。その代わりとなるのがn:tagです。
Latteは安全なテンプレートシステムであるため、生成されるタグ名が有効で、不要な値や悪意のある値を含まないことをチェックします。また、終了タグ名が常に開始タグ名と同じであることを保証します。
コメント
コメントはこのように書き、出力には入りません。
{* this is a comment in Latte *}
PHPのコメントはタグの中で動作します。
{include 'file.info', /* value: 123 */}
構文解析シュガー
クォーテーションマークなしの文字列
単純な文字列では、引用符を省略することができます。
as in PHP: {var $arr = ['hello', 'btn--default', '€']}
abbreviated: {var $arr = [hello, btn--default, €]}
単純な文字列とは、文字、数字、アンダースコア、ハイフン、ピリオドだけで構成されたものを指します。数字で始まってはならず、ハイフンで始まってはならず、ハイフンで終わってはならない。
また、大文字とアンダースコアだけで構成されてはいけません。そうすると定数とみなされるからです
(例:PHP_VERSION
)。
また、キーワードand
,array
,clone
,default
,false
,in
,instanceof
,new
,null
,or
,return
,true
,xor
と衝突してはいけません。
短い三項演算子
三項演算子の3番目の値が空であれば、省略可能です。
as in PHP: {$stock ? 'In stock' : ''}
abbreviated: {$stock ? 'In stock'}
配列における現代的な鍵の表記法
配列のキーは、関数を呼び出すときの名前付きパラメータと同じように書くことができます。
as in PHP: {var $arr = ['one' => 'item 1', 'two' => 'item 2']}
modern: {var $arr = [one: 'item 1', two: 'item 2']}
フィルター
フィルターはどんな式にも使えます。全体を大括弧で囲んでください。
{var $content = ($text|truncate: 30|upper)}
演算子in
in
演算子はin_array()
関数の代わりに使用することができます。比較は常に厳密です。
{* like in_array($item, $items, true) *}
{if $item in $items}
...
{/if}
歴史への窓
Latteはその歴史の中で、数年後にPHP自体に登場する構文上のお菓子をいくつも生み出してきました。例えば、Latteでは、配列を
の代わりに [1, 2, 3]
の代わりにarray(1, 2, 3)
と書いたり、ヌルセーフ演算子$obj?->foo
を使ったりすることが、PHPで可能になるずっと以前から可能でした。また、Latteでは配列展開演算子(expand) $arr
も導入されており、これは現在のPHPの演算子...$arr
に相当するものです。
?->
undefined-safe 演算子??->
は nullsafe 演算子?->
と似ていますが、変数が存在しない場合にエラーを発生させません。
LatteにおけるPHPの制限事項
Latteで記述できるのは、PHPの表現のみです。つまり、セミコロンで終わる文は使えません。クラスの宣言や、if
,foreach
,switch
,return
,try
,throw
など、Latteがタグを提供する代わりに制御構造を使用することはできません。
また、アトリビュートや バックスティック、マジック定数も使えない。
unset
,echo
,include
,require
,exit
,eval
は関数ではなく PHP
の特殊な言語構造体であり、式ではないため使用することもできません。サポートされているのは複数行のコメントのみです/* ... */
。
しかし、RawPhpExtension拡張モジュールを有効にすることで、これらの制限を回避することができます。これにより、テンプレートの作者の責任において{php ...}
タグで任意の PHP コードを使用することができます。