第2回 Smartyを使ってみる(その1:変数編) - Smarty講座

PHP基礎編

yossy先生のSmarty講座

Lecutures on PHP

第2回 Smartyを使ってみる(その1:変数編) (その2)

 このエントリーをはてなブックマークに追加

テンプレートファイルの記述方法

続いてテンプレートファイルの記述方法について説明します。前回、テンプレートファイルの作成例でも説明しましたが、{$var}のような記述方法で変数を埋め込むことが出来ます。

こんにちは、{$name}さん!!

上記の例では、PHPからassignメソッドでname変数に渡された値が{$name}に展開され表示されます。

yossy先生

さて、assignメソッドで配列やオブジェクトを渡すことが出来ると説明しましたが、これらの要素やメンバーにアクセスするにはどうしたらいいでしょうか?

配列の場合はPHPと同様に、{$arr[0]}のように[]で添え字指定をすることでアクセスすることが出来ます。

しかし連想配列の場合はPHPと書き方が異なります。PHPでは$arr['key']のように書きますが、Smartyテンプレートでは{$arr.key}のように、ドット(.)のあとにキーを記述します。また、$arr[$var]のように他の変数をキーとする場合は{$arr.$var}のような記述も可能です。PHPの記述方法と混乱しないように気をつけてください。

オブジェクトはPHPと同様に{$obj->var}と->を用いることでメンバ変数にアクセスすることが出来ます。また{$obj->get()}のようにメソッドを呼び出すことも可能です。もちろん、{$obj->set($var)}のようにメソッドのパラメータを渡すことも出来ます。メソッドを呼び出した場合、戻り値が表示されます。

{* 配列にアクセスする例 *}
友人1:{$friends[0]}, 友人2:{$friends[1]} ...

{* オブジェクトのメソッドを呼び出す例 *}
オブジェクトのIDは{$test_obj->getID()}です。

設定ファイルと予約変数

さて、サイト構築を進めていくと、次第にページ数が増えてきて、各ページ共通で用いたい定数を定義したいと思う場面が出てきます。もちろん各ページでassignメソッドを用いてテンプレートファイルに定数を渡しても構わないのですが、手間もかかりますしバグの温床になりかねません。

そこでここでは定数を定義する2種類の方法を説明したいと思います。

○ 設定ファイルを用いる

前に説明したSmartyで用いる4種類のパスに「設定ファイルディレクトリ」というのがあったと思いますが、このディレクトリに設定ファイルを作成し、その中で値を定義することが出来ます。ここでは設定ファイルディレクトリ/var/www/smarty/configs に設定ファイルtest.confを作成してみます。

title 'Smartyサンプル'

titleという名前の値として「Smartyサンプル」という文字列を設定しています。ではこの値を表示するテンプレートファイルを作成してみます。

{config_load file='test.conf'}
<
html>
<
head>
  <
title>{#title#}</title>
</head>
<
body>
こんにちは、{$name}さん!!
今日は{$smarty.now|date_format:'%Y年%m月%d日'}です。
</body>
</
html>

いかがでしょうか? ページのタイトルが「Smartyサンプル」と表示されたのが確認できましたでしょうか。まず{config_load file='(設定ファイル名)'}と記述することで、設定ファイルディレクトリにある設定ファイルを読み込みます。次に{#(名前)#}という記述で設定ファイルに記述された値を埋め込むことが出来ます。


○ PHPのdefineで定義した値にアクセスする

上記の設定ファイルを用いる方法は、Smartyのみ利用できる定数の定義でしたが(*1)、PHPでdefineを用いて定義した定数をテンプレートファイル上からアクセスする方法もあります。予約変数{$smarty.const}を用いると、defineで定義された値にアクセスすることが出来ます。

<?php
define
'MY_TITLE''Smartyサンプル' );
?>
<html>
<
head>
  <
title>{$smarty.const.MY_TITLE}</title>
</
head>
<
body>
こんにちは、{$name}さん!!
今日は{$smarty.now|date_format:'%Y年%m月%d日'}です。
</body>
</
html>

PHPのdefineでMY_TITLEという定数を定義します。この定数をテンプレートファイル上で表示したい場合、{$smarty.const}に定数名をつけた{$smarty.const.MY_TITLE}で値が展開されます。

yossy先生

以上2種類の方法を紹介しましたが、PHPと共通で利用する定数の場合は{$smarty.const}、テンプレートファイルのみで利用する定数の場合は設定ファイルを用いる、と用途によって使い分けるといいかもしれません。

さて、予約変数{$smarty}について簡単に触れておきます。この変数ですが、PHPで定義された定数だけでなく、環境変数やリクエスト変数などにアクセスすることも出来ます。また前回の実行例で紹介した{$smarty.now}もこの予約変数を用いており、現在のタイムスタンプにアクセスする値です。

{* 環境変数"HOME"の値を表示 *}
{$smarty.env.HOME}

{* フォームからPOSTされたパラメータ"name"を表示。($_POST['name']の値) *}
{$smarty.post.name}

{* http://www.example.com/index.php?id=123 のパラメータidの値を表示($_GET['id']の値) *}
{$smarty.get.id}

{* 現在のタイムスタンプを表示(1970/1/1からの経過秒数) *}
{$smarty.now}

他にもいくつかありますので、Smartyのマニュアルで確認してみてください。(*2)

さて第2回はここまでです。今回、変数の説明をしましたが、おそらく「配列を使ったループをどう書くんだろう?」とか「変数の値による条件分岐はどうするんだろう?」とか思った人も多いと思います。そこで次回は、制御構文の書き方と関数について説明したいと思います。

----
*1) 実際にはSmartyクラスのget_config_varsメソッドを用いればPHPでも取得は出来ます。
*2) http://www.smarty.net/manual/ja/language.variables.smarty.php

  • 1
  • 2
  • yossy先生

本名:吉武 正史

パッケージ系ソフトウェア会社で、自然言語処理系の研究やWebアプリケーション、検索連動型広告などの開発に従事。 2006年末にフリーランスとして独立し、現在はPHPによるWeb開発の業務を中心に、コンサルティングや執筆活動などを展開。
サイトURL:http://freeative.jp/

ご意見・感想フォーム

今回の「yossy先生のSmarty講座」への評価・ご意見があればご記入下さい。

評価:
ご意見・感想:

  



Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)