SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

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

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

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

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テーブルから取得したデータが割り当てられます。

次のページ
Smartyでページ出力時に文字コードを変換する

この記事は参考になりましたか?

目的に応じて適材適所で使うPHPライブラリ連載記事一覧

もっと読む

この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5123 2010/05/25 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー