mtde.info

Movable Type Developers Express

変数への適切な代入場所

2008年4月11日 00:07 | Writer: apstar | 記事本文

変数を使用するには、MTSetVarやMTSetVarBlockなどのテンプレートタグを用いて「変数への値の代入」を行います。

この代入をどこに記述するのかは、ケースバイケースです。

ケース1:テンプレート先頭付近

プログラムで変数を使用する場合は、一般的に「変数の宣言はコード先頭付近に置くほうが見通しが良い」とされます。Movable Typeにおいては、テンプレートの制御に使用する変数はこのケースに当てはまります。

以下はデフォルトテンプレートの、インデックステンプレート>メインページのテンプレートです。先頭行から5行が、テンプレート制御などに使用される変数の代入コードです。


<MTSetVar name="body_class" value="mt-main-index">
<MTSetVar name="main_template" value="1">
<MTSetVar name="main_index" value="1">
<MTSetVar name="sidebar" value="1">
<MTSetVarBlock name="title"><$MTBlogName encode_html="1"$></MTSetVarBlock>


<$MTInclude module="<__trans phrase="Header">"$>

<MTEntries>
    <$MTEntryTrackbackData$>
    <$MTInclude module="<__trans phrase="Entry Summary">"$>
</MTEntries>

<div class="content-nav">
    <a href="<$MTLink template="archive_index"$>"><__trans phrase="Archives"></a>
</div>

<$MTInclude module="<__trans phrase="Footer">"$>

ここで宣言している変数は(「わたし」というのはテンプレート自身)、

ということをインクルードされるモジュールへ知らせるような役目を持っています。

例えば、フッターモジュールで

<MTIf name="sidebar">
    <$MTInclude module="サイドバー"$>
</MTIf>

というコードがある場合、これはメインページには「わたしはsidebarに1をセットしています。」という記述があるので、メインページにはサイドバーがインクルードされるのです。もし、sidebar変数へ0が代入されていれば、サイドバーはインクルードされません。

このような記述は、デフォルトテンプレートでは以下の8つのテンプレートモジュールで行われています。「(1)(2)(3)テンプレートファイル」は、再構築されると一枚のXHTMLページになります。

(1)インデックステンプレート
  • main_index.mtml(メインページ)
  • archive_index.mtml(アーカイブインデックス)
(2)アーカイブテンプレート
  • entry.mtml(ブログ記事)
  • entry_listing.mtml(ブログ記事リスト)
  • page.mtml(ウェブページ)
(3)システムテンプレート
  • search_results.mtml(検索結果)
  • comment_response.mtml(コメント完了)
  • comment_preview.mtml(コメントプレビュー)

これらの変数は、インクルードするモジュール内で同じ変数名へ値をうっかり代入して上書きしないようにしましょう。

ケース2:使用直前

Movable Type 4.xのテンプレートでは細かいモジュール化が進んでおり、管理ページでの各モジュール間の移動に時間がかかります。変数を多用してカスタマイズを行っている場合、変数代入部分をいちいち一箇所へまとめたり、テンプレート先頭付近へまとめて記述すると、かえって効率が落ちる場合があります。

Movable Typeのテンプレート内で、変数を使用する場合のほぼ大多数を占めると思われるこのケースでは、使用直前に代入を行い、適切なコメントを記述しておくとわかりやすく、保守もやりやすいです。

例えば以下のコードでは、狙ったカテゴリのみを抽出してリスト化するコードですが、変数は使用直前に値の代入を行っています。

keyword変数はMTCategoriesブロックの外側で値を代入します。これは、ブロック内へ記述すると、カテゴリの個数回ループにてkeyword変数への無駄な代入が繰り返されるためです。

対してCurCat変数は、MTCategoriesブロックの内側で値を代入します。こうすると、MTCategoriesループでカテゴリ名が次々に切り替わり代入されます。

<MTSetVar name="keyword" value="カテゴリ1,カテゴリ3,カテゴリ5">
<ul>
<MTCategories>
   <MTSetVarBlock name="CurCat"><MTCategoryLabel></MTSetVarBlock>
   <MTIf name="keyword" like="$CurCat">
      <li><a href="<$MTCategoryArchiveLink$>"<MTIfNonEmpty tag="MTCategoryDescription"> title="<$MTCategoryDescription$>"</MTIfNonEmpty>><$MTCategoryLabel$> (<$MTCategoryCount$>)</a></li>
   </MTIf>
</MTCategories>
</ul>

上記コードに、MTIgnoreテンプレートタグでコメントを付与してみた例です。MTIgnoreテンプレートタグで括られた部分は、再構築時にはカットされますのでhtmlソースには出力されません。

なお、MTIgnoreでのコメント付与は必須ではありません。時間が経ったあとで、このコードを見て、何をやっているか解読する自信がない方は、つけておいたほうが良いかもしれません。

<MTIgnore> ***** 表示するカテゴリの一覧をカンマ区切りでkeyword変数へ代入 ***** </MTIgnore>
<MTSetVar name="keyword" value="カテゴリ1,カテゴリ3,カテゴリ5">
<ul>
<MTCategories>
   <MTIgnore> ***** CurCat変数=ループ中のカテゴリラベル ***** </MTIgnore>
   <MTSetVarBlock name="CurCat"><MTCategoryLabel></MTSetVarBlock>
   <MTIgnore> ***** keyword変数内にCurCat変数が含まれるかチェック ***** </MTIgnore>
   <MTIf name="keyword" like="$CurCat">
      <li><a href="<$MTCategoryArchiveLink$>"<MTIfNonEmpty tag="MTCategoryDescription"> title="<$MTCategoryDescription$>"</MTIfNonEmpty>><$MTCategoryLabel$> (<$MTCategoryCount$>)</a></li>
   </MTIf>
</MTCategories>
</ul>

変数

2008 mtde.info