Smartyのテンプレート用(templates)ディレクトリは、デフォルトではSmartyを呼び出すプログラムと同一ディレクトリ内に置くことになっており、フレームワークなどを使っていない場合は大抵それはドキュメントルート以下にあることになったりします。
これは、セキュリティ上あまりよろしくないので、それをカスタマイズして任意の位置、任意のディレクトリ名へ保存できるようにしてみます。
テンプレートディレクトリを任意の場所に置くためのカスタマイズ
Smartyクラス変数 を定義したカスタムクラスを作っておけば、Smartyを使うどのPHPプログラムからも共通で呼び出せて便利です。
<?php
require_once 'Smarty.class.php';
class CustomSmarty extends Smarty {
function CustomSmarty() {
$base_dir = "/path/to/tpl_files/";
// テンプレートファイル(*.tpl)を保存するディレクトリ
$this->template_dir = $base_dir . "templates/";
// テンプレートをコンパイルしたファイルを保存するディレクトリ
$this->compile_dir = $base_dir . "templates_c/";
if (!file_exists($this->compile_dir)) {
mkdir($this->compile_dir);
}
// コンパイルしたファイルをキャッシュするか
$this->caching = TRUE;
// キャッシュしたファイルを保存するディレクトリ
$this->cache_dir = $base_dir . "cache/";
if ($this->caching === TRUE && !file_exists($this->cache_dir)) {
mkdir($this->cache_dir);
}
// Smartyのコンフィグファイルを保存するディレクトリ
$this->config_dir = $base_dir . "configs/";
// デバッグモードで動かす
$this->debugging = FALSE;
}
}
呼び出す側では、下記のように書いておきます。
<?php
require_once 'CustomSmarty.class.php';
$smarty = new CustomSmarty();
$smarty->assign('msg', 'Hello');
$smarty->display('index.tpl');
Smartyを呼び出す書式はどのプログラムでも共通で書け、SmartyのデバッグモードのOn/Offやテンプレートのキャッシュファイルの保存ディレクトリなどをまとめて管理できたりします。
これで、下記のように呼び出すプログラム(index.php)とテンプレートファイル(index.tpl)を別々のディレクトリに保存できたりします。
- ディレクトリ構成の例
.
|-- doc_root
| |-- CustomSmarty.class.php
| `-- index.php
`-- non_doc_root
`-- tpl_files
|-- templates
| `-- index.tpl
|-- templates_c
|-- cache
`-- config
アプリごとに異なるテンプレートファイルのディレクトリに保存しておきたい場合は、カスタムクラスをコピーしてbase_dirを書き換えるだけでよいので、1つこういうクラスを用意しておけば開発が楽になるかもしれません。
関連記事
[PHP] 余計なHTMLタグや属性を消してくれるHTML Purifier
PHP_CodeSnifferでコーディング規約に準拠しているかチェックをする
[PHP] Smartyのテンプレートで動的にフラグを置き換える