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

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

テンプレートエンジンでロジックとレイアウトを分離する(Smarty)

2014年9月2日

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

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

書籍転載について

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

 

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

ご注意

 本記事は、書籍の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどはBuild Insiderのそれとは一致しません。あらかじめご了承ください。

 テンプレートエンジンを利用することで、より簡易な記法で動的なページを記述できます。できることが出力に限定されている分、デザイナにも習得しやすいのが特徴です。また、テンプレートとロジックを明確に分離することで、プログラマとデザイナの分業が容易になります。Smartyは、あまたあるテンプレートエンジンの一種で、「古くからよく利用されている」「構文が豊富」「モジューラブルで拡張性に優れる」などの特徴があります。

  • 名称: Smarty
  • URL: http://www.smarty.net/
  • インストール方法: include_path に配置/ Composer
  • ファイル: Smarty.class.php

インストール

 Smartyは、本家サイトからダウンロードできます。ダウンロードしたSmarty-3.1.16.zipを解凍し、配下のlibsフォルダをinclude_pathで指定されたパスにコピーしてください*1。また、サンプルを配置するフォルダと同列に、/templates、/templates_cフォルダを作成しておきます。/templatesはテンプレートを格納するための、/templates_cはコンパイル済みのテンプレートを保存するための、それぞれフォルダです。

  • *1 Composer(P.8=転載対象外)を利用する際には、composer.jsonに「"require": { "smarty/smarty": "3.*" }」を追記してください。

 なお、本書では、実行の利便性を優先して、ドキュメントルートの配下にテンプレートを保存していますが、このような配置はセキュリティ上、望ましくありません。というのも、ドキュメントルート配下のテンプレートファイルは、場所さえ知っていれば、誰でも参照できてしまうためです。テンプレートファイルの漏えいが必ずしもセキュリティホールとなるわけではありませんが、内部情報を露出してしまうのは望ましいことではありません。原則として、テンプレートファイルはドキュメントルートの“外”に配置してください。

Smartyの基本(.phpファイル)

 Smartyをインストールできたところで、その確認も含めて、簡単なHello, Worldサンプルを作成します(リスト40-1、図40-1)。Smartyのコアとなるのは、Smartyクラスの役割です。

 インスタンス化した後、動作パラメータ(プロパティ)を設定します(1)。

PHP
<?php
require_once 'libs/Smarty.class.php';

// 1Smartyクラスの初期設定
$s = new Smarty();
$s->template_dir = './templates/'; // テンプレートの格納先
$s->compile_dir = './templates_c/'; // コンパイル結果の格納先

// 2テンプレート変数を設定
$s->assign('message', 'こんにちは、世界! ');
// 3テンプレートを実行
$s->display('begin.tpl');
リスト40-1 begin.php
図40-1 Smartyで生成されたページ

 2のassignメソッドは、テンプレート変数を設定します。テンプレート変数とは、名前のとおり、テンプレートで参照できる変数のこと。Smartyのようなテンプレートエンジンでは、ロジック側でテンプレート変数を用意しておき、テンプレート側では変数の表示場所/方法を決めるという役割分担が基本です。

 ここでは、テンプレート変数messageに対して、固定値として「こんにちは、世界!」という文字列をセットしているだけですが、assignメソッドを列挙すれば複数の変数を定義することもできますし、(文字列ではなく)配列やオブジェクトなども設定できます。

 テンプレート変数を準備できたら、あとは、displayメソッドで指定されたテンプレートを呼び出すだけです(3)。テンプレートはtemplate_dirプロパティで指定したフォルダ(ここでは/templates)から検索されますので、ファイル名だけを指定します。

Smartyの基本(.tplファイル)

 リスト40-1に対するテンプレートは、リスト40-2のとおりです。.phpファイルでテンプレート変数を参照するには、{ $変数名}のように記述します。スカラー値以外にアクセスするならば、それぞれ表40-1のように表せます。

HTML+Smarty
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Smartyの基本</title>
</head>
<body>
<p>{$message}</p>
</body>
リスト40-2 begin.tpl
意味
{$hoge[0]} 配列(先頭の要素)
{$hoge.foo} 連想配列(キーがfoo)
{$hoge->foo} オブジェクトのfooプロパティ
{$hoge->piyo()} オブジェクトのpiyoメソッド
表40-1 テンプレートにおける式表現

 以上の準備ができたら、begin.phpにアクセスしてみましょう。先ほどの図40-1のような結果が得られれば、Smartyは正しく動作しています。また、/templates_cフォルダ(compile_dirプロパティの値)には「757aa90b66e47427f581cefe38ddd466b96716ea.file.begin.tpl.php」のようなファイルが生成されていることも確認してください。

 Smartyでは、初回アクセス時にテンプレートを.phpファイルに変換(コンパイル)し、次回以降はコンパイル済みのファイルを利用することで、実行効率を向上しているのです。テンプレートが更新された場合には、自動的に再コンパイルされますので、開発者がコンパイルという作業を意識する必要はありません。

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

書籍転載:PHPライブラリ&サンプル実践活用[厳選100]
9. 既存のPDF文書をもとに新たなPDF文書を生成する(FPDI)

FPDIを使って、既存のPDF文書をテンプレートとして引用する方法を説明する。書籍転載の9本目(書籍内の番号は「31」)。

書籍転載:PHPライブラリ&サンプル実践活用[厳選100]
10. PDFファイルを読み込む/生成する(Zend_Pdf)

PDFファイルの読み込みや生成が容易にできるライブラリ「Zend¥Pdf」の基本的な使い方を説明する。書籍転載の10本目(書籍内の番号は「32」)。

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

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

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

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

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

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

サイトからのお知らせ

Twitterでつぶやこう!