Nette Documentation Preview

syntax
ヒントとコツ
**********


エディタと IDE
============

テンプレートは Latte に対応したエディタや IDE で書きましょう。作業がずっと快適になります。

- PhpStorm: `Settings > Plugins > Marketplace` で [Latte プラグイン|https://plugins.jetbrains.com/plugin/24218-latte-support]をインストールします
- VS Code: [Nette Latte + Neon|https://marketplace.visualstudio.com/items?itemName=Kasik96.latte]、[Nette Latte templates|https://marketplace.visualstudio.com/items?itemName=smuuf.latte-lang]、または最新の [Nette for VS Code |https://marketplace.visualstudio.com/items?itemName=franken-ui.nette-for-vscode] プラグインをインストールします
- NetBeans IDE: Latte のネイティブサポートが標準で含まれています
- Sublime Text 3: Package Control で `Nette` パッケージを探してインストールし、`View > Syntax` で Latte を選びます
- 古いエディタでは、`.latte` ファイルに Smarty のハイライトを使います

PhpStorm 用のプラグインは非常に高機能で、PHP コードの優れた補完を提供してくれます。最大限に活用するには[型付きテンプレート|type-system]を使ってください。

[* latte-phpstorm-plugin.webp *]

Latte のサポートは、ウェブ用のコードハイライター [Prism.js|https://prismjs.com/#supported-languages] やエディタ [Ace|https://ace.c9.io] にもあります。


JavaScript や CSS の中の Latte
============================

Latte は JavaScript や CSS の中でもとても快適に使えます。とはいえ、JavaScript のコードや CSS のスタイルを Latte が誤ってタグとみなしてしまう状況は、どう避ければよいでしょうか。

```latte
<style>
	/* エラー: タグ {color} と解釈される */
	body {color: blue}
</style>

<script>
	// エラー: タグ {id} と解釈される
	var obj = {id: 123};
</script>
```

**方法 1**

`{` の直後に文字が続く状況を避けます。たとえば前にスペース、改行、引用符を入れます。

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

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

**方法 2**

[n:syntax |tags#{syntax}] を使って、その要素の中では Latte タグの処理を完全に無効にします。

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

**方法 3**

その要素の中だけ、Latte タグの構文を二重波かっこに切り替えます。

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

	{{if $cond}} alert(); {{/if}} // これは Latte のタグ
</script>
```

JavaScript では[変数を引用符で囲まないでください |tags#JavaScript での出力]。


Latte における `use` 句の代わり
=============================

クラスにアクセスするたびに名前空間を書かずに済むよう、PHP の `use` 句にあたるものを Latte ではどう代用すればよいでしょうか。PHP の例です。

```php
use Pets\Model\Dog;

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

**方法 1**

`use` 句の代わりにクラス名を変数に入れておき、`Dog` の代わりに `$Dog` を使います。

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

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

**方法 2**

`$dog` オブジェクトが `Pets\Model\Dog` のインスタンスなら、`{if $dog->status === $dog::StatusHungry}` と書けます。


Latte による XML の生成
=====================

Latte は任意のテキスト形式(HTML、XML、CSV、iCal など)を生成できますが、表示するデータを正しくエスケープするには、どの形式を生成しているのかを伝える必要があります。そのために [`{contentType}` |tags#{contentType}] タグを使います。

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

たとえば、同じようにしてサイトマップを生成できます。

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


インクルードしたテンプレートからのデータの受け渡し
======================================

インクルードされたテンプレートの中で `{var}` や `{default}` で作られた変数は、そのテンプレートの中にしか存在せず、インクルードした側のテンプレートからは使えません。インクルードされたテンプレートから呼び出し側にデータを返したい場合、ひとつの方法はオブジェクトをテンプレートに渡し、その中にデータを入れることです。

メインのテンプレート:

```latte
{* 空のオブジェクト $vars を作る *}
{var $vars = (object) null}

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

{* ここではプロパティ foo を持っている *}
{$vars->foo}
```

インクルードされるテンプレート `included.latte`:

```latte
{* プロパティ foo にデータを書き込む *}
{var $vars->foo = 123}
```

ヒントとコツ

エディタと IDE

テンプレートは Latte に対応したエディタや IDE で書きましょう。作業がずっと快適になります。

  • PhpStorm: Settings > Plugins > MarketplaceLatte プラグインをインストールします
  • VS Code: Nette Latte + NeonNette Latte templates、または最新の Nette for VS Code プラグインをインストールします
  • NetBeans IDE: Latte のネイティブサポートが標準で含まれています
  • Sublime Text 3: Package Control で Nette パッケージを探してインストールし、View > Syntax で Latte を選びます
  • 古いエディタでは、.latte ファイルに Smarty のハイライトを使います

PhpStorm 用のプラグインは非常に高機能で、PHP コードの優れた補完を提供してくれます。最大限に活用するには型付きテンプレートを使ってください。

Latte のサポートは、ウェブ用のコードハイライター Prism.js やエディタ Ace にもあります。

JavaScript や CSS の中の Latte

Latte は JavaScript や CSS の中でもとても快適に使えます。とはいえ、JavaScript のコードや CSS のスタイルを Latte が誤ってタグとみなしてしまう状況は、どう避ければよいでしょうか。

<style>
	/* エラー: タグ {color} と解釈される */
	body {color: blue}
</style>

<script>
	// エラー: タグ {id} と解釈される
	var obj = {id: 123};
</script>

方法 1

{ の直後に文字が続く状況を避けます。たとえば前にスペース、改行、引用符を入れます。

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

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

方法 2

n:syntax を使って、その要素の中では Latte タグの処理を完全に無効にします。

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

方法 3

その要素の中だけ、Latte タグの構文を二重波かっこに切り替えます。

<script n:syntax="double">
	var obj = {id: 123};          // これは JavaScript

	{{if $cond}} alert(); {{/if}} // これは Latte のタグ
</script>

JavaScript では変数を引用符で囲まないでください

Latte における use 句の代わり

クラスにアクセスするたびに名前空間を書かずに済むよう、PHP の use 句にあたるものを Latte ではどう代用すればよいでしょうか。PHP の例です。

use Pets\Model\Dog;

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

方法 1

use 句の代わりにクラス名を変数に入れておき、Dog の代わりに $Dog を使います。

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

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

方法 2

$dog オブジェクトが Pets\Model\Dog のインスタンスなら、{if $dog->status === $dog::StatusHungry} と書けます。

Latte による XML の生成

Latte は任意のテキスト形式(HTML、XML、CSV、iCal など)を生成できますが、表示するデータを正しくエスケープするには、どの形式を生成しているのかを伝える必要があります。そのために {contentType} タグを使います。

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

たとえば、同じようにしてサイトマップを生成できます。

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

インクルードしたテンプレートからのデータの受け渡し

インクルードされたテンプレートの中で {var}{default} で作られた変数は、そのテンプレートの中にしか存在せず、インクルードした側のテンプレートからは使えません。インクルードされたテンプレートから呼び出し側にデータを返したい場合、ひとつの方法はオブジェクトをテンプレートに渡し、その中にデータを入れることです。

メインのテンプレート:

{* 空のオブジェクト $vars を作る *}
{var $vars = (object) null}

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

{* ここではプロパティ foo を持っている *}
{$vars->foo}

インクルードされるテンプレート included.latte:

{* プロパティ foo にデータを書き込む *}
{var $vars->foo = 123}