"BOKU"のITな日常

BOKUが勉強したり、考えたことを頭の整理を兼ねてまとめてます。

フレームワークに依存しないPHP テンプレートエンジン Smarty

目次

フレームワークに依存しないPHP テンプレートエンジン Smarty

Smartyは老舗のPHPテンプレートエンジンです。

特定のフレームワークに依存しない「汎用」テンプレートです。

縛りが少なくて、使いやすくて、高機能なので僕は気に入ってます。

www.smarty.net

各言語のマニュアルが整備されているのもありがたいです。

www.smarty.net 

2022/07/31時点では最新バージョンの日本語版はありませんが、ほどなく整備されるでしょうし、よほど凝った使い方をしない限り、ひとつ前のバージョンのマニュアルでも困らないはずです。

 

インストール

こちらから最新版をダウンロード・解凍します。

github.com

解凍したフォルダ(例えばバージョン4.1.1なら「smarty-4.1.1」)ごと、PHPから参照できるフォルダにコピーするだけです。

特にこのフォルダでないとダメという縛りはありません。

 

Smartyを使う本当の最低限

PHPSmartyを見つけられるように「'SMARTY_DIR」定数に置いた場所を指定します。

例えば、「c:/webroot/libs」フォルダに「Smarty」にフォルダをリネームしてコピーしたなら、Smartyフォルダの下の「libs」の位置を定数で定義する形になります。

define('SMARTY_DIR', 'c:/webroot/libs/Smarty/libs/');

PHP.iniに定義してもいいのですが、通常、システム管理者がサーバーを管理しているとPHP.iniの変更は勝手にさせてもらえないので、こうしてます。

そのうえで、以下のようにしとけば大丈夫です。

require_once(SMARTY_DIR . 'Smarty.class.php');

ここまでできたら、Smartyを使う最低限は、以下の4行です。

(パスの部分はサンプルです)

define('SMARTY_DIR', 'C:/webwork/core/smarty/libs/');
require_once SMARTY_DIR . 'Smarty.class.php';
$smarty = new Smarty();
$smarty->display('C:/webwork/views/demo.html');

ようするに。

クラスを「new」して、テンプレートファイルのパスを指定して「$smarty->display」すればいいです。

もちろん表示するHTMLファイルは用意しないといけないです。

テンプレートファイルはサンプルとかでは「.tpl」のような拡張子になっていることが多いですが、別に上記のように普通に「.html」とかにしてても問題ないです。

 

変数・配列・連想配列の値をHTML側に渡す

SmartyでHTMLにPHPの値の受け渡すには

$smarty->assign

を使います。

HTML側で渡された変数の値を表示する場合は「{$str_title}」みたいに「{ }」で囲んで変数名の頭に「$」をつけます。

例えば、PHP側で

$smarty->assign('str_title', 'Smartyのサンプル');

としたものは、HTML側では

<h1>{$str_title}</h1>

で表示できるというわけです。

 

配列でも同じです。

例えば、PHP側で

$arr_arr = array('テスト 次郎', 'second@mail.example.com');
$smarty->assign('arr_arr', $arr_arr);

のように配列を定義して、名前をつけてassignすれば

HTML側では

 <p>{$arr_arr[0]}</p>
 <p>{$arr_arr[1]}</p>

みたいにすれば表示できます。

 

連想配列でも同じようにできます。

PHP側で

$dic_arr = array('str_name' => 'テスト 太郎',
    'str_email' => 'addr@mail.example.com',
    'dic_phone' => '080-444-3333');
$smarty->assign('dic_arr', $dic_arr);

のように連想配列を定義して、名前をつけて渡せば、HTML側では

    <p>{$dic_arr.str_name}</p>
    <p>{$dic_arr.str_email}</p>
    <p>{$dic_arr.dic_phone}</p>

のように、「.」で連想配列のキー名をつけてやれば表示できます。

 

配列をうけてHTML側でループ処理

配列を受け取ったとき、添え字を直接指定するなんてことは普通しません。

配列を受けとる=配列にはいっているだけループで回す・・ってのが普通です。

ループにはいくつか方法がありますが、とりあえず「foreach」が便利です。

上記の配列の場合だと

 <ul>
   {foreach $arr_arr as $val}
      <li>{$val}</li>
   {/foreach}
 </ul>

みたいにすれば配列の値すべてを表示できます。

 

連想配列も同じようにできます。

連想配列のキーの値を取得したい場合は「@key」を以下のように使います。

    <ol>
        {foreach $dic_arr as $value}
        <li>{$value@key}:{$value}</li>
        {/foreach}
    </ol>

foreachはもちろんネストもできます。

 

とっつきやすくて奥が深いのがSmarty

今回紹介した最低限(変数の参照とループだけ)でも結構なことができます。

簡単な画面は作れますしね

なんですが。

マニュアルを読めばわかるとおり、Smartyは実に多機能でもあります。

www.smarty.net

このブログで紹介した基本中の基本をとりあえず使ってみて、それだけでできないことがでてきたらマニュアルを調べる・・感じで学習しやすいテンプレートエンジンだと僕は思ってます。

最近、有名フレームワークで採用されているテンプレートエンジンばかり前面にでてきて、Smartyの影が薄くなっている感じがしたので、いまさらながら・・と思いつつ紹介です。

ではでは。