[Smarty] テンプレートファイル用ディレクトリをカスタマイズする | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

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つこういうクラスを用意しておけば開発が楽になるかもしれません。