TopMovable Typeカスタマイズカテゴリー > 2008年2月
2008年2月25日

ブログ記事に同一カテゴリーのブログ記事リストを表示(MT4版・改)

ブログ記事に同一カテゴリーのブログ記事リストを表示(MT4版)」や、これまでの似たようなカスタマイズでは、次の問題あることが判明しました。

1.問題点

異なる親カテゴリーに同名のサブカテゴリーがある場合、対応できない。

具体的には、次のようなカテゴリー構成を想定します。

 cat-A
  ├ cat-1
  └ cat-2
 cat-B
  ├ cat-1
  └ cat-2

この構成で「ブログ記事に同一カテゴリーのブログ記事リストを表示(MT4版)」を行うと、cat-A/cat-1 に属するブログ記事と、cat-B/cat-1 に属するブログ記事は「同一カテゴリーのブログ記事リスト」とみなされてしまいます。

2010.10.31追記:MT5では、MTEntriesタグにcategoryモディファイアを与え、モディファイアの値に親カテゴリーから子カテゴリまでを階層的に指定することで、この問題は解消されます。

2.原因

「同一カテゴリーのブログ記事リスト」のキー情報として、MTEntryCategory という、ブログ記事に属するメインカテゴリー名のみ使っており、カテゴリーの親カテゴリーまで含めた情報やID番号でサーチしていないためです。

こうなった経緯は、そもそも、Movable Type 3 の途中まで「サブカテゴリー」という概念が存在しませんでした。つまり、親カテゴリーしか作れなかったため、同名のカテゴリーの存在が許されず、これまでのサブテンプレートを使えば「同一カテゴリーのブログ記事リスト」を実現できた、という訳です。

3.対処

3.1 EntryCategoryID プラグインを使う

EntryCategoryID プラグイン」を使い、ブログ記事のメインカテゴリーのID番号と、ブログ記事リストのカテゴリーIDを比較し、同一カテゴリーID のブログ記事のみリスティングします。

<mt:setvarblock name="entrycategoryid"><$MTEntryCategoryID$></mt:setvarblock>
<dt class="sidetitle">
Entries of this Category
</dt>
<dd class="side">
  <ul>
  <MTCategories>
  <mt:setvarblock name="currentcategoryid"><$MTEntryCategoryID$></mt:setvarblock>
  <mt:if name="currentcategoryid" eq="$entrycategoryid">
    <MTEntries>
      <li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
    </MTEntries>
  </mt:if>
  </MTCategories>
  </ul>
</dd>

3.2 MTParentCategories タグを使う(その1)

これは後から気がついたのですが、MTParentCategories タグを使い、ブログ記事のメインカテゴリーの親カテゴリーを取得すれば、3.1項と同じことができます。

<MTParentCategories glue="/" setvar="entrycategories"><$MTCategoryLabel$></MTParentCategories>
<dt class="sidetitle">
Entries of this Category
</dt>
<dd class="side">
  <ul>
  <MTCategories>
  <MTParentCategories glue="/" setvar="currententrycategories"><$MTCategoryLabel$></MTParentCategories>
  <mt:if name="currententrycategories" eq="$entrycategories">
    <MTEntries>
      <li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
    </MTEntries>
  </mt:if>
  </MTCategories>
  </ul>
</dd>

MTParentCategories のカテゴリーのセパレータには "/"、また MTSetvarBlock タグの代わりに setvar モディファイアを利用しています。

3.3 MTParentCategories タグを使う(その2)

こちらは、MTEntries タグに category モディファイアを与えて、とりあえず自カテゴリーで絞り込んでから親カテゴリーと比較します。

<mt:setvarblock name="entrycategory"><$MTEntryCategory$></mt:setvarblock>
<MTParentCategories glue="/" setvar="entrycategories"><$MTCategoryLabel$></MTParentCategories>
<dt class="sidetitle">
Entries of this Category
</dt>
<dd class="side">
  <ul>
<MTEntries category="$entrycategory">
  <MTParentCategories glue="/" setvar="currententrycategories"><$MTCategoryLabel$></MTParentCategories>
  <mt:if name="currententrycategories" eq="$entrycategories">
    <li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
  </mt:if>
</MTEntries>
  </ul>
</dd>

2008.02.25
3.3項を追加しました。

2010.10.31
1項に注記を追加しました。

Comments [12] | Trackbacks [0]
2008年2月22日

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

February 22,2008 2:02 AM
Tag:[, , ]
Permalink

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

1.MTIfCategory タグブロック内のサブテンプレートをモジュール化する

カテゴリーアーカイブのデザインを変更する2つめの方法で、MTIfCategory タグブロック内にサブテンプレートをベタ書きするのではなく、MTInclude タグを使います。

カテゴリー1~3

<MTIfCategory name="カテゴリー1">
<$MTInclude module="カテゴリー1"$>
</MTIfCategory>
<MTIfCategory name="カテゴリー2">
<$MTInclude module="カテゴリー2"$>
</MTIfCategory>
<MTIfCategory name="カテゴリー3">
<$MTInclude module="カテゴリー3"$>
</MTIfCategory>

こうすることにより、カテゴリーアーカイブ本体では「どのカテゴリーにどのテンプレートを割り当てるか」という制御に徹することができ、テンプレート全体の見通しがよくなります。

汎用的なデザインを与えたいカテゴリー4~6を新たに追加する場合は、次のようにします。

<MTIfCategory name="カテゴリー1">
<$MTInclude module="カテゴリー1"$>
<MTElse>
  <MTIfCategory name="カテゴリー2">
  <$MTInclude module="カテゴリー2"$>
  <MTElse>
    <MTIfCategory name="カテゴリー3">
    <$MTInclude module="カテゴリー3"$>
    <MTElse>
    <$MTInclude module="カテゴリーその他"$>
    </MTIfCategory>
  </MTIfCategory>
</MTIfCategory>

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

2.MTIfCategory タグを除去して、モジュール化をさらに簡素化する

さて、すでにお気づきの方もいらっしゃると思いますが、最初のリストは、カテゴリーを識別するキーさえ取得できれば、実は以下の1行で済みます。

<$MTInclude module="カテゴリーを識別するキー"$>

「カテゴリーを識別するためのキー」として、次のようにカテゴリー名を使ってみます。カテゴリー名は、MTInclude タグを実行する前に、MTSetVarBlock タグを使って変数に設定し、変数名をmoduleモディファイアに与えれば、ダイナミックにカテゴリー名を設定することができます。

<mt:setvarblock name="category_name"><$MTCategoryLabel$></mt:setvarblock>
<$MTInclude module="$category_name"$>

これで、このアーカイブが「カテゴリー1」の再構築を行うときには変数 category_name には「カテゴリー1」が、「カテゴリー2」の再構築を行うときには変数 category_name には「カテゴリー2」...という具合に設定され、それぞれ「カテゴリー1」「カテゴリー2」...という名前のテンプレートモジュールを呼び出します。

注意するのは、変数category_nameをmoduleモディファイア(というか、nameモディファイア以外)で使う場合は、変数名の前に大抵「$」をつけておく、ということです。

3.MTIf タグを使ってデフォルトデザインの条件分岐をつける

2つめのリストのように、デフォルトのデザインと振り分けたい場合は、さらに MTIf タグと MTCategoryDescription タグで制御します。この方法は SYSTEM STUDIO さんよりアイデア頂きました。ありがとうございました。

<mt:setvarblock name="category_description"><$MTCategoryDescription$></mt:setvarblock>
<mt:if name="category_description">
  <$MTInclude module="$category_description"$>
<mt:else>
  <$MTInclude module="デフォルト"$>
<mt:if>

このリストを使う前準備として、各カテゴリーの「カテゴリーの説明」欄に、呼び出したいモジュール名を設定しておきます。デフォルトデザインのモジュールを呼び出したいときには、「カテゴリーの説明」欄には何も設定しません。

そうすれば、MTIf タグの判定で「カテゴリーの説明」欄に記入されている場合に、「カテゴリーの説明」欄に設定された名前のテンプレートモジュールを呼び出します。「カテゴリーの説明」欄に記入していない場合は、「デフォルト」という名前のテンプレートモジュールを呼び出します。

なお、前回もお伝えしたとおり、「カテゴリーの説明」欄を使うよりも、カスタムフィールドを利用した方が妥当に思われます。


Comments [0] | Trackbacks [0]
2008年2月20日

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

February 20,2008 1:25 AM
Tag:[, , ]
Permalink

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 タグに該当する「カテゴリーの説明」欄に同じ名称を記述しておきます。

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


Comments [4] | Trackbacks [0]
2008年2月19日

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

February 19,2008 2:00 AM
Tag:[, , ]
Permalink

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

1.カテゴリー別にアーカイブテンプレートを独立させる

2009.08.21 注:カテゴリー別にアーカイブテンプレートを独立させる方法ではカテゴリーを適正に制御することができません。カテゴリー別にデザインを切り替えるには、「Movable Type 4 でカテゴリー別にデザインを切り替える方法(その2)」「Movable Type 4 でカテゴリー別にデザインを切り替える方法(その3)」を参照願います。

カテゴリーアーカイブのデザインを変更するために、カテゴリー別に複数のアーカイブテンプレートを作る方法があります。その際、カテゴリーアーカイブテンプレート全体を MTIfCategory タグで括ります。MTIfCategory タグの name モディファイアには、カテゴリー名が重複しないように設定します。

カテゴリー1

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

カテゴリー2

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

カテゴリー3

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

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

  1. カテゴリーアーカイブテンプレートの独立性
  2. カテゴリー別にパスを変更できる
  3. カテゴリー別に異なるパスを設定すると「優先」の制約が発生する

まず、カテゴリーアーカイブテンプレートを独立させ、テンプレートとカテゴリーを1:1の対応にするので、下のように編集対象のカテゴリーが視覚的に分かりやすくなるというメリットがあります。また、テンプレートの内容にもよりますが、この方法であれば、Movable Type 4 の制御系タグをほとんど使わずにすむかもしれません。

アーカイブテンプレート一覧

また、カテゴリー別に異なるパスを与えたい場合、この方法以外に選択の余地はありません。テンプレートタグをパス欄に設定すれば個別に設定することも可能です。

最後の「カテゴリー別に異なるパスを設定すると「優先」の制約が発生する」の意味は、まず、同一アーカイブ種別のテンプレートを複数作成すると、「優先」の問題が発生します。「優先」とは、他のページからあるアーカイブ種別のアーカイブにリンクする場合のリンク先を決めるためのもので、優先にするテンプレートにはチェックをつけます。

アーカイブテンプレート一覧

例えば、カテゴリー1・カテゴリー2・カテゴリー3用のアーカイブテンプレートを、それぞれ別のアーカイブテンプレートで作成した場合、どれかひとつのアーカイブテンプレートが「優先」に、残りが「非優先」になります。

もし、カテゴリー別にパスを変更した場合、メインページなどでカテゴリーリストを、MTTopLevelCategories タグで表示すると、「優先」が設定されたカテゴリーのパスで表示されるので、非優先のカテゴリーアーカイブページはデッドリンクになります。

ただし、全てのカテゴリーアーカイブが同じパスであれば、非優先カテゴリーアーカイブへのリンクも、優先カテゴリーアーカイブで生成されたリンクが利用できます(たまたまそうなるだけであり、手法としては適切ではないかもしれません)。

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

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

まず、head 要素が、独立させたカテゴリーアーカイブにそれぞれ含まれているのであれば、head 要素内にカテゴリー用のスタイルシートを呼び出す link 要素をそのまま記述します。これが一番シンプルな方法です。

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

<MTIfCategory name="cat1">
<mt:setvar name="style" value="[カテゴリー用スタイルシートのファイル名]">
<$MTInclude module="ヘッダー"$>
    :
</MTIfCategory>

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

<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 タグに同じ名称を記述しておきます。

後者の方法は、他のカテゴリー分割方法でも共通に使えます。

2008.02.20
カテゴリーパスの記述を一部修正しました。


Comments [7] | Trackbacks [0]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3