今更Smartyネタではありますが、まだ使われているところもあるっちゃあるのです。本日は「Smartyプリフィルタプラグインで全てのテンプレートファイルを置換する」についてです。
こんにちは。猫ITソリューションズ広報の齊藤メイ(♀)です。本日は、「Smartyプリフィルタプラグインで全てのテンプレートファイルを置換する」についてです。
Smartyとは...についてはあえて説明しません。今更知る必要もないかと思います。なお今回使用するバージョンは2.6.7になります。
Smartyプラグインとは
色々なタイミング(テンプレートを読み込む前・コンパイル直後など)で、色々な処理を行わせることができる機能です。以下はそのおおまかな種類です。
- テンプレート関数プラグイン
- 修飾子プラグイン
- ブロック関数プラグイン
- コンパイラ関数プラグイン
- プリフィルタプラグイン
- ポストフィルタプラグイン
- アウトプットフィルタプラグイン
- リソースプラグイン
- インサートプラグイン
何となく名称で動きの想像がつくかと思いますが、詳しくは各リンクからご参照ください。
Smartyプラグインの作成ルール
Smartyプラグインは当然プラグインファイルを作って動作させる訳ですが、プラグインの作成・動作ルールを知っておく必要があります。適当に作ってプラグインディレクトリに放り込めばいいという訳でもないのです。
プラグインの動作
プラグインは任意のタイミングで動作させることはもちろん、有効・無効も設定できます。ただしプラグインの種類によっては多少の制約があります。詳しくは以下ページをご参照ください。
Chapter 16. プラグインによる Smarty の拡張 | Smarty
プラグインディレクトリ
自分で指定することも可能ですが、デフォルトは SMARTY_DIR 直下の plugins/ です。詳しくは以下ページをご参照ください。
$plugins_dir | Smarty
命名規則
プラグインファイルは適当なファイル名では動きません。ルールに従って命名する必要があります。またプラグイン関数名にも留意してください。詳しくは以下ページをご参照ください、ってさっきからこればかりで手抜きっぽいですね。
命名規約 | Smarty
サンプル
要件と制約
では早速プラグインを作ってみましょう。今回サンプルとして作るプラグインの要件と制約は以下の通りです。
- 全てのページの</body>タグの前にJavaScriptコードを埋め込みたい
- JavaScriptコードは外部ファイル
- 実プログラムには1ミリも手を加えられない
プラグインディレクトリを確認
プラグインディレクトリを確認します。先に書いた通りですので確認しましょう。ここでは、
/Smarty/plugins/
とします。
JavaScript外部ファイルを用意する
要件ですので用意します。今回は、
/js/test.js
とします。
プラグインファイルを作成
まだ中身は書きません。ファイルを作るだけにします。今回の要件を技術的な要約をすると「コンパイル直前にテンプレートファイルを置換したい」ですので、プラグイン種別はプリフィルタとします。ですので以下のようにプラグインファイルを作ります。
/Smarty/libs/plugins/prefilter.nekoit.php
ファイル名は英数字とアンダーバーしか使えませんので、neko-itにはできません。残念、、、
プラグインを書く
それではコードを書きましょう。あ、少し補足です。プラグインの有効/無効は別ファイルの定数ANALYTICS_OTHERで設定しています。今回その別ファイルはもちろん定数は用意していません。そもそも意味不明な定数名ですね。しかしそこは華麗にスルーして適当に脳内置換した上で参考にしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?php /* * Smarty plugin * ------------------------------------------------------------- * File: prefilter.nekoit.php * Type: prefilter * Name: nekoit * Purpose: テンプレートファイルの置換 * ------------------------------------------------------------- */ function smarty_prefilter_nekoit($source, $smarty) { if(ANALYTICS_OTHER == 1){ $pattern = '/<\/body>/i'; if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on'){ $protocol_current = 'https'; } else { $protocol_current = 'http'; } $replacement = file_get_contents($protocol_current.'://'.$_SERVER["SERVER_ADDR"] .'/js/test.js'); $replacement = $replacement.'</body>'; return preg_replace($pattern, $replacement, $source); } else{ return $source; } } ?> |
プラグインをいつでも実行させる
プラグインは各プログラム中から任意で呼び出したり、特定の動作で自動で動かしたり、常時動かしたりできます。それぞれのプラグインの制約にも寄りますが、今回は「いつでも実行させる」ということで設定します。
/Smarty/libs/Smarty.class.phpというファイルに記述します。
1 2 3 4 5 6 7 8 |
/** * This indicates which filters are automatically loaded into Smarty. * * @var array array of filter names */ //var $autoload_filters = array(); ← 元からの記述をコメントアウト(何となく) var $autoload_filters = array('pre' => array('nekoit')); |
以上です。これで全てのテンプレートファイル中の</body>タグがJavaScriptコード+</body>として置換されます。
Smartyを使ったそれなりに規模が大きいプロジェクトにおいて全体的な修正をかけたい場合にはプラグインが便利ですね。