Smartyの基本的な使い方
最初にSmartyの基本的な使い方を説明します。Smartyを呼び出す際によく使われるプロパティ設定とメソッドは次のとおりです。
| プロパティ名 | 概要 |
| template_dir | テンプレートを配置するディレクトリを指定 |
| compile_dir | コンパイルしたテンプレートを格納するディレクトリを指定 |
| force_compile | テンプレートを毎回コンパイルするか? |
| caching | 実行結果をキャッシュするか? |
| cache_dir | キャッシュするディレクトリを指定 |
| cache_lifetime | キャッシュ有効時間を設定 |
| メソッド名 | 概要 |
| assign(変数名, 値) | Smarty変数に値を割り当てます |
| display(テンプレート) | テンプレートを表示します |
| fetch(テンプレート) | テンプレートを出力します |
| register_outputfilter(関数名) | アウトプットフィルタを登録します(後述) |
Smartyの基本機能を使い、DBからデータを取得して一覧表示するサンプルを作成します。以下のSQLを実行してテストデータを作成します。
CREATE TABLE IF NOT EXISTS `books` ( `id` int(11) NOT NULL auto_increment COMMENT 'id', `title` varchar(128) NOT NULL COMMENT 'タイトル', `published_date` datetime NOT NULL COMMENT '発行日', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='書籍テーブル' AUTO_INCREMENT=6 ; INSERT INTO `books` (`id`, `title`, `published_date`) VALUES (1, '今すぐ使えるかんたんプラス 3ステップでしっかり学ぶMySQL入門', '2009-12-22 00:00:00'), (2, '10日でおぼえるPHP5 入門教室 第2版', '2009-12-16 00:00:00'), (3, 'ASP.NET MVC 実践プログラミング - .NET Frameworkによる標準Web開発技法', '2009-10-15 00:00:00'), (4, 'MySQLで学ぶデータベース超入門', '2009-07-30 00:00:00'), (5, '10日でおぼえるASP.NET3.5入門教室', '2009-06-17 00:00:00');
DB接続情報はconfig.phpに記述します。
$MYSQL_HOST = 'MySQLサーバーのアドレス'; $MYSQL_USER = 'MySQLユーザー名'; $MYSQL_PASSWORD = 'MySQLユーザーのパスワード'; $MYSQL_DATABASE = 'データベース名'; $dbType = "mysql";
DB接続、データ取得はPDOを使います。
require_once("libs/Smarty.class.php");
include('config.php');
// Smartyインスタンスの作成
$smarty = new Smarty();
// テンプレートディレクトリ設定
$smarty->template_dir = "templates";
// コンパイル済みテンプレートディレクトリ設定
$smarty->compile_dir = "templates_c";
// DBより情報を取得
$pdo = new PDO("{$dbType}:host={$MYSQL_HOST}; dbname={$MYSQL_DATABASE}","{$MYSQL_USER}", "{$MYSQL_PASSWORD}");
// 書籍のタイトル、発行日を取得する
$stmt = $pdo->prepare("SELECT title , DATE_FORMAT(published_date,'%Y/%m/%d') as published FROM books ");
$stmt->execute(array());
$row = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Smarty変数の割り当て
$smarty->assign("books", $row);
// テンプレートを表示
$smarty->display("books.tpl");
books.phpで使用するテンプレートを「book.tpl」として作成します。DBから取得した書籍のデータを「books」の名前でテンプレートに割り当てます。「books」に割り当てられた値はfetchAllメソッドで取得したとおり、単純配列の1行単位に連想配列を格納した以下の構造をしています。
Array
(
[0] => Array
(
[title] => 今すぐ使えるかんたんプラス 3ステップでしっかり学ぶMySQL入門
[published] => 2009/12/22
)
[1] => Array
(
[title] => 10日でおぼえるPHP5 入門教室 第2版
[published] => 2009/12/16
)
# 略
)
テンプレート「books.tpl」内で「books」に割り当てられた値を取得して1行単位で表示します。テンプレートは通常のHTMLと同様に記述してSmartyのassignメソッドで割り当てられた変数を{$変数}で記述します。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<title>books</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/javascript">
</head>
<body>
<table border=1>
<tr><td>書籍名</td><td>発行日</td></tr>
{foreach from=$books key=k item=i}
<tr><td>{$i.title} </td><td>{$i.published}</td></tr>
{/foreach}
</table>
</body>
</html>
サンプルではDBから取得したデータはassignメソッド「books」という変数に割り当てられているので、テンプレート内では「{$books}」で値を取得できます。{$books}内の値は配列なので、foreachで1行単位で配列内の値を取得します。foreachの記述方法は以下の通りです。
{foreach from=$Array key=k item=v}
{$k}: {$v}<br />
{/foreach}
foreachで取り出した値は連想配列なので「title」、「published」のキーを変数の後ろに「.(ドット)」でつないで{$i.title}、{$i.published}として書籍のタイトル、発行日を取得します。

テンプレート上にbookテーブルから取得したデータが割り当てられます。
