導入

導入 --  HTML_Template_Flexy に出来ること

導入

HTML_Template_Flexy は、HTML_Template_Xipe をシンプルにするところから始められました。 しかし、Flexy の長期的な目標は、PHP ネイティブでコンパイルを行うタイプのテンプレートに対する 汎用的な基礎 API を作り上げることにあります。

Flexy は、現在いくつかのバックエンド (テンプレート書式) をサポートしています。 また、より多くをサポートするできるよう拡張性を考慮して設計されています。 キーとなる書式は以下のとおりです。

flexy におけるデータの代入には二種類の方法があります。 どちらを使用するかはあなたの好みによります。

これらの柔軟性に加え、さらに以下のようなことが実現できています。

HTML_Template_Flexy と他のテンプレートシステムとの違い

PHP には様々なテンプレートシステムがありますが、おおよそ 「置換型」もしくは 「PHP コード生成型」のシステムに二分できます。

置換型のテンプレートエンジンには、 たとえば HTML_Template_IT、 FastTemplate、PhpLib テンプレートがあります。 この種のテンプレートは、総体的に、ブロックや入れ子構造において 実行速度が遅く、変数の指定にもコードを多く書く手間がかかりがちです。

PHP コード生成型のテンプレートエンジンには Flexy、Smarty、 SimpleTemplate (HTML_Template_Xipe に改名) などがあります。 これらは、複雑なテンプレートでもうまく扱うことができ、 拡張性にも優れています。 (Flexy の長期的な目標は、これらの PHP コード生成型のテンプレートの サポートをひとつのパッケージで行うという所にあります。)

標準のコンパイルバックエンドは Tokenizer を使用しており、 HTML のタグと属性を使用してループや条件分岐処理を行えます。 また、HTML フォームは動的な XML_Tree 風の要素で管理し、 コード内で操作することができます (この変換は、テンプレートを コンパイルする際に一度だけ行われます)。

使用例

Flexy のテンプレートは、通常、(MVC モデルでいう)コントローラクラスからコールされます。 結果を出力するには、HTML_Template_Flexy に、テンプレートの名前と出力対象のオブジェクトを渡すだけです。 テンプレートで出力に用いられる変数はこのオブジェクトにセットされている必要があります。

例 47-1HTML_Template_Flexy の使用法

<?php

/* アプリケーションの設定 - この処理は別ファイルに分けて記述するのが適当 */
require_once 'HTML/Template/Flexy.php';
require_once 'PEAR.php';
$options = &PEAR::getStaticProperty('HTML_Template_Flexy','options');
$config = parse_ini_file('example.ini',TRUE);
$options = $config['HTML_Template_Flexy'];


/* ページコントローラークラス */

class controller_test 
{

    var $template = "home.html"; // テンプレートの名前
    var $title;                  // {title} の内容
    var $numbers = array();      // {numbers} の内容、foreach を取る
    var $anObject;

    var $elements = array();      // ここに要素を保存していく

    /* セットアップセクション - POST された値や変数を取得する */

    function controller_test() 
    {
        $this->start();
        $this->output();
    }


    function start() 
    {
        // タイトルの設定
        $this->title = "Hello World";

        // オブジェクトを保存
        $this->anObject = new StdClass;

        // メンバーに値を代入
        $this->anObject->member = 'Object Member';

        // フォーム要素が必要な場合は、これをインクルードしなければなりません
        require_once 'HTML/Template/Flexy/Element.php';

        // form 要素用のオブジェクトを生成
        $this->elements['input'] = new HTML_Template_Flexy_Element;

        // 値の代入
        $this->elements['input']->setValue('Hello');


        for ($i = 1;$i< 5;$i++) {
            $this->numbers[$i] = "Number $i";
        }
    }

    /* 出力セクション - この部分は default_controller クラス内に実装すると良い */

    function output() {
        $output = new HTML_Template_Flexy();
        $output->compile($this->template);
        $output->outputObject($this,$this->elements);
    }


    function someMethod() {
        return "<B>Hello From A Method</B>";
    }


}

/* ページコントローラーのインスタンスを生成 - ファクトリーメソッドを適用し、ページコントローラークラスを管理統括するページでの実装が適当  */

new controller_test();

?>

次に、テンプレートの例を示します。

出力は、このようになります。