MacでSmartyを試す

MacのローカルにPHPのテンプレートエンジン「Smarty」を入れて動かしてみます。
Smartyのインストールにはcomposerを用います[^composer]。

### composerでSmartyをインストール
今回は `~/test/` ディレクトリで作業します。

```
$ mkdir test
$ cd test
```

#### composer install の場合

```bash
# composer.jsonファイル準備
$ vi composer.json
```

Smarty 3.1系の最新安定版をインストールする設定[^packagist]を書きます。

```json:composer.json
{
  "require": {
    "smarty/smarty": "~3.1"
  }
}
```


```bash
$ composer install
Loading composer repositories with package information
Installing dependencies (including require-dev)
  - Installing smarty/smarty (v3.1.27)
    Downloading: 100%

Writing lock file
Generating autoload files
```

### composer require の場合

```bash
$ composer require smarty/smarty
Using version ^3.1 for smarty/smarty
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing smarty/smarty (v3.1.27) Downloading: 100%
Writing lock file
Generating autoload files
```

require の場合、`composer.json` は自動的に生成されます。

```bash:生成されたcomposer.jsonの内容
$ cat composer.json
{
    "require": {
        "smarty/smarty": "^3.1"
    }
}
```


### テスト用コンテンツ準備

```html:header.tpl
<!DOCTYPE html>
<meta charset="utf-8">
<title> {$page_title} </title>
```

```html:index.tpl
{*
  これはコメントです。
  別ファイルで定義したヘッダを読み込み。
  このページのタイトルを定数で指定
*}
{include file='header.tpl' page_title={$smarty.const.MY_TITLE}}

{* 予約変数(一部) *}
<dl>
  <dt>現在の タイムスタンプ
  <dd> {$smarty.now}

  <dt>現在処理中のテンプレートファイル名
  <dd> {$smarty.template}

  <dt>このテンプレートをコンパイルした Smarty のバージョン
  <dd> {$smarty.version}
</dl>

{* 変数 *}
<p> {$hello}

{* メソッド *}
<p> {$today->format('Y-m-d (D)')}

<ul>
{* 配列 $animal のすべての値を逆順に表示 *}
{section name=i loop=$animal step=-1}
    <li> {$animal[i]}
{/section}
</ul>

{* 連想配列 $address の内容をループ *}
{section name=i loop=$address}
<ul>
  <li> name: {$address[i].name}
  <li> home: {$address[i].home}
  <li> cell: {$address[i].cell}
  <li> e-mail: {$address[i].email}
</ul>
{/section}
```

```php:index.php
<?php

require_once 'vendor/autoload.php';

ini_set('date.timezone', 'Asia/Tokyo');
define('MY_TITLE', 'このページのタイトル');

$smarty = new Smarty();

$smarty->assign('hello', 'Hello, world!');
$smarty->assign('today', new DateTime());
$smarty->assign('animal', array('いぬ', 'さる', 'きじ'));
$smarty->assign('address', array(
          array('name' => 'John Smith', 'home' => '555-555-5555',
                'cell' => '666-555-5555', 'email' => 'john@myexample.com', ),
          array('name' => 'Jack Jones', 'home' => '777-555-5555',
                'cell' => '888-555-5555', 'email' => 'jack@myexample.com', ),
          array('name' => 'Jane Munson', 'home' => '000-555-5555',
                'cell' => '123456', 'email' => 'jane@myexample.com', ),
              ));

$smarty->display('index.tpl');
```

### ビルトインウェブサーバ起動

```bash
# ビルトインウェブサーバ起動
$ php -S localhost:8001
```

### ブラウザアクセス

ブラウザで`http://localhost:8001`にアクセス

↓こんな感じの物が出力

```html:出力
<!DOCTYPE html>
<meta charset="utf-8">
<title> このページのタイトル </title>



<dl>
  <dt>現在の タイムスタンプ
  <dd> 1445867579

  <dt>現在処理中のテンプレートファイル名
  <dd> index.tpl

  <dt>このテンプレートをコンパイルした Smarty のバージョン
  <dd> 3.1.27
</dl>


<p> Hello, world!


<p> 2015-10-26 (Mon)

<ul>

    <li> きじ
    <li> さる
    <li> いぬ
</ul>


<ul>
  <li> name: John Smith
  <li> home: 555-555-5555
  <li> cell: 666-555-5555
  <li> e-mail: john@myexample.com
</ul>
<ul>
  <li> name: Jack Jones
  <li> home: 777-555-5555
  <li> cell: 888-555-5555
  <li> e-mail: jack@myexample.com
</ul>
<ul>
  <li> name: Jane Munson
  <li> home: 000-555-5555
  <li> cell: 123456
  <li> e-mail: jane@myexample.com
</ul>
```
おわりです。

# 参考や注釈

* [Smarty TEMPLATE ENGINE](http://www.smarty.net/)

* [PHPのパッケージ管理Composerを使う アプリケーションごとのライブラリ依存関係に悩まない](http://tech.basicinc.jp/php/2013/08/18/php_composer/)
* [composer 導入をまじめに考える - Qiita](http://qiita.com/notona/items/c5a087d8dd446d315e6e)
* [PHPの外部ライブラリ管理ツール「Composer」はHomebrewで簡単にインストールできる - Qiita](http://qiita.com/zubapita/items/e170f0a3e6f38e1ad4c9)
* [SmartyをComposerでインストールする - Qiita](http://qiita.com/yando/items/e55c90c86287d4c785d3)
* [ビルトインウェブサーバー](http://php.net/manual/ja/features.commandline.webserver.php)

[^composer]: 今回、composerはhomebrewで既に導入済みでした。
[^packagist]: [smarty/smarty - Packagist The PHP Package Repository](https://packagist.org/packages/smarty/smarty)