SHOEISHA iD

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

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

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

japan.internet.com翻訳記事

PHP、MySQL、JavaScriptによるセキュアなインターネットファイル共有システムの作成

Smartyを利用したテンプレートとロジックの分離

ダウンロード サンプルソース (14.8 KB)

Smartyの内容と働き

 Smartyを専門用語で言えば、テンプレートエンジンです。要するに、開発者が標準的なサイトレイアウトを維持しながらプレゼンテーションからロジックを切り離すことを簡単にできるようにするフレームワークです。多くのオンラインディスカッションフォーラムで、SmartyはMVCパラダイムの最小限の有効な実装かどうかという議論が繰り広げられていますが、私自身の考えでは、Smartyは経験の浅い開発者がコードとプレゼンテーションの分離を実現するための抜け道です。

 Smarty自体は基本的な構文を持つプログラミング言語です。前述のフォーラムで議論されているように、プレゼンテーションロジックを持つプレゼンテーションエンジンが必要だと考える人もいるようです。個人的には、ビジネスロジックとプレゼンテーションロジックの両方が存在すると考えます。つまり、プレゼンテーションロジックの乱用はよくないと思う場合でも、両方のロジックを受け入れることは可能です。実際、PHPコードによって、最終的な変数の代入をできる限り多く処理する必要があり、結局のところ、SmartyテンプレートはHTMLファイルを保たなければなりません。

 Smartyをインストールするには、2つのディレクトリ(templatesとconfigs)を作成する必要があります。一般に、これらの2つのディレクトリはWebサーバードキュメントルートの外に置く必要がありますが、この例ではアプリケーションルートの下に入れました(smarty/templatesとsmarty/configs)。smarty/templatesディレクトリには、拡張子が.tplであるすべてのSmartyファイルを入れます。結局、Smartyファイルは、PHPコードによってコンテンツの割り当てと受け渡しが行われる単なるHTMLファイルです。

 すでに説明したように、Smartyには、プレゼンテーションロジックの簡単な管理に役立つ基本的な構文が用意されています。{include ...}という便利な構成体を使うと、複数のテンプレートの共通部分を1つのマスタテンプレートに埋め込むことができます。私は、PHPファイルと同じ命名スキーマを採用し、HTMLページの部分的なパーツを表すファイルに「inc」という接尾辞を使いました。このモジュール式メカニズムでは、Smarty/HTMLテンプレートの作成を始める前に、ページレイアウトを作成する必要があります。たとえば図3のスキーマは、この例で「files.all.tpl」ページと「files.tag.tpl」ページに使用しているスキーマです。Smartyファイルの編成と命名規則はこのスキーマを反映しています。

図3 テンプレートのレイアウトスキーマ。Smartyファイルの編成と命名規則はこのスキーマを反映している。
図3 テンプレートのレイアウトスキーマ。Smartyファイルの編成と命名規則はこのスキーマを反映している。

 Smartyが実際に動作するかを確認するため、複数の連想配列から成るインデックス付き配列をPHPからSmartyに渡す処理を分析しましょう。特に、「inc.util.php」内の関数ファイルが、データベースに格納されているファイルのリスト作成を処理します。行$file_array=db_query($dsn,$sql)$file_arrayが、SQLクエリから返されたインデックス付き配列です。各要素は行を表しますが、これはクエリフィールドに等しいキーを持つ連想配列です。コードをもう少し進むと、Smarty構造に割り当てられる行があります。これらの行の例を次に示します。

$smarty->assign('file_array', $file_array);

 最後に、次の行があります。

$smarty->display('files.all.tpl');

 これらの命令は、ファイル「files.all.tpl」内の規則に従ってHTMLページをレンダリングする制御をSmartyに送ります。このファイルには「inc.file_list.tpl」が埋め込まれ、そこに次の行があります。

<ol class="core">
{foreach item=file from=$file_array name=file_loop}
<li class="core_left">
{if isset($file.protection)}
   ... 
    <input class="core" type="checkbox" name="select-{$file.id}" 
           value="yes" disabled="disabled"/>
   ... 

 いくつかの構文構成体が記述されていることがすぐにわかるでしょう。たとえば{foreach ... }は、インデックス付き配列に対して繰り返し処理を行います。また、この例から、連想配列内の要素を参照する方法もわかります。{$file.protection}$file['protection']に対応し、{$file.id}$file['id']に対応します。

次のページ
overLIBとポップアップメニュー

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

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

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

Roberto Giorgetti(Roberto Giorgetti)

イタリアに拠点を置くITマネージャ、テクニカルライター。主にビジネス分野と工業分野でオープンソースの開発に従事。核工学の学位を持つ。

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2638 2008/07/01 14:00

イベント

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

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

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

メールバックナンバー