Ta-kaku.jp Tools
Update 2010/02/06
技術メモ内容
トップページ
ハードやソフトの技術メモです。 ほとんど、個人の備忘録のレベルですので高度なことは書かれていません。 皆様に少しでもお役に立てれば幸いです。
MENU
Smarty
サイト更新情報
2008/10/18
「Ta-kaku Tools 住所検索・郵便番号検索・事業所名検索・駅検索・電話局番検索」を Ver2.202 にリビジョンアップしました。
更新内容は以下の通りです。
・「xxx1丁目」の様に「全角の数字」と「丁目」が続いている文字列が入力されると検索できない事がある不具合を改修しました。
2008/10/01
Ta-kaku Tools Whois検索 Ver1.000をリリースしました。
2008/09/30
「Ta-kaku Tools 住所検索・郵便番号検索・駅検索・電話番号(局番)検索 」を Ver2.201 にリビジョンアップしました。
更新内容は以下の通りです。
・電話番号(局番)検索機能を正式版にしました。 ・無効な数値に対して住所の検索を行っていた処理を改善しました。 ・局番0120指定でGoogleMapがおかしな場所を示していた不具合を修正しました。 ・「東京駅駅」のように入力されると、関係の無いデータが出力される不具合を修正しました。
過去の情報
関連キーワード
技術メモ インデックス
カテゴリーを選択してください。
インストール
プログラミング言語
マークアップ言語
データベース言語
スクリプト言語
MS-Office
その他
Webアプリケーション
の開発方法
Smarty 技術メモ
追加日時の新しい方から掲載しています。
Smarty簡易マニュアル
登録日:2008/04/08   分類:Webシステム
以下の内容は、2006年10月にまとめた内容です。
閲覧時では、内容が変更されている可能性がありますのでご注意ください。

プログラマ用
    ここでは、アプリケーション部の開発を行なうプログラマ為のSmartyの扱い方を説明しています。
    内容は、よく使用される(と思われる)もののみ抜粋しています。
    一読頂くと、Smartyで何ができるのかが分かるようになります。

    現在、ご覧になっている当サイトも Smarty を使用しています。

    定数
        Smartyのクラスファイルの場所などを定義する場合に使用されます。

        define("SMARTY_DIR", "/usr/local/lib/php/Smarty/");

    Smartyクラス変数
        サイトの構成要素などを設定する際に使用します。

        $template_dir       ... テンプレートファイルを置くディレクトリ
        $compile_dir        ... コンパイルされたテンプレートが置かれるディレクトリ
        $config_dir         ... 設定ファイルを置くディレクトリ
        $plugins_dir        ... プラグインを置くディレクトリ
        $cache_dir          ... キャッシュが格納されるディレクトリ
        $left_delimiter     ... テンプレート言語の開始を表すデリミタ
        $right_delimiter    ... テンプレート言語の終端を表すデリミタ

        以下は、変数の設定例です。

        <?php
        class MySmarty extends Smarty
        {
            function MySmarty()
            {
                $this->Smarty();

                $mydir = dirname(__FILE__);
                $this->template_dir    = SMARTY_DIR_TEMPLATE;
                $this->compile_dir     = SMARTY_DIR_COMPILE;
                $this->config_dir      = SMARTY_DIR_CONFIG;
                $this->cache_dir       = SMARTY_DIR_CACHE;
                $this->left_delimiter  = '<{';
                $this->right_delimiter = '}>';
            }
        }
        ?>

    Smartyクラスメソッド
        テンプレートに値を割り当てるには

            - 例 -
            PHP側の $php_data の内容をテンプレート側(htmlなど)の temp_data に渡す。

            値渡し
                $smarty->assign("temp_data", $php_data);

            参照渡し
                $smarty->assign_by_ref("temp_data", $php_data);

        テンプレートに割り当てたテンプレート変数を破棄するには

            全て破棄
                $smarty->clear_all_assign();

            指定して破棄
                $smarty->clear_assign("temp_data");

        テンプレートのキャッシュをクリアするには

            全てクリア
                $smarty->clear_all_cache();

            キャッシュファイルを指定してクリア
                $smarty->clear_cache("index.tpl");

        設定ファイルのデータを読み込むには
            $smarty->config_load('sample.conf');

            デザイナ側にも同等の機能があります。

        設定ファイルの変数をクリアするには

            全てクリア
                $smarty->clear_config();

            変数を指定してクリア
                $smarty->clear_config('user');

        テンプレートを表示するには

            要するに、ブラウザに内容を表示する事。

            - 例 -
            ViewクラスでSmartyのインスタンスを生成してassignし、
            テンプレートに渡す。

            $smarty = $this->getSmarty();
            $smarty->assign("temp_data", $php_data);
            $this->display($smarty);

        テンプレートを確保するには

            - 例 -
            ViewクラスでSmartyのインスタンスを生成してassignし、変数に渡す。

            $smarty = $this->getSmarty();
            $smarty->assign("temp_data", $php_data);
            $test = $this->display($smarty);

        コンパイラ関数プラグインを使用するには

            コンパイラ関数プラグインは、テンプレートのみで使用します。
            コンパイルされる時だけコールされます。
            MVCのViewクラスなどでロードする必要はありません。
            用途には、コンテンツを作成した日時などをホームページに埋め込むなどがあります。

            - 例 -
            smarty_compiler_sample()というコンパイラ関数プラグインを用意して、
            テンプレートの表示したい場所でコールします。

            コンパイラ関数プラグイン(呼ばれる側)
                // $tag_arg ... 関数のアーギュメント(C言語のargvのようなものです)
                // $smarty ... Smartyインスタンス
                function smarty_compiler_sample($tag_arg, &$smarty)
                {
                    :
                    : ファイルスタンプのリターンなど
                    :
                }

            テンプレート側
                <{sample}>

        フィルタプラグインを使用するには

            他のプラグインとは異なり、フィルタプラグインはテンプレートでは使用しません。
            MVCのViewクラスなどでロードとコールを行ないます。
            用途には、文字コードの変換や不要文字の削除などがあります。
            全ての出力に対して特定のフィルタを掛けたい場合は、
          アウトプットフィルタを使用してください。
            全てのコンパイルに対して特定のフィルタを掛けたい場合は、
          プリフィルタを使用してください。

            - 例 -
            smarty_prefilter_sample()というフィルタプラグインを用意して、
            テンプレートがコンパイルされる前に実行する。

            フィルタプラグイン側(呼ばれる側)
                // $source ... 処理の対象
                // $smarty ... Smartyインスタンス
                function smarty_prefilter_sample($source, &$smarty)
                {
                    :
                    : 文字コードの変換などの処理
                    :
                }

            MVCのViewクラスなど
                $smarty->load_filter('pre', 'source');

                第1パラメータには

                pre    ... テンプレートがコンパイルされる前に実行。
                post   ... テンプレートがコンパイルされた後に実行。
                output ... display()またはfetch()の前に実行。

                があります。

        ブロック関数プラグインを使用するには

            ブロック関数プラグインは、MVCのViewクラスなどでロードして、
            テンプレートで使用します。
            開始タグと終了タグの2箇所でコールされます。
            用途には、広範囲の文章の清書などがあります。

            - 例 -
            smarty_block_sample()というブロック関数プラグインを用意して、
            テンプレートで実行する。

            ブロック関数プラグイン(呼ばれる側)
                // $params  ... パラメータ(連想配列)
                // $content ... 開始タグ時=NULL, 終了タグ時=コンテンツ
                // $smarty  ... Smartyインスタンス
                // $repeat  ... 開始タグ時=TRUE, 終了タグ時=FALSE
                function smarty_block_sample($params, $content, &$smarty, &$repeat)
                {
                    if ($repeat)
                    {
                        :
                        : ... 開始タグで実行する処理を記述します
                        :
                    }
                    if (!$repeat)
                    {
                        :
                        : ... 終了タグで実行する処理を記述します
                        :

                        $wkPra1 = $params['pra1'];  ... パラメータを使用しています
                        $wkPra2 = $params['pra2'];

                        :
                        :
                    }
                    :
                    :
                    :
                }

            MVCのViewクラスなど
                $smarty->register_block('test', 'sample');

                第1パラメータにはテンプレート側で使用する文字列を指定します。

            テンプレート側

                <{test pra1='100' pra2='200'}>
                    :
                    : ... この間が対象になります
                    :
                <{/test}>

        テンプレート関数プラグインを使用するには
            テンプレート関数プラグインは、MVCのViewクラスなどでロードして、
            テンプレートで使用します。
            用途には、決まったフォーマットでの時間やカレンダー表示などがあります。

            - 例 -
            sample()というテンプレート関数プラグインを用意して、
            テンプレートで実行する。

            テンプレート関数プラグイン(呼ばれる側)
                // $params  ... パラメータ(連想配列)
                // $smarty  ... Smartyインスタンス
                function sample($params, &$smarty)
                {
                    :
                }

            MVCのViewクラスなど
                // test   ... テンプレートで使用する際の名称
                // sample ... テンプレート関数プラグイン名
                $smarty->register_function('test', 'sample');

            テンプレート側
                <{test}>

        変数の修飾子プラグインを使用するには

            変数の修飾子プラグインは、MVCのViewクラスなどでロードして、
            テンプレートで使用します。
            用途には、補足スペースの追加などがあります。

            - 例 -
            sample()という変数の修飾子プラグインを用意して、
            テンプレートで実行する。

            変数の修飾子プラグイン(呼ばれる側)
                // $params  ... パラメータ(連想配列)
                // $smarty  ... Smartyインスタンス
                function sample($params, &$smarty)
                {
                    :
                }

            MVCのViewクラスなど
                // test   ... テンプレートで使用する際の修飾子名称
                // sample ... 変数の修飾子プラグイン名
                $smarty->register_modifier('test', 'sample');

            テンプレート側
                <{abc|test}>

        テンプレート側でPHPのオブジェクトを使用するには

            PHPのオブジェクトは、MVCのViewクラスなどでロードして、
            テンプレートで使用します。
            用途には、条件(プロパティ)によって変わる計算方法(メゾッド)による
            結果の取得などがあります。

            - 例 -
            SampleというPHPのオブジェクトを用意して、テンプレートで使用する。

            PHPのオブジェクト(定義)
                class Sample
                {
                    // $params  ... パラメータ(連想配列)
                    // $smarty  ... Smartyインスタンス
                    function sample_meth($params, &$smarty)
                    {
                        :
                    }
                }

            MVCのViewクラスなど

                // Sampleのインスタンスを生成
                $sample = new Sample;

                // test   ... テンプレートで使用する際の名称
                // sample ... テンプレート関数プラグイン名
                $smarty->register_object('test', $sample);

            テンプレート側
                <{test->sample_meth para='123'}>

        出力時に特定のフィルタを使用する(アウトプットフィルタ)には

            アウトプットフィルタは、MVCのViewクラスなどでロードします。
            テンプレートでは使用しません。
            用途には、メールアドレスの隠蔽や他の文字コードへの変換などがあります。
            特定の変数やオブジェクトなどにフィルタを掛けたい場合は、
          フィルタプラグインを使用してください。

            - 例 -
            sample()というアウトプットフィルタを用意して、テンプレートで使用する。

            アウトプットフィルタ関数(呼ばれる側)
                function sample($pOutput, &$smarty)
                {
                        :
                    return $pOutput;
                }

            MVCのViewクラスなど

                // sample ... アウトプットフィルタ関数名
                $smarty->register_outputfilter('sample');

        ポスト時に文字コードを変換したい場合は(ポストフィルタを使用するには)

            ポストフィルタは、MVCのViewクラスなどでロードします。
            テンプレートでは使用しません。
            用途には、EUCのページからGoogleMapsへUTF-8に変換したポストを行なう場合があります。

            - 例 -
            sample()というポストフィルタを用意して、ロードする。

            ポストフィルタ関数(呼ばれる側)
                function sample($pOutput, &$smarty)
                {
                        :
                    return $pOutput;
                }

            MVCのViewクラスなど

                // sample ... ポストフィルタ関数名
                $smarty->register_postfilter('sample');

        コンパイル時にフィルタを掛けたい場合(プリフィルタを使用するには)

            プリフィルタは、MVCのViewクラスなどでロードします。
            テンプレートでは使用しません。
            用途には、PHPコードの簡略化などがあります。
            特定の変数やオブジェクトなどにコンパイル時にフィルタを掛けたい場合は、
           フィルタプラグインを使用してください。

            - 例 -
            sample()というプリフィルタを用意して、ロードする。

            プリフィルタ関数(呼ばれる側)
                function sample($pOutput, &$smarty)
                {
                        :
                    return $pOutput;
                }

            MVCのViewクラスなど

                // sample ... プリフィルタ関数名
                $smarty->register_prefilter('sample');


        その他、カスタムリソースを(リソースプラグイン)や
        インサートプラグイン等が用意されています。
      今後、更にカスタマイズ可能な機能が追加されてゆく事でしょう。

        続いて、デザイナ用Smartyの説明に入ります。


デザイナ用
    ここでは、テンプレートを扱うデザイナの為のSmartyの扱い方を説明しています。
    内容は、よく使用される(と思われる)もののみ抜粋しています。
    一読頂くと、Smartyで何ができるのかが分かるようになります。

    デリミタ
        デフォルトでは { と }
        これは、CSS や JavaScript の スコープと競合してしまう為、
        私は、{ を <{ に、} を }> に変更して使用しています。
        以下、サンプルは全て、変更後の状態になっています。

    コメント

        <{* この間がコメント *}>

    変数の表示

         PHP側      | Smarty側
        ------------+-----------
         $a         | <{$a}>
         $a['b']    | <{$a.b}>
         $a[$b]     | <{$a.$b}>

        他にもいろいろなパターンで記述できますが、ここでは省略します。

    予約変数

        構文
            <{$smarty.予約変数}>

        よく使う予約変数(その他は省略)
            now   ... 1970/1/1からの経過秒数を参照する -----------+ 例
            const ... PHP定数の値に直接参照する                   |
                                                                  |
    変数の修正子                                                  |
                                                                  |
        構文                                                      |
            <{$a|修正子の名前:修正子のパラメータ}>                |
                                                                  |
            修正子はパイプで連結する事で複数指定が可能です。      |
            <{$a|lower|strip_tags|truncate}>                      |
                                                                  |
        例                                                        |
            <{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}>   <---+

        修正子一覧
            日付や時間の表示を変更するには
                <{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}>

                よく使うdate_formatの変換指定子(その他は省略)

                    %Y ... 西暦(4桁)
                    %m ... "01"から"12"の月
                    %d ... "01"から"31"の日
                    %H ... "00"から"23"の時
                    %M ... "00"から"59"の分
                    %S ... "00"から"59"の秒
                    %n ... 改行文字
                    %t ... タブ文字

            変数内の文字列に他の文字列を連結するには
                <{$a|cat:"test"}>

            変数内の単語の数をカウントするには
                <{$a|count_words}>

            変数内のマークアップタグを取り除くには
                <{$a|strip_tags}>

            変数内の文字列の記号をエスケープするには
                <{$a|escape}> ... html 表記がエスケープされます

            変数内の文字列を大文字に変換するには
                <{$a|upper}>

            変数内の文字列を小文字に変換するには
                <{$a|lower}>

            変数内の改行を<br />タグに変換するには
                <{$a|nl2br}>

            変数内の特定文字列を置き換えるには
                <{$a|replace:"aaa":"bbb"}> ... "aaa" を "bbb" に置き換え

            変数内の数値の表示を変更するには
                <{$a|string_format:"%d"}> ... フォーマット文字列はsprintfと同様

            長い文章を途中で切りたい場合は
                <{$a|truncate:30:"...":true}>

            長い文章を決められた長さで折り返したい場合は
                <{$a|wordwrap:30}>

            文章に段落を付けるには
                <{$a|indent:4}> ... 左に4つ分のスペースを挿入した段落を取る
                <{$a|indent}>   ... <{$a|indent:4}>と同様

            変数内の文字数をカウントするには
                <{$a|count_characters}>      ... スペースをカウントしないパターン
                <{$a|count_characters:true}> ... スペースをカウントするパターン

    組み込み関数 ... 変更ができない標準関数

        分岐を制御するには
            構文
                <{if $a == $b}>
                    分岐1
                <{elseif $c == $d}>
                    分岐2
                <{else}>
                    分岐3
                <{/if}>

            よく使う条件演算子(その他は省略)

                 PHP側      | Smarty側
                ------------+-----------
                 ==         | ==
                 >=         | >=
                 <=         | <=
                 >          | >
                 <          | <
                 !=         | !=
                 !          | !
                 %          | %


        ループ処理を行うには
            <{foreach from=$a item=test}>
                <{if true == $test.first}>
                    ループがスタートしました<br>
                <{/if}>

                <{$test.iteration}>回目のループ<br>
                <{$test->sample1}><br>
                <{$test->sample2}><br>

                <{if true == $test.last}>
                    ループが終了しました<br>
                <{/if}>
            <{/foreach}>
            <{$test.total}>回ループしました<br>

            例の解説
                DBから取得した2つの項目のデータを全てループして表示する。
                $a             ... PHPから渡された変数
                test           ... 現在の要素
                $test->sample1 ... 変数 $a の項目
                $test->sample2 ... 変数 $a の項目

        共通ファイルなどを取り込むには(ファイルをインクルードするには)
            <{include file="sample.php"}>

        出力をブラウザでなく変数に渡すには(キャプチャーするには)
            <{capture name=test}>
                :
                : この間がブロック名 test にキャプチャーされる
                :
            <{/capture}>

            ブロック名 test にキャプチャーした内容を表示するには
                <{$smarty.capture.test}>

        マークアップタグをそのまま表示するには
            <{literal}>
                :
                : この間が対象になります
                :
            <{/literal}>

    変数を使うには
        使用例
            <{assign var="a" value="test"}>
            これは <{$a}> です。

        出力イメージ
            これは test です。

        ここで紹介した assign は、カスタム関数の一種ですが、
        他の関数と使用イメージが異なる為、別記しました。

    カスタム関数 ... 変更ができる標準関数

        デザイナ側は、プログラマ側が準備したPHPの変数($content, $defなど)を使用して
        カスタム関数を定義するだけです。
        使用方法は複数ありますが、推奨する方の例を掲載しています。

        テキストを整形するには
            - 例 -
            左に4つのスペース(インデント)を空けて、40文字毎に改行させる。

            <{textformat indent=4 wrap=40}>
                <{$text}>
            <{/textformat}>

        テーブルを作成するには

            - 例 -
            +-------+-------+-------+
            | test1 | test2 | test3 | <--- このようなテーブルを作成する場合。
            +-------+-------+-------+      各行(tr)は、異なる色で装飾されるものとする。
            | test4 | test5 | test6 |
            +-------+-------+-------+
            | test7 | test8 | test9 |
            +-------+-------+-------+

            <{
                html_table              ... テーブルを作成するカスタム関数
                loop=$content           ... テーブルの内容
                cols=3                  ... 列の数
                tr_attr=$tr             ... trの装飾
            }>

        チェックボックスを作成するには

            - 例 -
            [v]test1 [ ]test2 [ ]test3 <--- このようなチェックボックスを作成する場合。
                                            [v] は選択されている状態を示しています。

            <{
                html_checkboxes     ... チェックボックスを作成するカスタム関数
                name="id"           ... オブジェクト名(デザイナ側で決定)
                options=$content    ... チェックボックスの内容
                selected=$def       ... デフォルトで選択される場所
                separator="<br />"  ... 各チェックボックスアイテムを区分する文字列
            }>

        ドロップダウンリストを作成するには

            - 例 -
            [test2] <--- このようなドロップダウンリストを作成する場合。
             test1       [test2]は選択されている状態を示しています。
             test2       括弧が付いていない test1?test3 がドロップダウンで
             test3       表示される内容です。

            <{
                html_options        ... チェックボックスを作成するカスタム関数
                options=$content    ... ドロップダウンリストの内容
                selected=$def       ... デフォルトで選択される場所
            }>

            補足
                日付けや時間のドロップダウンリストを作成するカスタム関数も用意されています。
                html_select_date html_select_time

        ラジオボタングループを作成するには

            - 例 -
            (v)test1 ( )test2 ( )test3 <--- このようなラジオボタングループを作成する場合。
                                            (v) は選択されている状態を示しています。

            <{
                html_radios             ... ラジオボタングループを作成するカスタム関数
                name="id"               ... オブジェクト名(デザイナ側で決定)
                options=$content        ... ラジオボタングループの内容
                selected=$def           ... デフォルトで選択される場所
                separator="<br />"      ... 各ラジオボタンアイテムを区分する文字列
            }>

        計算結果を出力したい場合は

            - 例 -
            PHP側から渡される $x + $y の結果を小数点2桁の表記で出力させる場合

            <{
                math                    ... 計算するカスタム関数
                equation="x + y"        ... 式
                x=$x y=$y               ... 式内で使用する変数
                format="%.2f"           ... 表示するフォーマット
            }>

        ホームページにメールアドレスを載せたいが、収集されたくない場合は

            - 例 -
            <{
                mailto                  ... メールアドレスをエンコードするカスタム関数
                address="test@test.com" ... 表示したいメールアドレス
                encode="javascript"     ... 最も収集されにくいエンコード
            }>

    設定ファイル
        グローバルなテンプレート変数を管理することができます。

        通常、任意のファイル(拡張子は .conf がよく使われる)に
        全てのグローバルテンプレート変数を記述して、config_load で読み込みます。

        全ページに使用するタイトルやいろいろな場所で使用するDB情報などで使うと有効です。
        ただし、DB情報など重要な情報は、隠蔽する必要があります。
        その場合は、セクション名にピリオドを付けます。
        ピリオド付きの情報は、テンプレートから確認できなくなります。

        sample.conf というファイルにテンプレート変数を定義する場合
        +----------------
        |[.Database]            ... 重要な情報を隠蔽
        |host=test.test.com
        |db=MYDB
        |user=testuser
        |pass=testpass
        |

        MVCのコントロール部などの必ず通る箇所でコールする。
        <{config_load file="sample.conf"}>

        プログラマ側にも同等の機能があります。

参考
    http://smarty.php.net/manual/ja/
PR