PowerCMS Xでは、これまでの PowerCMSと同様にプラグインによってテンプレート・タグを追加することができます。追加できるタグの種類は以下の4種類です。各タグについては、テンプレート・タグの基本 のページを参照してください。また、プラグインの作成方法については、プラグイン作成の基礎のページを参照してください。
サンプル・プラグインには、条件タグ「ifmyfirstplugin」、ファンクションタグ「myfirstpluginfunction」の実装サンプルが含まれています。
"tags": {
"function": {
"タグ名" : {
"component" : "クラス名",
"method" : "クラスのメソッド名"
}
},
"conditional": {
"タグ名" : {
"component" : "クラス名",
"method" : "クラスのメソッド名"
}
},
"block": {
"タグ名" : {
"component" : "クラス名",
"method" : "クラスのメソッド名"
}
},
"modifier": {
"タグ名" : {
"component" : "クラス名",
"method" : "クラスのメソッド名"
}
},
},
カスタム・テンプレートタグは、PowerCMS Xのために開発されたテンプレートエンジン「PAML」のプラグインとして登録します。
変数に値をセットします。
変数の格納場所です。
ブロックタグが1回もループせずに終了する時、このメソッドを呼び出します(最初のループもスキップされます)。
テンプレートをビルドし、出力するか結果を返します。
ファイルからではなく、テンプレートのソースからビルドします。
テンプレートのソースからビルドした値を返します。コンパイル結果をキャッシュしません。
ブロックタグ内で、カウンタ値とループ対象の配列変数またはオブジェクトから予約変数に値をまとめてセットします ( '__index__', '__counter__', '__odd__','__even__', '__first__', '__last__', '__total__' )。
変数のスコープをローカライズします。
ブロックの初回 ( $counter == 0 )で localize をコールし、ブロックの最後で restore をコールしてください。 引数には、対象の変数名を配列で指定します。 配列の中に配列で指定されたものは $ctx->__stash[ 'vars' ][ $value ] が対象となり、文字列を指定した場合は $ctx->stash( $value ) が対象となります。
$local_vars[ $key ] と $vars[ $key ] のいずれかに値が存在する時に、その値を受け取ります。
グローバル・テンプレート変数。
$__stash['vars'] は $varsの別名。
ブロックスコープ内のローカル変数。
ブロックスコープで主にループ処理に使われる変数やオブジェクト。
プロパティ $local_vars と $local_params は常にローカル変数となります。 ブロックを抜ける時には、これらは自動的にブロックの直前の状態に戻されます。
ファンクションタグは、次のように記述されるタイプのタグです。
<mt:functiontagname attr="value">
ファンクションタグのコードは、以下のように書きます。メソッドの戻り値がタグの部分と置き換えられます(例: <mt:var>)。または、何も出力せずに単に他のタスクを実行する事ができます(例: <mt:setvar>)。
function hdlr_function_tagname ( $args, $ctx ) {
// return 'Something';
}
クラスPAMLから、PowerCMS Xのアプリケーション・クラス $app にアクセスするには、プロパティ「app」を呼び出します($ctx->app)。データベースアクセスを担うORマッパクラス「PADO」へアクセスするには、$ctx->app->db を呼び出します。
条件タグは、次のように記述されるタイプのタグです。
<mt:ifconditionaltagname name="name"> ... </mt:ifconditionaltagname>
条件タグ内では、<mt:else> と <mt:elseif> が利用可能です。 条件タグは true(出力) か false(出力しない) のいずれかを返します。
function hdlr_conditional_tagname ( $args, $content, $ctx, $repeat, $context ) {
// return true; // or false;
}
新たに条件タグを作成する際は、true、false を返すかわりに $ctx->conditional_if を返すことによって eq、ne、likeなどのタグ属性を利用できるようになります。
ブロックタグは、次のように記述されるタイプのタグです。第4引数「$repeat」が「true」の間、繰り返し実行されます。
<mt:blocktagname name="name"> ... </mt:blocktagname>
ブロックタグでは、出力される $content を戻り値に指定します。
※1 $content にはテンプレートの出力結果がセットされます。 $content は最初のループでは null、2回目以降のループではテンプレートブロックのコンテンツがセットされています。
※2 $repeat は最初のループでは true、2回目以降のループでは falseがセットされています。 タグの中で $repeat を true にセットすると、 <mt:blocktagname> ... </mt:blocktagname> ブロック内は繰り返しビルドされ、$content パラメータに新しいブロックコンテンツが格納された状態で再び呼び出されます。
最もシンプルなブロックタグの実装例(1度だけブロックがビルドされます)。
function some_block_tag ( $args, $content, $ctx, &$repeat, $counter ) {
return ( $counter ) ? $content : null;
}
配列の回数だけループするシンプルなブロックタグの実装は下記の通りです。
function hdlr_blocktag_name ( $args, $content, $ctx, &$repeat, $counter ) {
// $app = $ctx->app;
$local_vars = ['local_var1', 'local_var2', 'local_var3'];
if (! $counter ) {
$loop_params = ['var1', 'var2', 'var3'];
if ( empty( $loop_params ) ) {
$repeat = $ctx->false(); // ループをスキップする時
return;
}
$ctx->localize( $local_vars ); // 変数のローカライズ
$ctx->local_params = $loop_params;
}
$params = $ctx->local_params;
$ctx->set_loop_vars( $counter, $params ); // 予約変数をセット
if ( isset( $params[ $counter ] ) ) {
$param = $params[ $counter ];
$ctx->local_vars['__value__'] = $param; // ローカル変数 __value__ に値をセット
$repeat = true;
} else {
$ctx->restore( $local_vars ); // 変数のリストア
$repeat = false;
}
return $content;
}
モディファイアは、テンプレートの変数が表示される前または他のコンテンツに使用される前に適用される関数です。 モディファイアは複数指定できますが、同じモディファイアを一つのテンプレート・タグに指定することはできません。
function filter_modifier_name ( $str, $arg, $ctx, $name ) {
// return "Processed {$str}.";
}