Movable Typeを構築するときに気をつけていること

自分がMTを構築するときに気をつけていること（自分の構築の仕方）、自分でもつい忘れがちなのでまとめてみました。（コンセプトが分かればいいので実用するには少し記述が足りなかったり、ところどころ荒削りです）
特に「構造が明確であること」と「直しに強いこと」を強く意識しています。
MT歴はまだ1年ちょっとくらい？
ふんわり優しい突っ込みをお待ちしております！

# 共通変数セットのテンプレートを作り全体管理する


## サイト全体でよく使用するものは、変数にまとめておく
変数を再利用することにより、DBへのアクセス回数をなるべく減らすため。
どのコンテキストでも使用出来るよう意識して変数を定義する。

```html:親ウェブサイト：commonVars（テンプレートモジュール）
<mt:BlogParentWebsite>
  <MTSetVars>
    website_id=<mt:WebsiteID />
    website_url=<mt:WebsiteURL />
    website_name=<mt:WebsiteName />
    ︙
  </MTSetVars>
</mt:BlogParentWebsite>
```

## 予め条件分岐に使用する変数を定義する（サイト構造による）
テンプレートタイプで一度に複数の判別が出来るようになり、コード量が少し減って楽になる。
（アーカイブテンプレートのみであればarchive_classの予約変数を使えるが、それだとインデックステンプレートに対応出来ないので状況に応じて）

```html:親ウェブサイト：commonVars（テンプレートモジュール）
<mt:SetVars>
  <mt:If name="main_index">
      template_type=main_index
  <mt:ElseIf name="archive_index">
      template_type=archive_index
  <mt:ElseIf name="category_monthly_archive">
      template_type=category_monthly_archive
  <mt:ElseIf name="datebased_archive">
      template_type=datebased_archive
  <mt:ElseIf name="category_archive">
      template_type=category_archive
  <mt:ElseIf name="entry_archive">
      template_type=entry_archive
  </mt:If>
</mt:SetVars>
```

これが

```html
<mt:If name="main_index">
  hoge
<mt:ElseIf name="category_archive">
  hoge
</mt:If>
```

↓こうなる

```html
<mt:If name="template_type" like="^(main_index|category_archive)">
  hoge
</mt:If>
```

## ベースは同じでコンテンツのみが違う、というようなパーツは1つの変数にまとめておく
Metaタグ・パンくずリスト等、どのコンテキスト・テンプレートでも`<mt:Var name="insertDescription" />`としておけばOKになり、サイトが肥大化しても管理が容易になる。
ただし、変数定義箇所は条件分岐が複雑になりがち。

```html:親ウェブサイト：commonVars（テンプレートモジュール）
<mt:SetVars>
  <mt:IfWebsite>
    insertDescription=<mt:WebsiteDescription remove_html="1" encode_html="1" />
  </mt:IfWebsite>
  <mt:IfBlog>
    <mt:If name="entry_archive">
      insertDescription=<mt:EntryExcerpt remove_html="1" encode_html="1" />
    <mt:ElseIf name="page_archive">
      insertDescription=<mt:PageExcerpt remove_html="1" encode_html="1" />
    <mt:Else>
      insertDescription=<mt:BlogParentWebsite><mt:WebsiteDescription remove_html="1" encode_html="1" /></mt:BlogParentWebsite>
    </mt:If>
  </mt:IfBlog>
</mt:SetVars>
```

## インクルードするブログやカテゴリセットが決まっている場合は変数に格納
各所でインクルード等していても1箇所で管理していれば、管理・修正が容易になるため。
何か変更があっても、1つの変数を変更するだけでOK。

```html:親ウェブサイト：commonVars（テンプレートモジュール）
<mt:SetVars>
  includeBlogIDs=77,78,80,85
  showCategories=カテゴリ1 OR カテゴリ2
</mt:SetVars>
```

```html:他テンプレート
<mt:Blogs include_blogs="$includeBlogIDs">
  <mt:Entries category="$showCategories">
    ……
  </mt:Entries>
</mt:Blogs>
```

## 直書きルートパス指定は必ずMTタグに書き換え
万が一引っ越し等でディレクトリ構造が変わっても、基本修正無しで大丈夫なため。

```html:親ウェブサイト：commonVars（テンプレートモジュール）
<mt:BlogParentWebsite>
  <MTSetVars>
    website_url=<mt:WebsiteURL />
  </MTSetVars>
</mt:BlogParentWebsite>
```

```html:htmlHeader（テンプレートモジュール）
<link href="<mt:Var name="website_url" />common/css/hoge.css">
<script src="<mt:Var name="website_url" />common/js/fuga.js"></script>
```

# テンプレートの管理に関して

## 共通インクルードモジュールを作成する
変数セット、リダイレクト設定等のPC/SP関わらず共通のテンプレートは、1つのインクルードテンプレートを作成してそこにまとめる。
（無駄にインクルードのネストをさせないため）

```html:親ウェブサイト：commonInclude（テンプレートモジュール）
<mt:Include module="commonVars" />
<mt:Include module="redirectSetting" />
```

## 構造が共通するテンプレートの実体は1箇所（親ウェブサイト）で管理する
親のウェブサイトがあり、複数の子ブログの構造はほぼ同じでデザイン・コンテンツだけ違う、という場合に非常に有効。

**メリット**

* 実体ソースが1つのため、管理がとても楽になる。
* 何が何処にあるか一目瞭然なので、サイト全体が複雑化しにくい

**デメリット**

* 1テンプレートにまとめ過ぎると、場合によっては内容が複雑になる
* 共通パーツはコンテキストをきっちり書き分けないと、再構築でエラーになる

```html:親ウェブサイト：ウェブページ（テンプレートモジュール）
<mt:Include module="commonInclude" />
<mt:Include module="htmlHeader" />
<mt:Include module="header" />

<div class="main">
  <h2><mt:PageTitle  /></h2>
  <div class="content">
    <mt:PageBody />
  </div>
  <!-- /.content -->
</div>
<!-- /.main -->

<mt:Include module="sidebar" />
<mt:Include module="footer" />
```

```html:ブログ1：ウェブページ（アーカイブテンプレート）
<mt:Include module="ウェブページ" parent="1" />
```

```html:ブログ2：ウェブページ（アーカイブテンプレート）
<mt:Include module="ウェブページ" parent="1" />
```

## コンテンツだけが違う横展開ページの場合は、HTML構造とコンテンツを分離する
例えば各支店紹介ページ等の場合は、

```html:page-shopintroduce（テンプレートモジュール）
<h2><mt:PageTitle escape="html" /></h2>
<h3>支店の雰囲気</h3>
<p><mt:Var name="shopintroduce_atmosphere" /></p>
<h3>支店からひとこと</h3>
<p><mt:Var name="shopintroduce_message" /></p>
```

```html:○○支店（ウェブページ想定）
<mt:SetVars>
shopintroduce_atmosphere=アットホームな支店です
shopintroduce_message=ぜひお越しください
</mt:SetVars>

<mt:Include module="page-shopintroduce" />  
```

とすると、支店がいくら増えてもHTML構造の修正が楽。
カスタムフィールドで対応した方がUI的には良いと思うけど、何らかの理由でカスタムフィールドを作りたくないときに効果的。
もう少し柔軟性を持たせたい場合は`<mt:Var />`の部分をpタグで括らず、

```html:page-shopintroduce（テンプレートモジュール）
<h2><mt:PageTitle escape="html" /></h2>
<h3>支店の雰囲気</h3>
<mt:Var name="shopintroduce_atmosphere" />
<h3>支店からひとこと</h3>
<mt:Var name="shopintroduce_message" />
```

```html:○○支店（ウェブページ想定）
<mt:SetVarBlock name="shopintroduce_atmosphere">
  <p>
    アットホームな支店です
  </p>
  <ul>
    <li>何時間居てもOK</li>
    <li>ドリンク飲み放題</li>
  </ul>
</mt:SetVarBlock>

<mt:SetVarBlock name="shopintroduce_atmosphere">
  <p><span>アットホーム</span>な支店です</p>
</mt:SetVarBlock>
```

のような形にする。

# テンプレート内の処理に関して

## 条件分岐はなるべくベースネームで判定する
カテゴリ・フォルダ名よりもベースネームの方が、運用段階で変更になる頻度が低いため。

カテゴリ名：仙台
ベースネーム：sendai

```html:
×
<mt:If tag="categoryLabel" eq="仙台">
    hoge
</mt:If>

○
<mt:If tag="categoryBaseName" eq="sendai">
    hoge
</mt:If>
```

お客さん：「やっぱりカテゴリ名は仙台支店でお願いします」
↓
ベースネームで判定しているため、テンプレートの変更は必要なし

## カスタムフィールドのベースネーム・タグネームには接頭辞を付ける
デフォルトのMTタグとの区別を付けるため。

```html
<mt:cf_product_price />
```

## SPページのパーマリンクを作成する場合
`<mt:EntryPermalink />`は1つ（大抵PC）のパーマリンクしか取得出来ないため、SPページがwww.loremipsum.com/sp/とディレクトリが変わる場合困る。
リダイレクトに頼ることも出来るが、こうするとhref値の時点でSPのパスを指定することが出来る。
ただしSPのPermalinkだけ相対パス指定になるので、PCも含めもうちょっとごにょごにょしてどちらかに統一した方が吉。

```html
<!-- 始めにドキュメントルートのURLを変数に格納する（本来は<$MTWebsiteURL$>で拾った方がベター） -->
<mt:SetVar name="fullPath" value="http://www.loremipsum.com/" />
<!-- 絶対パスでURL:http://www.loremipsum.com/hoge.htmlが生成されるので、ドキュメントルートURLを/sp/に置き換える -->
<a href="<mt:EntryPermalink replace="$fullPath","/sp/" />">
<!-- ↓置換後のパス -->
<a href="/sp/hoge.html">
```