2011年6月19日日曜日

PHPの開発を受けたり、お守り(運用)をしたりしているとcakePHP等のMVCモデルまではいかなくとも SmartyのViewだけでもあった方が良いなと思う事が多いです。直接PHPファイルに書いたり preg_replace を使って自前のテンプレートエンジンを使われたりすると、肝のソースコードに到達するまでに余計な時間が掛かります。

デザイン(マークアップ言語)は外に出そうよと強く思います。V(View) が別管理されているだけでも違います。

さて、Smartyの継承です。Smartyは各プロダクトで共通の設定をする方が設定が散逸せずに管理が楽です。

継承して使いたいと考え 先人を探して googleすると下記が引っかかりました。

Smartyの継承クラスを用意する

require_once("Smarty.class.php"); // smarty.class.phpの指定。環境によって異なります。
class xxxxSmarty extends Smarty{ // Smartyクラスを継承したxxxxSmaryクラスを定義します。
public function __construct(){    // __construct()はPH5以上です。
$this->Smarty();
$this->left_delimiter = "{!";    // xoopsと同じにする。(xoopsに慣れてるので)
$this->right_delimiter = "}";
$this->template_dir = "xxxxxxxx/templates";
$this->compile_dir = "xxxxxxxx/templates_c";
}
}

Uncaught exception 'SmartyException' with message 'Please use parent::__construct() to call parent constuctor'

のエラーが出た。parent::__construct() 親のコンストラクタを先頭で呼んで下さい。

色々あったのねという事で 下記に修正しました。(抜粋)

class SpnsSmarty extends Smarty{ 
    public function __construct(){
        parent::__construct();
        //$this->Smarty();
        $this->left_delimiter = "{{";    
        $this->right_delimiter = "}}";

テンプレートの継承も奇麗にヘッダーやフッターを分割出来るので是非機会があれば使ってみて下さい。本家のサイトが詳しいです。

テンプレートの継承