Smartyとは

まずはSmartyの概要や使うことのメリットについて解説していきます。


Smarty の概要

SmartyはPHPのテンプレートエンジン1つです。

テンプレートエンジンの先駆けであり、2000年代前半にリリース

以降、現在に至るまで多くのシステムに使われています。

一般的に使われているものの中では、一番歴史が古いテンプレートエンジンです。

昔から使われていることもあり、Smartyにはバージョンがいくつか存在しています。

Smartyについて調べるときは、自分が使用しているバージョンを把握しておきましょう。


Smarty で何ができるのか?

Smartyの主な役割は、HTMLに記述されているPHPを分離することです。

利点としては、デザイナーとプログラマーの棲み分けができることでしょう。

プログラムの開発が終わらずとも、デザイナーがコーディングを始められます。

またPHPコードを分離させているので、HTMLを修正せずにロジックの変更が可能です。


Smartyの便利な機能

Smartyの特徴を簡単にご紹介します。

  • コンパイルは最初の1回だけのため効率的
  • 修正があってもコンパイルされるのはテンプレートファイルのみ
  • 自分で関数や変数を作成できるため、テンプレート言語の拡張が容易
  • デリミタを変更可能
  • プラグイン機能がある

この中でも特徴的なのはテンプレートファイルをコンパイルすることです。

次回からはコンパイルされたデータが読み込まれるため、パース処理の負荷がなくなります


ダウンロード方法

Smartyのダウンロードの手順について見ていきます。


ダウンロードサイトへのアクセス

  1. SmartyのHPへ行きましょう
  2. サイト左上のDownloadをクリックします
  3. サイト下部のSmarty 3 latestをクリックします
  4. 外部サイトのGitHubに飛びます

本記事は2019年11月にリリースされた、バージョン3.1.34 を参考に記述されています。

さらに新しいバージョンがリリースされている場合は、そちらをダウンロードしてください。


ダウンロード

AssetsにあるSource codeファイルをダウンロードしてください。

Windowsならzipファイル、Linuxならtar.gzファイルになります。


ファイルを解凍する

ダウンロードしたファイルを解凍してください。

解凍するとSmartyのバージョン情報や説明などのファイルがいくつか出てきます。

ファイルが多くて戸惑いそうですが、必要なのはlibsフォルダのみになります。

このままのlibsで使用しても問題ありませんが、分かりにくいため名前をsmartyに変更しておきましょう。


導入手順を分かりやすく解説

Smartyの導入はすべて手動で行わなければいけません。

最初は少し戸惑うかもしれませんが、手順はいたってシンプルです。


Smartyの配置場所

ダウンロードしたファイルを、適用したいPHPファイルに配置します。

例として「C:適用したいファイル名/php/smarty」こういったイメージです。

上記のように、phpから読み込める場所に配置しましょう。


インクルードパスの設定

インクルードパスを作成する前に、php.iniのバックファイルを作成しておきましょう。

バックファイルを作ったら、php.iniを開いてctrl+Fでinclude_pathを検索します。

インクルードパスの設定がコメントになっているなら、;を外して有効にしてください。

include_path=”.;C:\フォルダ名\php\smarty\”」このようにインクルードパスを設定できたら完了です。

また、すでにインクルードパスが設定されている場合。

「include_path=”.;C:\フォルダ名\php\〇〇\;C:\フォルダ名\php\smarty\”」こういったように後ろに付け足しても問題ありません

今回はCドライブ直下に置くことを想定して行いましたが、パスが違う場合は適宜変更してください。


php.iniの変更を確認する

インクルードパスの設定が終わったら、ブラウザのlocalhostからphpinfoを確認しましょう。

include_pathが、先ほど設定したパスに変更されていたら成功です。


テンプレートフォルダを作成する

Smartyを動作させるには2つのフォルダが必要になります。

  • templatesフォルダ(テンプレートファイルを置くフォルダ)
  • templates_cフォルダ(コンパイルされたファイルを置くフォルダ)

それぞれ適用したいファイルの直下に作成しておきましょう。


テンプレートファイルを作成する

templatesフォルダを作成したら、そのフォルダ内にindex.tplを作成しましょう。

このテンプレートファイルは、後ほど行う動作確認で使用します。

  1. <!DOCTYPE html>
  2.    <html lang=“ja”>
  3.        <head>
  4.            <title>これはSmartyのテストです!</title>
  5.        </head>
  6.        <body>
  7.            <p>私の名前は{$name}です。</p>
  8.            <p>Hello World!</p>
  9.        </body>
  10.    </html>


index.phpを作成する

適用したいファイルの直下にindex.phpを作成しましょう。

今回はテストのため、{$name}に名前を入れる処理を記述していきます。

  1. <?php
  2.   require_once(‘Smarty.class.php’); //Smartyのクラスを読み込む
  3.   $smarty = new Smarty; //Smartyのインスタンスを作成
  4.   $smarty->template_dir = ‘./templates/’;//テンプレートフォルダを指定
  5.   $smarty->compile_dir = ‘./templates_c/’; //コンパイルされたデータの格納場所を指定
  6.   $smarty->assign(‘name’, ‘あなたの名前’); //今回テストで使う処理を記述
  7.   $smarty->display(‘index.tpl’); //ディスプレイ表示させるファイルを指定
  8. ?>

処理が上手く行われていれば、テンプレートファイルの{$name}に設定した値が表示されます。


動作確認を行う

ブラウザからindex.tplを開いてください。

実際に動作をしているのか確認してみましょう。

私の名前は〇〇です。Hello World!」という文言が表示されているでしょうか。

上記のように出力されていれば、Smartyの導入は成功です。


動作確認でエラーが出た場合

Smartyを導入する際に起こりうる、エラーの種類を見ていきます。


インクルードパスのエラー

Fatal error : require_once(): Failed opening required ‘Smarty.class.php’ (include_path= ~などのように出力されるエラーがあります。

上記のように出た場合、Smarty.class.phpの読み込みが出来ていません

もう一度、インクルードパスの設定を見直してみましょう。


プログラミングが間違っているときのエラー

Parse error: syntax error ~は、コンピュータが、書かれている文を理解できないと起きるエラーです。

文法が間違っていないか、全角が混じっていないか、などを確認してください。


ファイルが取得できないときのエラー

Fatal error: Uncaught –> Smarty: Unable to load ~と表示されたときは、index.phpがファイルの読み込みに失敗しています。

index.php内の記述と参照先フォルダの名前が一致しているのか、などを確認してください。


ファイルの書き込みが出来ないときのエラー

Smartyがtemplates_cに、コンパイルされたファイルを書き込めないときには、Uncaught –> Smarty: unable to write file ~と出力されます。

書き込み権限を付与してください。


基本構文

ここからは、Smartyの基本的な使い方について見ていきましょう。


コメントの記述方法

PHPではコメントをつけるときに//や/* */などをつけていました。

一方、Smartyでは{*ここにコメントを記述*}のようにコメントを書きます。

また、HTMLのコメントとは違い、Smartyのコメントはテンプレートの最終的な出力に反映されないのが特徴です。

外部に伝えたくないことは{* *}で記述すると良いでしょう。


プログラミングのルール

Smartyは{$変数名}のように、頭に$をつけてデリミタで囲むことで有効になります。

基本的な構文は以下の通りです。

  • {$foo}…基本的な変数
  • {$foo[1]}…配列
  • {$foo.bar}…連想配列
  • {$foo->bar}…オブジェクトのプロパティを表示
  • {$foo->bar()}…オブジェクトのメソッドの戻り値を表示

変数名にはPHPと同様に英数字とアンダーバーの使用が可能です。


修飾子

{$変数名|修飾子名}のように使うことで、変数の値を変更することが可能になります。

変数の値を直接表示させたくない場合に役に立つでしょう。

基本的な修飾子は以下になります。

  • {$foo|upper}…変数内の小文字を大文字に変換
  • {$foo|lower}…変数内の大文字を小文字に変換
  • {$foo|capitalize}…変数内の最初の文字を大文字に変換
  • {$変数名|default:’デフォルト’}…変数内が空の場合、デフォルトを表示

他にも文字数をカウントするものや、数値の桁数を制御するものなど、様々な修飾子が存在します。


JavaScriptやCSSをSmartyに読み込ませない方法

HTMLの文中にJavaScriptやCSSのコードが混じると、Smartyが{}をデリミタと判断してエラーを出す原因となります。

その場合は、literal構文デリミタの変更をして、エラーを回避しましょう。


literal構文

literal構文で囲まれた部分は、Smartyに構文解析されなくなります。

  1. <script>
  2. {literal}
  3.     function sample() {
  4.       console.log (‘Hello World’);
  5. }
  6. {/literal}
  7. </script>


デリミタの変更

JavaScriptやCSSの混じる頻度が高い場合は、デリミタそのものを変更したほうが良いでしょう。

最初からデリミタを変更しておけば、ミスの削減に繋がります。

  1. <?php
  2.   $smarty->left_delimiter = ‘<{‘;     //左のデリミタを<{に変更
  3.   $smarty->right_delimiter = ‘}>’;  //右のデリミタを}>に変更
  4.   $smarty->assign(‘name’,‘あなたの名前’);
  5. ?>

上記のようにデリミタを変更したので、テンプレートのファイルを下記のように書き換えることができます。

  1. <p>私の名前は<{$name}>です。</p>

自分の使いやすいように、デリミタを変更しましょう。


基本的な関数

ここからは、foreach関数とif関数の使い方について見ていきましょう。

本項目ではSmartyのクラスの取り込みやディスプレイ表示などの記述は省略してあります。

実際に試す場合は、index.phpにそれらも一緒に記述してください。


foreach関数

まずは変数に割り当てる値を設定していきます。

  1. <?php
  2. $bag = array(‘egg’, ‘meat’, ‘fish’);
  3. $smarty->assign(‘foods’, $bag);
  4. ?>

次にHTMLのforeach関数に{$food}を記述することで、$bagの中身を取り出します。

  1. <ul>
  2.   {foreach $foods as $food}
  3.      <li>{$food}</li>
  4.   {/foreach}
  5. </ul>

上記を実行すると、arrayで指定した値がHTMLのリスト表示に従ってすべて出力されます。

<php~?>の記述が必要ないので、従来よりもすっきりと記述することができました。


if関数

PHPでdinnerにcurryの値を入れます。

  1. <?php
  2. $smarty->assign(‘dinner’, ‘curry’);
  3. ?>

次にdinnerの値によって分岐する、if構文を書いていきます。

  1. {if $dinner == ‘curry’}
  2.     <p>夕飯はカレーです。</p>
  3. {elseif $sample == ‘hamburg’}
  4.     <p>夕飯はハンバーグです。</p>
  5. {else}
  6.     <p>夕飯はお寿司です。</p>
  7. {/if}

見てもらえば分かるとおり、Smartyを使っても条件分岐を書くと複雑になってしまいます。

プログラマーとデザイナーの棲み分けをするためにも、複雑な構文はHTMLに書かないのがおすすめです。


まとめ

今回はSmartyの導入方法から基本構文までご紹介してきました。

導入するのは少し手間がかかりますが、一度入れてしまえばコードの分離ができるためメンテナンスも楽になります

また、多くの人が関わるプロジェクトなら、Smartyを使うことでより能率的に業務を進めることが出来るでしょう。