[PHP] Smartyのfetch関数で、様々なテンプレートにSmartyを応用する | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

SmartyはHTMLテンプレートエンジンとして有名ですが、HTMLテンプレート以外にも利用する事が可能です。

具体的には、Smartyクラスで定義されているfetch関数を使う事で、PHPプログラムからテンプレートの変換結果を受け取る事が可能です。

ですので、HTMLタグをテンプレート内に埋め込んでいない場合は、それはHTMLではなく例えば単なるプレーンテキストのテンプレートとして利用する事が出来ます。


ここでは、Smartyをメールテンプレートとして活用してみたいと思います。


例えば、あるシステムの申請時に下記のようなメールを送信したいとします。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ○×の申請を受付けました。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

名前:山田 太郎
部門:人事部
受付日時:2007/11/12 14:48


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
お問合せ:support@hoge.com

「名前」「部門」「受付日時」は動的に内容を切り替えたい項目です。


そこで、まずこれをSmartyのテンプレートに変換します。

結果は、下記のようになります。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ○×の申請を受付けました。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
名前:{$name}
部門:{$division}
受付日時:{$date}

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
お問合せ:support@hoge.com

次に、このテンプレートに値を埋め込む為のPHPプログラムを記述します。


<?php
require_once 'Smarty.class.php';

$smarty = new Smarty;

$smarty->assign('name', '山田 太郎');
$smarty->assign('division', '人事部');
$smarty->assign('date', date('Y/m/d H:i'));

$mail_body = $smarty->fetch('mail.tpl');

?>

先ほど作成したテンプレートファイルにそれぞれの変数を埋め込んでいきます。

ここまでは、通常通りのSmartyの使い方ですね。


今回のメールテンプレートとしての利用で、普段とは違うのは通常であれば変換結果のテンプレートをブラウザに出力する為に


$smarty->display('mail.tpl');

と書くところを


$mail_body = $smarty->fetch('mail.tpl');

と書いて、テンプレートの変換結果を$mail_bodyの変数に受け取っています。

あとは、これをメールの本文として、mb_send_mail 関数の引数に渡してあげればOKです。


メールとかはある程度の書式が決まっていますし、業務が変われば内容もちょこちょこ変えてほしいという要望が上がってきたりするものなので、こうしてテンプレートとして切り離しておけば便利です。