EC studio EC studio 技術ブログ

2008年08月07日投稿者:山本 正喜

もっと前に知っておきたかった!と思うSmartyのTips

PHPでSmartyを活用されている方は多いかと思いますが、
何年もたって「実はこんな機能があったのか~!」と後から
気づくことが多々あります。

今回は私がもっと前に知っておけば良かったと
思う機能を中心にいくつかご紹介します。

テンプレート内で定数を使用する

PHPでdefineされた定数をテンプレートで使用したい場合、

  1. {$smarty.const.XXXX}

でアクセスできます。(XXXX は定数名)

  1. {if $smarty.const.XXXX == 'ABC'}
  2.  
  3. {/if}

なんて書き方もできます。

PHPの組み込み関数を使用する

PHPの組み込み関数はそのまま修飾子として使用できます。

  1. {$str|trim}

これで$strに対してtrim関数があたります。

  1. {$str|strip_tags}
  2. {$str|strtoupper}
  3. {$str|mb_strlen}
  4. {$str|rtrim:"/"}
  5. {$str|htmlspecialchars:$smarty.const.ENT_QUOTES}

などなどいろんな応用が考えられますね!

修飾子に渡すパラメータがそのまま関数の
第二引数以降への引数になります。

参照:smarty.netのマニュアル 変数の修飾子

関数プラグインに対して修飾子を適用する

実は、修飾子は変数だけでなく関数に対しても適用できます。

{func}という関数プラグインと、
|mod という修飾子プラグインがあるとします。

  1. {func arg=$aaa}

という関数があった場合、

  1. {func|mod:aaa arg=$aaa}

という書き方で関数の結果に対してmod修飾子を
あてることができます。

また、

  1. {func arg=$aaa|mod:aaa}

とすれば引数に対して修飾子を個別にあてることができます。

ブロック関数は

  1. {block}
  2.  
  3. {/block|mod:aaa}

でOK! (閉じタグにあてるのがポイント)

これは便利です。

テンプレートパス、プラグインパスを複数使用する

通常Smartyを使う場合、

  1. require_once(SMARTY_DIR.'Smarty.class.php');
  2.  
  3. $smarty = new Smarty();
  4.  
  5. $smarty->template_dir = '/path/templates/';
  6. $smarty->compile_dir  = '/path/templates_c/';
  7. $smarty->config_dir   = '/path/configs/';
  8. $smarty->cache_dir    = '/path/cache/';

こんな感じで設定するかと思いますが、
実はこのプロパティ、配列も受け付けます。

  1. require_once(SMARTY_DIR.'Smarty.class.php');
  2.  
  3. $smarty = new Smarty();
  4.  
  5. $smarty->template_dir = array(
  6.     '/path/templates/',
  7.     '/path/common_templates/');
  8. $smarty->config_dir   =  array(
  9.     '/path/configs/',
  10.     '/path/common_configs/');
  11. $smarty->compile_dir  = '/path/templates_c/';
  12. $smarty->cache_dir    = '/path/cache/';

こんな感じで配列を渡せば、
include_pathに指定したかの様に、
その順番でファイルの読み込みを行ってくれます。

共通でよく使うテンプレートなどを、
この方法でシステム間共有するととても便利です。

また、plugins_dir も配列で指定できます。

configのiniファイルで使える拡張文法

Smartyでは設定ファイルとしてiniファイルを読む機能があります。

  1. $smarty->config_load('config.ini');

読み込んだiniファイルの値は、テンプレート内で

  1. {#var#}

として参照できます。
iniファイルは文法がとても簡単なので、デザイナーと協業するときなどに
商品名や住所など変わる可能性があるものを
iniファイルで管理しておくととても便利です。

実はこのiniファイル、PHPの組み込み関数である
parse_ini_file関数を使っていません。

Smartyのインストールフォルダにある、
Config_File.class.php というクラスで、
自前でiniファイルを解析しているのです。

なぜそんなことをしているのか?

おそらくですが、PHPのparse_ini_file関数には
致命的な欠点があって、変数の値に
ダブルクォーテーションが使えないのです。

parse_ini_fileでダメな例

  1. var = '<div style="color:red">重要</div>'

これはエラーになってしまいます。
SmartyのConfig_File.class.phpを使うとこの記述で
ちゃんと意図通りに取得できます。

また、"""~"""という書き方をサポートしています。

  1. var = """<html>
  2. <body onload="init()">
  3. テスト
  4. </body>
  5. </html>
  6. """

こうすれば、変数の中に改行でも " でも ' でも
自由に含めることができてとても便利です。

おそらく、SmartyのiniファイルはHTMLタグを含む可能性があるので、
自前でiniファイルを解析するライブラリを持っているのだと思います。

参照:smarty.netのマニュアル 設定ファイル

このiniを解析するライブラリは他でも活用できるので、
単体で読み込んで使っても便利です。 :)


知らないものはありましたか?

他にも何か「もっと前に知っておきたかった!」と思うようなものが
あれば、是非コメントで教えてください!


関連した記事:
投稿者
人気のエントリー
カテゴリー
最近のエントリー
アーカイブ
Copyright© ChatWork, All Rights Reserved. secured by ESET.