Deep Insider の Tutor コーナー
>>  Deep Insider は本サイトからスピンオフした姉妹サイトです。よろしく! 
書籍転載:PHPライブラリ&サンプル実践活用[厳選100]

書籍転載:PHPライブラリ&サンプル実践活用[厳選100]

テンプレートでデータ加工や条件分岐/繰り返し処理を表現する(Smarty)

2014年9月9日

関数、修飾子、演算子など、Smartyで利用できるテンプレートの個別要素について詳しく解説する。書籍転載の13本目(書籍内の番号は「42」)。

WINGSプロジェクト 山田 祥寛
  • このエントリーをはてなブックマークに追加

書籍転載について

 本コーナーは、技術評論社発行の書籍『PHPライブラリ&サンプル実践活用[厳選100]』の中から、特にBuild Insiderの読者に有用だと考えられる項目を編集部が選び、同社の許可を得て転載したものです。

 

 『PHPライブラリ&サンプル実践活用[厳選100]』の詳細や購入は技術評論社のサイト目次ページをご覧ください。

ご注意

 本記事は、書籍の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどは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
<?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();
リスト42-1 db.php
HTML+Smarty
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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>
リスト42-2 db.tpl
図42-1 booksテーブルの内容を表組み
フィールド名データ型概要
isbn VARCHAR(20) ISBNコード(主キー)
title VARCHAR(100) 書名
price INT 価格
publish VARCHAR(15) 出版社
published DATE 配本日
表42-1 booksテーブルのフィールドレイアウト

1値を加工する「修飾子」

 修飾子は、変数や関数の戻り値など、値を加工するための仕組みで、次のように表せます。

{¦修飾子:"パラメータ":}

 たとえば1であればpublished列(配本日)をdate_format修飾子で「%Y/%m/%d」の形式で加工しています。

 パラメータを複数受け取る(たとえば)replace修飾子であれば、コロン区切りでパラメータを列挙します。以下は、文字列に含まれる「にわとり」を「はと」に置き換える例です(結果は「にわにはにわはとがいる」)。

{'にわにはにわにわとりがいる'¦replace:'にわとり':'はと'}

 また、パイプを連ねることで、複数の修飾子を連結することもできます。たとえば次の内容は、文字列をHTMLエスケープした上で(escape)、改行文字を<br> 要素に置き換える(nl2br)例です(結果は「&lt;div&gt; あ<br /> い&lt;/div&gt;」)。

{"<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のとおりです。

HTML
<!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>
リスト42-5 レイアウトを適用した結果

3演算子

 PHPで利用できる代数演算子、比較演算子、論理演算子などを、Smartyでも利用できます。

 また、Smartyでは、さらに表42-5のようなエイリアス(別名)も用意されています。いずれを利用するかは好みにもよりますが、可読性の観点からもアプリの中では表記は統一すべきです。

演算子エイリアス
== eq
!= ne/neq
> gt
< lt
>= gte/ge
<= lte/le
! not
% mod
表42-5 演算子の主なエイリアス

 また、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
表42-6 Smarty固有の特殊演算子

4コメント

 {*...*}は、Smartyの解析対象外となるメモ情報を表すためのコメントブロックです。配下に{...}があっても構いませんので、関数や式をまとめて無効化する際にも利用できます。

 {*...*}の配下はコンパイル時にサプレスされ、クライアントにも送信されません。もしもクライアント側で確認したいコメントを記述する際には、HTMLのコメントである<!--...--> を利用してください。

※以下では、本稿の前後を合わせて5回分(第11回~第15回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

書籍転載:PHPライブラリ&サンプル実践活用[厳選100]
11. テンプレートエンジンでロジックとレイアウトを分離する(Smarty)

PHPで人気のテンプレートエンジン「Smarty」の基本的な使い方を説明する。書籍転載の11本目(書籍内の番号は「40」)。

書籍転載:PHPライブラリ&サンプル実践活用[厳選100]
12. テンプレートエンジンの動作パラメーターを一元管理する(Smarty)

効率化のために、Smarty派生クラスを用意して、パラメータなどの設定はそこに押し込めてしまう方法を説明する。書籍転載の12本目(書籍内の番号は「41」)。

書籍転載:PHPライブラリ&サンプル実践活用[厳選100]
13. 【現在、表示中】≫ テンプレートでデータ加工や条件分岐/繰り返し処理を表現する(Smarty)

関数、修飾子、演算子など、Smartyで利用できるテンプレートの個別要素について詳しく解説する。書籍転載の13本目(書籍内の番号は「42」)。

書籍転載:PHPライブラリ&サンプル実践活用[厳選100]
14. markdown形式のテキストをHTMLに変換する(PHP Markdown)

Markdown形式のファイルをHTML形式のコードに変換するためのライブラリ「PHP Markdown」の基本的な使い方を説明する。書籍転載の14本目(書籍内の番号は「38」)。

書籍転載:PHPライブラリ&サンプル実践活用[厳選100]
15. さまざまなグラフを動的に生成する(準備編)(JpGraph)

グラフ作成ライブラリ「JpGraph」を利用するまでの準備手順を説明する。書籍転載の15本目(書籍内の番号は「24」)。

サイトからのお知らせ

Twitterでつぶやこう!