【追記(2010/04/29)】第9回 LOCAL PHP部勉強会で発表しました
その発表の時に使ったスライド公開しました。うまく貼れなかったので、リンクでごめんなさい。
そもそもSmartyって?
見た目の処理(ビュー)と、ロジックを分割できるテンプレートエンジンと呼ばれるものの一種。PHPでは多分一番有名。
テンプレートエンジンを使うと、
- 処理が分割されるのでわかりやすくなる
- Webデザイナさんと分業しやすくなる
といった利点を得られます。
Smarty3の特徴
「うまい」「はやい」「やすい」
- 新機能が”うまい”
- Smarty2からSmarty3に置き換えるだけで2~5倍”はやい”
- 導入し”やすい”
無理やりすぎる。
使い方
Smarty2.6と同じ。サーバにアップロードして、Smartyを使いたいPHPファイルでSmarty.class.phpを読むだけ。
<?php
require_once("./Smarty3/Smarty.class.php");
$smarty = new Smarty();
echo "<pre>";
var_dump($smarty);
echo "</pre>";
?>
パスなどは適宜読み替えてね。
Smarty2.6と同じ。
index.php
<?php
require_once("./Smarty3/Smarty.class.php");
$smarty = new Smarty();
$smarty->assign("name", "Smarty3");
$smarty->display("index.html");
?>
templates/index.tpl
Hello {$name} world!
実行結果
Hello Smarty3 world!
Smarty基本の解説1「assign」
表示するデータをassignする。
$smarty->assign("name", "Smarty3");
これで、テンプレート側でname変数が使えるように。中身は”Smarty3”という文字列。
Smarty基本の解説2「テンプレートの記述」
見た目の処理はテンプレートに書く。デフォルトでは、templatesディレクトリに配置することに。
Hello {$name} world!
{}で囲むことで、Smartyのタグ(?)を使える。{$name}で、nameという変数を表示。設定で、何で囲んだらテンプレート構文とするかは変更できます。JavaScriptと混在しても安心。
Smarty基本の解説3「templates_」
Smartyはテンプレートをコンパイルした結果をキャッシュしておく。ようは、速い!
デフォルトではtemplatesディレクトリの横にtemplates_cができます。
Smarty基本の解説4「実行」
ふたたびPHPに戻って、Smartyインスタンスのdisplayメソッドを実行。
$smarty->display("index.html");
基本はこれだけ!
Smarty2.6と変わらないため、導入し”やすい”。ただ、実際にSmarty2.6からの置き換えには作業が発生すると思うので注意。
新機能をざっと見てみる
- 変数の演算
- Smartyタグの入れ子
- 配列
- 可変変数
- メソッドチェーン
- 新しいループ処理
- テンプレートの継承
変数の演算
構文解析が強化されたことにより、変数の演算などがサポート
{$x = 2}
{$y = 3}
{$z = $x + $y}
<p>{$x}+{$y}={$z}</p>
{$r = 3}
<p>
半径{$r}の、<br />
円周:{2 * pi() * $r}<br />
面積:{pi() * pow($r, 2)}<br />
</p>
実行結果
2+3=5
半径3の、
円周:18.849555921539
面積:28.274333882308
PHPの関数も使える!
Smartyタグの入れ子
{$mail = "<li>{mailto address="hoge@foo.bar"}</li>"}
<ul>{$mail}</ul>
ソース
<ul><li><a href="mailto:hoge@foo.bar" >hoge@foo.bar</a></li></ul>
Smartyタグの組み合わせにより、より複雑なことができそう!
配列の定義・呼び出し
PHP風に配列を呼び出すことができる。Smartyで配列の定義ができる。
{assign var=foo value=["い","ろ","は"]}
{$foo[0]}
{$foo.1}
{$foo[1+1]}
い ろ は
可変変数
{$str1 = "a"}
{$str2 = "b"}
{$str3 = "c"}
{$x = 1}
{$str{$x}}
{$x = $x + 1}
{$str{$x}}
{$x = $x + 1}
{$str{$x}}
PHPでもあまり使わないですが・・・
メソッドチェーン
メソッドチェーンにも対応しました。
<?php
require_once("./Smarty3/Smarty.class.php");
$smarty = new Smarty();
class Hoge {
private $str;
function addFoo() {
$this->str .= "foo";
return $this;
}
function addBar() {
$this->str .= "bar";
return $this;
}
function getStr() {
return $this->str;
}
}
$smarty->assign("obj", new Hoge);
$smarty->display("index.html");
?>
こんなHogeクラスを用意し、assignする。
このクラスは、addFooが実行されるとfooを、addBarが実行されるとbarをインスタンス変数に追加します。そして、getStrでその変数を返してくれます。
でもって、テンプレート側ではこんなのができる。
{$obj->addFoo()->addBar()->addBar()->addFoo()->getStr()}
Fooを追加して、Barを追加して、Barをもっかい追加して、最後にFooを追加した後、その文字列を表示。
foobarbarfoo
文字列クラスとかを作れば、あるいは……。
新しいループ
forタグが追加されて、foreachタグがphpのように実行可能に。
まずは、forタグ。
{for $x = 1; $x <= 9; $x++}
{for $y = 1; $y <= 9; $y++}
{$x*$y}
{/for}
<br />
{/for}
おなじみ、九九の表が出力されます。
そして、foreachタグ。
{$ary = array("りんご", "ごりら", "らっぱ", "ぱんだ")}
<table border="1">
<tr>
<th>id</th>
<th>name</th>
<th>first</th>
<th>last</th>
</tr>
{foreach $ary as $str}
<tr>
<td>{$str@key}</td>
<td>{$str}</td>
<td>{if $str@first}○{/if}</td>
<td>{if $str@last}○{/if}</td>
</tr>
{/foreach}
</table>
<table border="1">
<tr>
<th>id</th>
<th>name</th>
<th>first</th>
<th>last</th>
</tr>
<tr>
<td>0</td>
<td>りんご</td>
<td>○</td>
<td></td>
</tr>
<tr>
<td>1</td>
<td>ごりら</td>
<td></td>
<td></td>
</tr>
<tr>
<td>2</td>
<td>らっぱ</td>
<td></td>
<td></td>
</tr>
<tr>
<td>3</td>
<td>ぱんだ</td>
<td></td>
<td>○</td>
</tr>
</table>
これは気にいった。$~@とかの、ループ用の特殊変数もいいですね。
元からあるループ処理も、非推奨ながら一応使えます。
テンプレートの継承
追記予定
で、どうなの?
- プログラマよりになってうれしい反面、複雑に・・・
- 本当に速いの? (正式リリース待ち)
- どうせ乗り換えるなら、Twigとかでもいいんじゃ・・・
結論としては様子見が妥当。速度が十分に出るなら、置き換えもあり?
テンプレートエンジンの今後に期待。ピュアPHPか、Smarty3か、Smarty2.6継続か、それともTwigか……。