Smartyでできること
前回セットアップしたSmartyでほんの少しですが試してみました。
Smartyはロジック(PHP)とデザイン(テンプレート)を分けることのできる仕組みなので、テンプレート側では表示に特化した方がいいと思っているので、試したといってもほんの一部ではあります。
SmartyのテンプレートからPHP側の変数にアクセス出来たり、テンプレート内で関数を作れたりしますが、テンプレート側でゴリゴリと作り込むのは最小限にした方がいいと思っています。(個人の感想です)
参考:Smartyのドキュメント : https://www.smarty.net/docs/ja/
ディレクトリ構成などは前回の記事を参照していただくとして、早速ファイルの中身から紹介。
ロジック側(PHP)
前回少し触れましたが、Smartyの設定関係を外だしにしてみました。
(今回は何の意味もないですし、Smartyのインスタンスを外だしで作るのはどうかと思いますが。。。)
ということで、2つのファイルに分かれています。
smarty_env.php
<?php
//各ディレクトリの定数
define('SMARTY_DIR', 'd:/dev/smarty/libs/');
define('SMARTY_TMPL_DIR', 'd:/dev/htdocs/smarty_test/templates/');
define('SMARTY_COMPILE_DIR', 'd:/dev/htdocs/smarty_test/templates_c/');
define('SMARTY_CACHE_DIR', 'd:/dev/htdocs/smarty_test/cache/');
define('SMARTY_CONFIG_DIR', 'd:/dev/htdocs/smarty_test/configs/');
//Smarty読み込み
require_once(SMARTY_DIR.'Smarty.class.php');
//Smartyクラスのインスタンス生成
$smarty = new Smarty();
//ディレクトリ設定
$smarty->template_dir = SMARTY_TMPL_DIR;
$smarty->compile_dir = SMARTY_COMPILE_DIR;
$smarty->config_dir = SMARTY_CONFIG_DIR;
$smarty->cache_dir = SMARTY_CACHE_DIR;
?>
前回作成したphpからバッサリと抜き出しただけです。
Smarty_test01.php
<?php
date_default_timezone_set('Asia/Tokyo');
//Smartyの設定ファイル
require_once('./smarty_env.php');
//テンプレートファイル
$template = 'Smarty_test01.tmpl';
//表示用テスト用の文字列
$str1 = 'Smartyのテスト';
$str2 = 'こんにちは';
$weekday = array("日", "月", "火", "水", "木", "金", "土");
$strArray = array("りんご","ゴリラ","ラッパ","パーフェクトボディ");
$Email = 'hoge@hogehoge.com';
//文字列を変数名を指定してSmartyに渡す。
$smarty->assign('title',$str1);
$smarty->assign('msg',$str2);
$smarty->assign('date',date("Y/m/d"));
$smarty->assign('week',date("w"));
$smarty->assign('weekday',$weekday);
$smarty->assign('EmailAddress',$Email);
$smarty->assign('shiritori',$strArray);
//テンプレートを表示する
$smarty->display($template);
?>
こちらも前回に加えて、文字データを追加したり、日付を使ってみたのでタイムゾーンの設定を追加しています。
デザイン側(テンプレート)
今回のテンプレートは次のようになります。
それぞれの部分については後ほど簡単に説明します。
Smart_test01.tmpl
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>{$title}</title>
</head>
<body>
<h4 style="background-color:#cccccc">PHPで作った日付文字列を表示</h4>
<p>今日は{$date}です。</p>
<h4 style="background-color:#cccccc">PHPで作った日付をテンプレート側でフォーマットして表示(1)</h4>
<p>今日は{$date|date_format}です。</p>
<h4 style="background-color:#cccccc">PHPで作った日付をテンプレート側でフォーマットして表示(2)</h4>
<p>今日は{$date|date_format:"%Y/%m/%d %A"}です。</p>
<h4 style="background-color:#cccccc">Smartyの予約変数を使って日付を表示</h4>
<p>smarty.nowの日付:{$smarty.now|date_format:'%Y-%m-%d'}</p>
<h4 style="background-color:#cccccc">テンプレート側で配列から値を取得</h4>
<p>今日は{$weekday[$week]}曜日です。</p>
<h4 style="background-color:#cccccc">テンプレート側でif文</h4>
{if $week == 0 || $week == 6}
<p>週末ですね。ゆっくり休めてますか?</p>
{else}
<p>平日ですね。週末に向けて頑張りましょう!!</p>
{/if}
<h4 style="background-color:#cccccc">foreachで配列を表示</h4>
<ul>
{foreach $shiritori as $word}
<li>{$word}</li>
{/foreach}
</ul>
<h4 style="background-color:#cccccc">E-mailアドレスを混乱させる</h4>
<div>
{mailto address=$EmailAddress encode='javascript' subject='Hello'} に問い合わせを送る
</div>
</body>
</html>
出力結果
まずはスクリーンショットから。
プラグインを追加して、iframeで結果を出力してみます。日付が変わっているはずです。
1)日付関連の表示
今回日付の表示で4つ試してみました。
- 単純にPHPで日付を渡してそのまま表示。
<p>今日は{$date}です。</p>
PHPで指定したフォーマット”2019/09/24
“と表示されています。 - 渡された日付をフォーマット(1)
<p>今日は{$date|date_format}です。</p>
Smartyのdate_format
でパラメータ無しのフォーマット”Sep 24, 2019
“と表示されました。 - 渡された日付をフォーマット(2)
<p>今日は{$date|date_format:"%Y/%m/%d %A"}です。</p>
date_format
で指定したフォーマット”2019/09/24 Tuesday
“と表示されました。 - テンプレートで日付を取得して表示
<p>smarty.nowの日付:{$smarty.now|date_format:'%Y-%m-%d'}</p>
今日の日付が指定したフォーマット”2019-09-24
“と表示されました。
例えばCopyrightの年を表示するなど、ロジックから渡すまでもない情報でしたらこれで十分ですね。
2)配列から値を取得して表示
日付で試したついでに、定番の日本の曜日配列を渡して表示。
//PHP
$weekday = array("日", "月", "火", "水", "木", "金", "土");
$smarty->assign('week',date("w"));
$smarty->assign('weekday',$weekday);
//テンプレート
<p>今日は{$weekday[$week]}曜日です。</p>
配列はテンプレート側でもそのままのイメージで使えますね。
3)if
渡されたデータを判断して、出力するテキストを変更する。
//PHP
$smarty->assign('week',date("w"));
//テンプレート
{if $week == 0 || $week == 6}
<p>週末ですね。ゆっくり休めてますか?</p>
{else}
<p>平日ですね。週末に向けて頑張りましょう!!</p>
{/if}
4)foreach
配列を渡して、その中身をforeachで表示。
//PHP
$strArray = array("りんご","ゴリラ","ラッパ","パーフェクトボディ");
$smarty->assign('shiritori',$strArray);
//テンプレート
<ul>
{foreach $shiritori as $word}
<li>{$word}</li>
{/foreach}
</ul>
繰り返して表示するリストなどであれば、一つ一つ渡さなくてもいいですね。
5)Emailアドレスを混乱させる
これは本家のドキュメントを見ていたら面白そうなので試してみました。
//PHP
$Email = 'hoge@hogehoge.com';
$smarty->assign('EmailAddress',$Email);
//テンプレート
<div>
{mailto address=$EmailAddress encode='javascript' subject='Hello'} に問い合わせを送る
</div>
//出力されたソース
<div>
<script type="text/javascript">eval(unescape('%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%27%3c%61%20%68%72%65%66%~中略~%63%6f%6d%3c%2f%61%3e%27%29%3b'))</script> に問い合わせを送る
</div>
ドキュメント(https://www.smarty.net/docs/ja/tips.obfuscating.email.tpl)に書かれていますが、100%解読されないという訳ではないので、ご利用は慎重に。
Smartyでできる事はまだまだたくさんあると思いますが、今後使っていく中で便利そうな機能を見つけたら紹介したいと思います。