AnotherCustomFieldsプラグインをダイナミック対応にする(その3)

昨日までの話で、config.yamlファイルから個々のフィールドに対応するテンプレートタグ名を得ることができました。
最後に、テンプレートタグに対応する処理を動的に追加する処理を行います。

1.ファンクションタグの追加

DynamicMTMLで動的にファンクションタグを追加するには、「$app->ctx->add_tag」というメンバ関数を使います。

$app->ctx->add_tag(テンプレートタグ名, 関数名);

「テンプレートタグ名」には、先頭の「MT」を除いた値を指定します。
また、「関数名」には、テンプレートタグの処理を行う関数の名前を指定します。
関数の書き方は、他のファンクションタグの書き方と同様で、Smartyのファンクションタグの書き方に従います。
書き方は以下のようになります。

function 関数名($args, &$ctx) {
    関数の処理
}

$ctxはSmartyのオブジェクトです。
また、$argsはモディファイアの名前/値が対になった連想配列です。

2.ブロックタグの追加

DynamicMTMLで動的にブロックタグを追加するには、「$app->ctx->add_container_tag」というメンバ関数を使います。
「テンプレートタグ名」と「関数名」の意味は、ファンクションタグと同じです。

$app->ctx->add_container_tag(テンプレートタグ名, 関数名);

また、タグの処理を行う関数の書き方は、他のブロックタグの関数と同様で、Smartyのブロックタグの書き方に従います。
書き方は以下のようになります。

function 関数名($args, $content, &$ctx, &$repeat) {
    関数の処理
}

$argsと$ctxの意味は、ファンクションタグの場合と同じです。
$repeatは、ブロック内を繰り返すかどうかを表すフラグです。
繰り返すなら1、繰り返さないなら0を代入します。
また、$contentは、ブロック内の構築結果を表します。