書籍転載:PHPライブラリ&サンプル実践活用[厳選100]
テンプレートでデータ加工や条件分岐/繰り返し処理を表現する(Smarty)
関数、修飾子、演算子など、Smartyで利用できるテンプレートの個別要素について詳しく解説する。書籍転載の13本目(書籍内の番号は「42」)。
書籍転載について
ご注意
本記事は、書籍の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどはBuild Insiderのそれとは一致しません。あらかじめご了承ください。
Smartyでは、関数、修飾子、演算子など、テンプレートで利用できるさまざまな要素が用意されています。これらの要素を利用することで、テンプレートの表現力がぐんと向上します。本項では、booksテーブルから取得した書籍情報を表組みする例を通じて、テンプレートの個別要素について詳らかにします(リスト42-1、42-2、図42-1)。
booksテーブルのフィールドレイアウトについては、表42-1も参照してください。
- 名称: Smarty
- URL: http://www.smarty.net/
- インストール方法: include_path に設置/ Composer
- ファイル: Smarty.class.php
<?php
require_once 'MySmarty.class.php';
$s = new MySmarty();
// pdoオブジェクトを取得し、booksテーブルにアクセス
$db = $s->getDb();
$stt = $db->prepare('SELECT * FROM books ORDER BY published');
$stt->setFetchMode(PDO::FETCH_LAZY);
$stt->execute();
$s->assign('books', $stt);
$s->d();
|
3
1
1
|
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Smartyの基本</title>
</head>
<body>
<table>
<tr>
<th>ISBNコード</th><th>書名</th>
<th>価格</th><th>出版社</th><th>配本日</th>
</tr>
{* 書籍情報を順番に出力 *} 4
{foreach from=$books item=book} 2
<tr>
<td>{$book.isbn}</td>
<td>{$book.title}</td>
<td
{if $book.price lt 3000}style="color:Red;"{/if}> 2
{$book.price¦number_format}円</td>
<td>{$book.publish}</td>
<td>{$book.published¦date_format:'%Y/%m/%d'}</td>
</tr>
{/foreach}
</table>
</body>
</html>
|
フィールド名 | データ型 | 概要 |
---|---|---|
isbn | VARCHAR(20) | ISBNコード(主キー) |
title | VARCHAR(100) | 書名 |
price | INT | 価格 |
publish | VARCHAR(15) | 出版社 |
published | DATE | 配本日 |
1値を加工する「修飾子」
修飾子は、変数や関数の戻り値など、値を加工するための仕組みで、次のように表せます。
{式¦修飾子:"パラメータ":…}
|
たとえば1であればpublished列(配本日)をdate_format修飾子で「%Y/%m/%d」の形式で加工しています。
パラメータを複数受け取る(たとえば)replace修飾子であれば、コロン区切りでパラメータを列挙します。以下は、文字列に含まれる「にわとり」を「はと」に置き換える例です(結果は「にわにはにわはとがいる」)。
{'にわにはにわにわとりがいる'¦replace:'にわとり':'はと'}
|
また、パイプを連ねることで、複数の修飾子を連結することもできます。たとえば次の内容は、文字列をHTMLエスケープした上で(escape)、改行文字を<br> 要素に置き換える(nl2br)例です(結果は「<div> あ<br /> い</div>」)。
{"<div>あ\nい</div>"¦escape¦nl2br}
|
表42-2に、主な修飾子を挙げておきます。これらの他にも、PHPの関数はすべて「暗黙的な」修飾子として利用できます。たとえば以下は、数値に桁区切りのカンマを付与すると共に、小数点以下第2位で丸める例です(結果は1,234.57)。
{1234.567¦number_format:2}
|
これは、PHPで「number_format(1234.567, 2)」と表すのと同じ意味です。
2条件分岐や繰り返し構文を表す「関数」
関数は、条件分岐や繰り返し構文、部分テンプレートのインポートなど、テンプレートの基本的な挙動を提供する要素で、次のように表せます。
{関数名 属性名1="値1" ...}~{/関数名}
|
ただし、配下にコンテンツがない関数*1では、閉じタグ({/ 関数名})は不要です。主な関数については表42-3にもまとめていますが、特記すべきものについて、以降補足していきます。
- *1 テンプレート関数と言います。対して、コンテンツを持つ関数をブロック関数とも言います。
{foreach}関数のプロパティ
{foreach}関数の配下では、表42-4のようなプロパティを利用できます。仮変数(as以下で指定された変数)を介して「$var@prop」の形式でアクセスできます。(たとえば)@iterationプロパティを利用することで、奇数番目の出力のみ斜体にする、というような処理を実装できます。
{if $book@iteration is odd}<i>{$book.title}</i>{else}{$book.title}{/if}
|
アプリ共通のレイアウトを定義する
{extends}関数を利用することで、アプリ共通のレイアウトを1つのテンプレートにまとめられます。
共通レイアウトは、リスト42-3のように表します。{block}関数で用意された部分が、あとでページ個別のコンテンツを埋め込むブロック(プレイスホルダ)です。ここではscript、bodyという名前のプレイスホルダを用意しています。
そして、この共通レイアウトを適用するテンプレートがリスト42-4です*2。冒頭で{extends}関数で適用するレイアウトを呼び出した後、{block}関数でプレイスホルダに埋め込むべきコンテンツを指定します。name属性は、共通レイアウトと個別テンプレートとで対応関係になければいけません。個別テンプレートで{block}関数が省略された場合には、共通レイアウトの{block}関数で定義されたデフォルトコンテンツが採用されます。
- *2 テンプレートを呼び出す.phpファイルは、これまでのコードとほぼ同じなので、割愛します。詳しくは、本書サポートページからダウンロードできるサンプル(layout.php)を参照してください。
最終的な出力結果は、リスト42-5のとおりです。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Smartyの基本</title>
<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
</head>
<body>
共通テンプレートの利用例です。
</body>
|
3演算子
PHPで利用できる代数演算子、比較演算子、論理演算子などを、Smartyでも利用できます。
また、Smartyでは、さらに表42-5のようなエイリアス(別名)も用意されています。いずれを利用するかは好みにもよりますが、可読性の観点からもアプリの中では表記は統一すべきです。
演算子 | エイリアス |
---|---|
== | eq |
!= | ne/neq |
> | gt |
< | lt |
>= | gte/ge |
<= | lte/le |
! | not |
% | mod |
また、Smarty固有の特殊な演算子として表42-6のようなものもあります。
演算子 | 概要 | PHPで表した場合 |
---|---|---|
is [not] div by | ~で割り切れる(割り切れない) | $i % $j == 0 |
is [not] even | 偶数である(ない) | $i % 2 == 0 |
is [not] odd | 奇数である(ない) | $i % 2 != 0 |
is [not] even by | 偶数番目のグループである(ない) | ($i / $j) % 2 == 0 |
is [not] odd by | 奇数番目のグループである(ない) | ($i / $j) % 2 != 0 |
4コメント
{*...*}は、Smartyの解析対象外となるメモ情報を表すためのコメントブロックです。配下に{...}があっても構いませんので、関数や式をまとめて無効化する際にも利用できます。
{*...*}の配下はコンパイル時にサプレスされ、クライアントにも送信されません。もしもクライアント側で確認したいコメントを記述する際には、HTMLのコメントである<!--...--> を利用してください。
※以下では、本稿の前後を合わせて5回分(第11回~第15回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
11. テンプレートエンジンでロジックとレイアウトを分離する(Smarty)
PHPで人気のテンプレートエンジン「Smarty」の基本的な使い方を説明する。書籍転載の11本目(書籍内の番号は「40」)。
12. テンプレートエンジンの動作パラメーターを一元管理する(Smarty)
効率化のために、Smarty派生クラスを用意して、パラメータなどの設定はそこに押し込めてしまう方法を説明する。書籍転載の12本目(書籍内の番号は「41」)。
13. 【現在、表示中】≫ テンプレートでデータ加工や条件分岐/繰り返し処理を表現する(Smarty)
関数、修飾子、演算子など、Smartyで利用できるテンプレートの個別要素について詳しく解説する。書籍転載の13本目(書籍内の番号は「42」)。
14. markdown形式のテキストをHTMLに変換する(PHP Markdown)
Markdown形式のファイルをHTML形式のコードに変換するためのライブラリ「PHP Markdown」の基本的な使い方を説明する。書籍転載の14本目(書籍内の番号は「38」)。