PowerCMS Xを利用した大規模サイトのテンプレートを書いていて改めて変数名について考えたのですが、結論としては「変数の内容を端的に表した名前であれば何でも良い」と考えました。ポイントを踏まえつつ何らか接頭辞を付けた分かりやすい名前が良いかなと思います。またルールがプロジェクト内で統一できればなお良しでしょう。
カラム名やCMSがセットする変数名に注意
まず、カラム名と同じ変数名は避けます。冒頭に「何らか接頭辞を付けた分かりやすい名前」と書いた理由はカラム名との一致を避ける意図です。以下のようなテンプレートを書いた場合、mt:entries
の外ではテスト
が、mt:entries
の中では記事オブジェクトのタイトルが表示されます。カラム名と変数名がバッティングしてしまったとしてもCMS本体やプラグインでは$ctx->localize()
・$ctx->restore()
で変数の退避・リストアをしているはずなので、オブジェクトをループするタグ区間の前後で出力が異なる以外に問題は発生しません。
<mt:setvar name="title" value="テスト" />
((<mt:var name="title" />)) → テスト
<mt:entries model="entry">
<li><mt:var name="title" /></li> → 記事オブジェクトのタイトル
</mt:entries>
((<mt:var name="title" />)) → テスト
もう一つは予約変数のCMSがセットする変数です。以下のような名前は避けます。全てを列挙していないので気になるときは<mt:vardump />
で確認しましょう。
- __first__
- __last__
- __even__
- __odd__
- __index__
- __counter__
- __end__
- __total__
- object_count
- offset_last
- next_offset
- prev_offset
- current_* (current_archive_titleなど)
- application_* (application_pathなど)
定数があれば…
変数名を付ける際に悩むことは「既に他所で同じ変数名を使っていないか?」ではないでしょうか。例えばテンプレートの冒頭でincludeしているモジュールテンプレート内で変数を色々セットしているケースです。この変数を色々セットするテンプレートの内容は上書きされたくないことが多い気がしており、「定数(const
)があれば…」と考えました。
定数(const
)のタグは割と簡単に実装できました。$ctx->vars
内にこれから使うキー(=定数名)がなければキーとバリューをセットする仕様により値の上書きを防止します。<mt:setconst />
ファンクションタグとsetconst
モディファイアを実装してみました。(vars
にはないけれどlocal_vars
にはあるケースも検討する必要があるかもしれない)
private function set_const( $ctx, $key, $value ) {
if ( ! array_key_exists( $key, $ctx->vars ) ) {
$ctx->vars[ $key ] = $value;
return '';
}
return "Error: Constant `{$key}` is already defined.";
}
public function hdlr_function_set_const ( $args, $ctx ) {
if ( is_string( $args[ 'name' ] ) ) {
return $this->set_const( $ctx, $args[ 'name' ], $args[ 'value' ] );
}
}
public function hdlr_modifier_set_const( $value, $arg, $ctx, $name ) {
if ( is_string( $arg ) ) {
$this->set_const( $ctx, $arg, $value );
}
}
以下のようなテンプレートを書いたとき、h1要素の内容は記事のタイトル(entrytitle
)になります。
<mt:entrytitle setconst="page_title" />
<mt:entrytext setconst="page_title" />
<h1><mt:var name="page_title" escape /></h1>
その他
値を出力の際にescape
を付けることを基本としており、HTMLを含むコンテンツを変数から出力する場合などは変数名に接尾辞として_html
を付けることをしています。