CodeZine(コードジン)

特集ページ一覧

WEBシステムの様々な機能をSmartyを使って実装する

目的に応じて適材適所で使うPHPライブラリ(7)

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2010/05/25 14:00
目次

Smartyの基本的な使い方

 最初にSmartyの基本的な使い方を説明します。Smartyを呼び出す際によく使われるプロパティ設定とメソッドは次のとおりです。

Smartyの主なプロパティ設定
プロパティ名 概要
template_dir テンプレートを配置するディレクトリを指定
compile_dir コンパイルしたテンプレートを格納するディレクトリを指定
force_compile テンプレートを毎回コンパイルするか?
caching 実行結果をキャッシュするか?
cache_dir キャッシュするディレクトリを指定
cache_lifetime キャッシュ有効時間を設定
Smartyの主なメソッド
メソッド名 概要
assign(変数名, 値) Smarty変数に値を割り当てます
display(テンプレート) テンプレートを表示します
fetch(テンプレート) テンプレートを出力します
register_outputfilter(関数名) アウトプットフィルタを登録します(後述)

 Smartyの基本機能を使い、DBからデータを取得して一覧表示するサンプルを作成します。以下のSQLを実行してテストデータを作成します。

[リスト2]create_table.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に記述します。

[リスト3]config.php
$MYSQL_HOST = 'MySQLサーバーのアドレス';
$MYSQL_USER = 'MySQLユーザー名';
$MYSQL_PASSWORD = 'MySQLユーザーのパスワード';
$MYSQL_DATABASE = 'データベース名';
$dbType = "mysql";

 DB接続、データ取得はPDOを使います。

[リスト4]books.php
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行単位に連想配列を格納した以下の構造をしています。

[リスト5]「books」に割り当てられた値
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メソッドで割り当てられた変数を{$変数}で記述します。

[リスト6]books.tpl
<!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の記述方法は以下の通りです。

[リスト7]$Arrayを「キー」「値」のペアで表示するforeachの記述例
{foreach from=$Array key=k item=v}
    {$k}: {$v}<br />
{/foreach}

 foreachで取り出した値は連想配列なので「title」、「published」のキーを変数の後ろに「.(ドット)」でつないで{$i.title}、{$i.published}として書籍のタイトル、発行日を取得します。

book.php実行結果
book.php実行結果

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


  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:目的に応じて適材適所で使うPHPライブラリ

もっと読む

著者プロフィール

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

  • WINGSプロジェクト 片渕 彼富(カタフチ カノトミ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5