Oct 22, 2004

サブカテゴリー機能について考えてみた。

「MT 3.1では、エントリの存在するカテゴリーしか再構築しません。」

何というか、実に合理的な仕様のように思えます。ところがサブカテゴリー機能が絡むと実に複雑な状況が発生します。つまり、「あるカテゴリーに属するサブカテゴリにエントリが追加されたとき、再構築されるのはサブカテゴリーのみでその親カテゴリーは再構築されない」のです。

この問題は標準のテンプレートでは顕在化しません。しないと言わないまでも少なくとも顕在化しにくいです。

問題点の説明

ここではこの問題がどのような事態を引き起こすかということをもう少し考えてみたいと思います。

標準のカテゴリーアーカイブでは、MTEntriesというコンテナタグでカレントカテゴリーに属するエントリーのリストアップを行っています。MT 3.1ではこれに加えてMTEntriesWithSubCategoriesというコンテナタグが用意されており、その機能はカレントカテゴリに加えてそのサブカテゴリーに属するエントリーをリストアップするというなかなか便利なものです。このタグと前述の再構築規則を組み合わせると、サブカテゴリーにエントリーが追加され、そのサブカテゴリーのアーカイブの再構築は行われますが、それを包含するはずの親カテゴリーのアーカイブの方には反映されない(再構築されない)ということが起きます。

また、エントリーの存在しないカテゴリーも当然存在し得ます。あるカテゴリーにサブカテゴリーを用意し、サブカテゴリーにのみエントリーを追加したとします。そうすると前述の規則に従って親カテゴリーのアーカイブがそもそも生成されない()という現象が観測されるはずです。

このことは例えば、以下のようにカテゴリーアーカイブごとにカテゴリーナビゲーション機能を付加させたいユーザには不評でしょう。

<div class="content">
 
<h2>Parent Categories</h2>
<ul>
<MTParentCategories exclude_current="1">
<li><a href="<$MTCategoryArchiveLink$>" title="<$MTCategoryDescription$>">
<MTCategoryLabel></a></li>
</MTParentCategories>
</ul>
 
<h2>Sub Categories</h2>
<MTSubCategories>
<MTSubCatIsFirst><ul></MTSubCatIsFirst>
<li><a href="<$MTCategoryArchiveLink$>" title="<$MTCategoryDescription$>">
<MTCategoryLabel></a>
<MTSubCatsRecurse>
</li>
<MTSubCatIsLast></ul></MTSubCatIsLast>
</MTSubCategories>
 
<MTEntries>
<$MTEntryTrackbackData$>
 
...
 
</MTEntries>
</div>

解決方法

まず、こうした瑕疵というか仕様が目立ちにくいようにエントリーの存在しないカテゴリーへのリンクを作らない、MTEntriesWithSubCategoriesを使わない、という後ろ向きの解決方法があります。例えば、上記のParent Categoriesの例だと以下のように修正することで少なくとも存在しないアーカイブへのリンクを避けられます。

<h2>Parent Categories</h2>
<ul>
<MTParentCategories exclude_current="1">
<MTIfNonZero tag="MTCategoryCount">
<li><a href="<$MTCategoryArchiveLink$>" title="<$MTCategoryDescription$>">
<MTCategoryLabel></a></li>
<MTElse>
<li><MTCategoryLabel></li>
</MTElse>
</MTIfNonZero>
</MTParentCategories>
</ul>

もうひとつはカテゴリーアーカイブの再構築時にその親カテゴリーを遡って再構築するようにMT自体を変更するという方法です。あまりテストしていませんが、以下のようにコードを追加すればよいでしょう。

どうも微妙に不具合がある様子なので公開停止。

About Me

My Photo

つくばで働く研究者

Total Pageviews

Amazon

Copyright 2012 Ogawa::Buzz | Powered by Blogger
Design by Web2feel | Blogger Template by NewBloggerThemes.com