Movable Type 4 でカテゴリー別にデザインを切り替える方法(その2)

Movable Type 4 でカテゴリー別にデザインを切り替える方法(その2)

Posted at February 20,2008 1:25 AM
Tag:[Category, MovableType, Template]

Movable Type 4 でカテゴリー別にデザインを切り替える方法を、何回かに分けて紹介します。

1.ひとつのアーカイブテンプレートでカテゴリーを分割する

カテゴリーアーカイブのデザインを変更する2つめの方法は、アーカイブテンプレートの中で MTIfCategory タグを使います。MTIfCategory タグの name モディファイアには、カテゴリー名が重複しないように設定します。

カテゴリー1~3

<MTIfCategory name="カテゴリー1">
    :
(カテゴリー1用のテンプレート)   
    :
</MTIfCategory>
<MTIfCategory name="カテゴリー2">
    :
(カテゴリー2用のテンプレート)   
    :
</MTIfCategory>
<MTIfCategory name="カテゴリー3">
    :
(カテゴリー3用のテンプレート)   
    :
</MTIfCategory>

この方法には、次のような特徴があります。

  1. カテゴリーの振り分け処理が可能
  2. 基本的にパスは一意に決まる
  3. 優先の制約がない

ひとつのアーカイブテンプレートにまとめる一番のメリットは、あるいくつかのカテゴリーには特殊なデザインを与え、そうでないものについては汎用的なデザインを適用できることです。
「その1」の方法では、アーカイブテンプレートをカテゴリーごとに与えているため、そのような制御ができなくなります。

例えば、冒頭のサブテンプレートに、汎用的なデザインを使いたいカテゴリー4~6を新たに追加する場合、最初に示したサブテンプレートでは、カテゴリー4~6を個別に指定する必要がありますが、次のように変更すれば、一括した指定が可能です。

<MTIfCategory name="カテゴリー1">
    :
(カテゴリー1用のテンプレート)   
    :
<MTElse>
  <MTIfCategory name="カテゴリー2">
     :
 (カテゴリー2用のテンプレート)   
     :
  <MTElse>
    <MTIfCategory name="カテゴリー3">
      :
  (カテゴリー3用のテンプレート)   
      :
    <MTElse>
      :
  (カテゴリー4~6用のテンプレート)   
      :
    </MTIfCategory>
  </MTIfCategory>
</MTIfCategory>

最初の MTIfCategory タグでカテゴリー1であるかの判定をし、そうでなければ MTElse を実行して、次の MTIfCategory タグでカテゴリー2であるかの判定をします。その繰り返しで、最後のカテゴリー判定にマッチしなかったカテゴリーには一番最後の MTElse タグの内容、つまりデフォルトとなるデザインを適用します。

次の設定は誤りです。

<MTIfCategory name="カテゴリー1">
    :
(カテゴリー1用のテンプレート)   
    :
</MTIfCategory>
<MTIfCategory name="カテゴリー2">
    :
(カテゴリー2用のテンプレート)   
    :
</MTIfCategory>
<MTIfCategory name="カテゴリー3">
    :
(カテゴリー3用のテンプレート)   
    :
<MTElse>
    :
(カテゴリー4~6用のテンプレート)   
    :
</MTIfCategory>

理由は、「カテゴリー4~6用のテンプレート」と書かれた部分にはカテゴリー1とカテゴリー2が含まれるからです。

また、この方法では基本的に全てのカテゴリーに共通のパスを与えますが、テンプレートタグを用いることでカテゴリー別に異なるパスを与えることもできます(これについては別の機会に)。またカテゴリー用アーカイブがひとつであるため、「優先」の問題も回避できます。

2.スタイルシートについて

ここでは次の方法が考えられます。

まず、head 要素が、各カテゴリーのサブテンプレートに含まれているのであれば、head 要素内にカテゴリー用のスタイルシートを呼び出す link 要素をそのまま記述します。

すべてのカテゴリーが共通で head 要素をテンプレートモジュールとして呼び出している場合は、MTIfCategory タグブロック内に次のような MTSetVar タグを記述します。

<MTIfCategory name="cat1">
<mt:setvar name="style" value="[カテゴリー1用スタイルシートのファイル名]">
</MTIfCategory>
<MTIfCategory name="cat2">
<mt:setvar name="style" value="[カテゴリー2用スタイルシートのファイル名]">
</MTIfCategory>
<MTIfCategory name="cat3">
<mt:setvar name="style" value="[カテゴリー3用スタイルシートのファイル名]">
</MTIfCategory>
<$MTInclude module="ヘッダー"$>
 
<MTIfCategory name="カテゴリー1">
    :
(カテゴリー1用のテンプレート)   
    :

汎用的なカテゴリー用のスタイルシートを作りたい場合は、次のようにします。

<MTIfCategory name="cat1">
  <mt:setvar name="style" value="[カテゴリー1用スタイルシートのファイル名]">
<MTElse>
  <MTIfCategory name="cat2">
    <mt:setvar name="style" value="[カテゴリー2用スタイルシートのファイル名]">
  <MTElse>
    <MTIfCategory name="cat3">
      <mt:setvar name="style" value="[カテゴリー3用スタイルシートのファイル名]">
    <MTElse>
      <mt:setvar name="style" value="[カテゴリー4~6用スタイルシートのファイル名]">
    </MTIfCategory>
  </MTIfCategory>
</MTIfCategory>
<$MTInclude module="ヘッダー"$>
 
<MTIfCategory name="カテゴリー1">
    :
(カテゴリー1用のテンプレート)   
    :

そして、「ヘッダー」モジュールには次のように記述しておきます。

<mt:if name="category_archive">
<link rel="stylesheet" href="<$MTBlogURL$><$mt:getvar name="style"$>" type="text/css" title="<$MTCategoryLabel encode_html="1"$>" media="screen,tv" />
</mt:if>

または、MTCategoryDescription タグにスタイルシートのファイル名(下のサンプルでは拡張子なし)を設定しておき、「ヘッダー」モジュールだけで呼び出せる方法もあります。

<mt:if name="category_archive">
<link rel="stylesheet" href="<$MTBlogURL$><$MTCategoryDescription$>.css" type="text/css" title="<$MTCategoryLabel encode_html="1"$>" media="screen,tv" />
</mt:if>

異なるカテゴリーで同じデザインを適用したい場合は、MTCategoryDescription タグに該当する「カテゴリーの説明」欄に同じ名称を記述しておきます。

なお、「カテゴリーの説明」よりもカスタムフィールドを使う方が、用途が明確になってよりいいでしょう。


関連記事
トラックバックURL


コメント

こんにちは、昨日に引き続き1つアイデアを。。

見栄えの違うカテゴリを新たに増やしたい時のことも考えて、こんなのはどうでしょうか?

昨日と同じくカテゴリの説明に文字を仕込む方法で説明すると、
カテゴリの説明にモジュール名を仕込んで、
そのモジュール名のテンプレートモジュールをインクルード。
もしカテゴリの説明が空だったら、デフォルトのモジュールをインクルード。
これならテンプレートの分岐は気にせずにカテゴリ増やせます。
ついでに変数使いまわせば、CSSの部分もいけますね。。

昨日コメントした吐き出し先のパスの指定方法と同様
こちらもカスタムフィールドを使った方がスマートですね。

MT4になってプラグインも使わずかなり複雑なこと出来るようになったなぁ。。

<MTSetVarBlock name="cate"><$MTCategoryDescription$></MTSetVarBlock>
<MTIf name="cate">
<$MTInclude module="$cate"$>
<MTElse>
<$MTInclude module="default"$>
</MTElse>
</MTIf>

[1] Posted by Y : February 20, 2008 2:26 PM

>Yさん
こんばんは。
ネタありがとうございます。
ちなみに、MTIf は tag モディファイアが使えるので、MTSetVarBlock を省略して、

<MTIf tag="CategoryDescription">

と書けそうです。
ではでは!

[2] Posted by yujiro logo : February 21, 2008 12:25 AM

> MTIf は tag モディファイアが使えるので・・・
なるほど。。

あっ、でも↓ここで結局使いませんか??

<$MTInclude module="$cate"$>

↑コメントでもこの枠使えるんですね。。
カッコいいから僕のブログでも使おうかなぁ。(いいですか?)

[3] Posted by Y : February 21, 2008 6:25 PM

>Yさん
大変失礼しました!
枠はご自由にお使いください。

[4] Posted by yujiro logo : February 21, 2008 11:22 PM
コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)