【Movable Type】メンテナンス性の高いMTMLを書くための個人的あれそれ
概要
MTML(Movable Type Markup Language)を書くときに気をつけていることをつらつら書いてます。
MTのテンプレートはその性質上どうしてもごちゃつきやすく、MTに慣れていても一見して処理の判断がつきづらいこともあるので、できるかぎり見やすく・わかりやすく・探しやすいことを念頭に置いています(とはいえ、運用していく中でどうしても崩れていってしまうこともありますが…)
少しでも参考になれば幸いです。
MTタグの記述ルールを統一する
たとえば以下のような、書き方が違うけど動作は同じものについて。これらの記述を統一して、すこしでもテンプレートを見やすく、探しやすいものにします。
<!-- 動作が同じブロックタグ -->
<MTxxx>〜</MTxxx>
<mt:xxx>〜</mt:xxx>
<!-- 動作が同じファンクションタグ -->
<MTxxx>
<mt:xxx>
<$mt:xxx$>
<!-- 動作が同じMTSetVarとMTVar -->
<mt:SetVar name="foo" value="bar">
<mt:Var name="foo" value="bar">
上記、筆者はそれぞれ<mt:xxx>〜</mt:xxx>
<$mt:xxx$>
<mt:SetVar>
で統一しています。
<mt:xxx>〜</mt:xxx>
を使用する理由としては、ごちゃつきがちなMTMLにおいて、テンプレートファイル全体を見たときに一見してMTタグ(ブロック)であることが判断しやすいからです(:
(コロン)がついてることでその判断の確実性を上げている)
<$mt:xxx$>
は、一見して単体で使用しているMTタグ(ファンクション)であることが判断しやすいこと、上記ブロックタグの記述と分けるためにこちらを使用しています。
<mt:SetVar>
はその名が示す通り変数を定義していることが一目でわかるので、こちらを使用しています。
なお、ファンクションタグなので<$mt:SetVar$>
という書き方もできますが、変数の定義などはテンプレートの最初に行うことが多いため、例外的に$
なしで使用しています。
変数をセットして使う
変数設定用のMTテンプレートを用意し、MTSetVars
を使用していろいろ設定しています。
テンプレートタグ分岐
MTの各アーカイブテンプレートは、テンプレートごとの分岐ができます。
ただ、この場合複数のアーカイブテンプレートに対して同じ処理をしたい場合、ひとつずつ分岐と内容を書かなくてはならないため、<mt:If name="foo" eq="bar">〜</mt:If>
の形で分岐できるように変数を定義します。
<mt:SetVars>
<mt:If name="main_index">
template_type_custom=main_index
<mt:ElseIf name="archive_index">
template_type_custom=archive_index
<mt:ElseIf name="datebased_archive">
template_type_custom=datebased_archive
<mt:ElseIf name="category_archive">
template_type_custom=category_archive
<mt:ElseIf name="entry_archive">
template_type_custom=entry_archive
<mt:ElseIf name="page_archive">
template_type_custom=page_archive
<mt:ElseIf name="contenttype_archive">
template_type_custom=contenttype_archive
<mt:ElseIf name="contenttype_archive_listing">
template_type_custom=contenttype_archive_listing
<mt:ElseIf name="search_results">
template_type_custom=search_results
</mt:If>
</mt:SetVars>
上記を設定することにより、以下のように複数のアーカイブテンプレートを条件に分岐が可能になります。
<!-- これが -->
<mt:If name="main_index">
Aの処理
<mt:ElseIf name="category_archive">
Aの処理
</mt:If>
<!-- こう書けるようになる -->
<mt:If name="template_type_custom" like=^(main_index|category_archive)$>
Aの処理
</mt:If>
上記のようにすることで、同じ処理をひとつにまとめコードを書く量が減り、テンプレートが見やすくなります。
ブログやカテゴリ、フォルダのIDを変数として定義する
ブログやカテゴリ、フォルダのIDを変数として定義することで、変更の際にテンプレートを修正する必要がなくなります。
<mt:SetVars>
top_newList=1,3,4
blog_subList=3,4
blog_subList_like=^(3|4)$
blogID_parent=1
blogID_news=3
blogID_blog=4
categoryID_info=6
categoryID_release=7
folderID_about=8
contentID_log=10
contentCatID_log=13
</mt:SetVars>
細かく定義しすぎると管理するときに大変になってしまうので、一長一短。
ただ、変数とすることで修正ファイルが1つで済むので、管理は楽になります。
その他変数を定義するもの
よく使用するものは変数に定義しておくと便利(DBへのアクセス回数を減らせる)
<mt:SetVars>
websiteName=<mt:WebsiteName>
websiteURL=<mt:WebsiteURL>
websiteID=<mt:WebsiteID>
</mt:SetVars>
カスタムインデックステンプレートに独自の変数を割り当てる
インデックステンプレートで作成するテンプレートのうち、テンプレートの種類を「カスタムインデックステンプレート」にするものについて、テンプレートに独自の名前をつけて変数に設定することで、main_index
やcategory_archive
と同様にテンプレート分岐できるようになります。
<mt:Ignore>カスタムインデックステンプレートに変数を設定する</mt:Ignore>
<mt:SetVar name="custom_main_index" value="custom_main_index">
上記「テンプレートタグ分岐」の項目のMTMLで以下のように設定します。
<mt:SetVars>
<mt:If name="main_index">
template_type_custom=main_index
(...略...)
<mt:ElseIf name="custom_main_index">
template_type_custom=custom_main_index
</mt:If>
</mt:SetVars>
テンプレートをパーツごとに分割する
ヘッダー・フッター・ナビゲーションメニューなど、ある程度ページで共通化しているパーツは、テンプレートモジュールで分割して組み込みます。たとえば以下のような感じ。
<$mt:Include module="_変数設定"$>
<!DOCTYPE html>
<html lang="ja">
<$mt:Include module="_head"$>
<body>
<div class="wrapper">
<$mt:Include module="_ヘッダー"$>
<main class="main">
<!-- コンテンツ中身 -->
</main>
<$mt:Include module="_フッター"$>
</div><!-- //.wrapper -->
</body>
</html>
モジュール名を日本語にするか半角英数にするかはその時々によるのですが、日本語だとなんとなく探しやすいかなあと個人的には感じています。
適切にインデントを使用する
MTMLに限った話ではないですが、コードに適切にインデントをつけることによって、テンプレートを見やすくします。
<!-- こういうのよりは -->
<mt:TopLevelCategories>
<mt:SubCatIsFirst>
<ul>
</mt:SubCatIsFirst>
<li><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a></li>
<mt:SubCatIsLast>
</ul>
</mt:SubCatIsLast>
</mt:TopLevelCategories>
<!-- こっちの方が見やすく構造関係がわかりやすい -->
<mt:TopLevelCategories>
<mt:SubCatIsFirst>
<ul>
</mt:SubCatIsFirst>
<li><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a></li>
<mt:SubCatIsLast>
</ul>
</mt:SubCatIsLast>
</mt:TopLevelCategories>
筆者はMTMLの見やすさ(のためのインデント処理)を優先しているので、HTMLのインデントはMTML内ではあまり気にしないことが多いです。
カスタムフィールドのテンプレートタグ名を考慮する
カスタムフィールドを作成する際に設定するテンプレートタグについて、そのままだと元から用意されているテンプレートタグと混ざってしまうため、cf_
と接頭語をつけてカスタムフィールドのタグであることが判別しやすいようにしています。
<!-- これだともともとのテンプレートタグと混ざってしまう(下段がカスタムフィールド) -->
<$mt:CategoryLabel$>
<$mt:CategoryNumber$>
<!-- 以下のように`cf_`とつけて判別しやすくする -->
<$mt:CategoryLabel$>
<$mt:cf_CategoryNumber$>
Discussion