2024年3月28日(木) 22:17 JST

テンプレート変数インジェクション

  • 2009年1月18日(日) 10:08 JST
  • 投稿者:
  • 表示回数 5,041
Geeklog

Geeklog.jpの掲示板のこのスレッドから始まったmore_article_linksカスタム関数だが、実装している最中に考えたことを参考までに記す。

  1. header.thtmlの場合は、CUSTOM_templateSetVars() でテンプレート変数をセットする。
  2. header.thtml以外のテンプレートでは、CUSTOM_templateSetVars()がコールバックされないので、表示内容をレンダリングしているスクリプトにテンプレート変数をセットするコードを追加する。

上記のどちらかの処理を行ってから、該当するテンプレートファイルにテンプレート変数をセットするプレースホルダ{var_name}を追加する、という手段をとる。2. の場合にWikiに紹介されていた方法を取ると、複数の $template->set_var('foo', 'bar'); を追加することになり、美しくない。それより CUSTOM_templateSetVars() の手法をまねて、Templateクラスのインスタンスへのリファレンスを引数にしてカスタム関数に渡し、カスタム関数内で必要なテンプレート変数をセットするようにすれば、レンダリングを担当しているスクリプトに追加するのは1行で済む。article.phpの例を示すと、


        $story_template->set_var('story_id', $story->getSid());
        $story_template->set_var('story_title', $pagetitle);
        CUSTOM_more_article_links($story_template, $story->getSid());
        $story_options = array ();

現在の記事の前後の記事へのリンクを追加するには記事IDが必要になるので、CUSTOM_more_article_links()関数の第2引数に持たせている。この関数の宣言は次の通り:


function CUSTOM_more_article_links(&$template, $sid) {

クラスインスタンスを参照渡しにするために、第1引数の前に & をつけている。PHP5の場合、クラスインスタンスは自動的に参照渡しになるはずだが、PHP4の環境もまだ残っているので、安全性重視。

上記の方法でテンプレート変数を追加すれば、本体スクリプトの修正が最小限で済むので、標準になればよいのにと思う。