Under the Bridge

a Picture of the Late Him

ノープラグインでカテゴリーソート(MT4.1専用版)多分に反則

2008年2月15日 23:07 | Writer: yoshi | 記事本文 | コメント(2) | トラックバック(0)

ノープラグインでカテゴリーソート(MT4.1専用版)多分に反則 - WolaWola

WolaWolaの中の人であるoscarさんに、わたしが以前書いた「MT4.1:カテゴリの並べ替え(カスタムフィールド+ハッシュ変数)」という記事の紹介をいただきました。

実はoscarさんはあのMP4LP5イベントの連動書籍ともなる『Movable Typeプロフェッショナル・スタイル』の執筆者のお一人でして、わたしごときアル中で近眼で寝不足な男が対等に話をするのも恐れ多いのですが...アワワ

紹介記事の中で、「続き書かない?」というリクエストをいただいたので、少し乗ってみます。

ノープラグインでカテゴリーソート(MT4.1専用版)多分に反則

これなのですが、カスタムフィールドとハッシュを使用した、ノープラグインでのカテゴリ並べ替えのテクニックを、さらにサブカテゴリ対応にまで拡張させたサンプルなのですが、結構いいアイデアが適用されています。まずは、ソース。

oscar氏による改造コード

<MTIfArchiveTypeEnabled archive_type="Category">
<div class="widget-archive widget-archive-category widget">
<h3 class="widget-header">カテゴリ</h3>
<div class="widget-content">
<$MTSetVar name="nestlevel" value="0"$>
<MTTopLevelCategories>
<$MTCategorySortOrder setvar="catsort"$>
<MTSubCatIsFirst><$MTSetVar name="nestlevel" op="++"$></MTSubCatIsFirst>
<MTSetVarBlock name="catlevel[$catsort]"><$MTVar name="nestlevel"$></MTSetVarBlock>
<MTSetVarBlock name="catlinkset" index="$catsort"><MTIfNonZero tag="CategoryCount">
<a href="<$MTCategoryArchiveLink$>"<MTIfNonEmpty tag="CategoryDescription"> title="<$MTCategoryDescription$>"</MTIfNonEmpty>><$MTCategoryLabel$> (<$MTCategoryCount$>)</a><MTElse><$MTCategoryLabel$></MTIfNonZero>
</MTSetVarBlock>
<MTSetHashVar name="loopcategory"><$MTSetVar name="$catsort" value="$catlinkset[$catsort]"></MTSetHashVar>
<$MTSubCatsRecurse$>
<MTSubCatIsLast><$MTSetVar name="nestlevel" op="--"$></MTSubCatIsLast>
</MTTopLevelCategories>
<ul class="widget-list"><li class="widget-list-item">
<$MTSetVar name="prev_catlevel" value="1"$>
<MTLoop name="loopcategory" sort_by="key">
<MTSetVarBlock name="mvlevel"><$MTVar name="catlevel[$__key__]"$></MTSetVarBlock><$MTSetVar name="mvlevel" value="$prev_catlevel" op="-"$><MTIf name="prev_catlevel" ne="-1"><MTIf name="mvlevel" gt="0"><ul class="widget-list"><li class="widget-list-item"><MTElseIf name="mvlevel" lt="0"></li></ul></li>
<li class="widget-list-item"><MTElseIf name="mvlevel" eq="0"></li>
<li class="widget-list-item"></MTIf></MTIf><$MTVar name="catlinkset[$__key__]"$><MTSetVarBlock name="prev_catlevel"><$MTVar name="catlevel[$__key__]"$></MTSetVarBlock>
</MTLoop>
<MTIf name="prev_catlevel" gt="1"></li></ul></MTIf>
</li></ul>
</div>
</div>
</MTIfArchiveTypeEnabled>

発見した点とか

まず、カテゴリリストを扱うブロックがMTTopLevelCategoriesブロックタグに変更され、再帰的にサブカテゴリを取得するように拡張されています。MTSubCatIsFirstでネストのレベルをインクリメント、MTSubCatIsLastでネストのレベルをデクリメントされています。なるほど!これはカッコええデス。

MTTopLevelCategoriesブロックタグでリストをハッシュで生成し、のちにMTLoopでリンクまで含んだカテゴリリストのコードを吐き出させています。このサンプルでは子カテゴリまでの対応です。

私が最初に作ったサンプルでは、カスタムフィールドの「ソートオーダー」の値をもし入れ間違って、同じ数値であったり、デフォルトの「0000」であったりするとデータが上書きされるという難点がありましたが、これもそのままです。しかしこれは変に凝らずにそのような仕様としてしまうのがいいと思います。時間は有限だし...

今後の課題など

「孫カテゴリ、ひ孫カテゴリまで表示できるようにする」これでしょう。実は少しやってみました。しかし、MTのテンプレートタグでは「これがやりたかったんだよな」ということができない場合があり、時間もないので断念してしまいました。

ハッシュのキーにデータが複数持てればそれでできそうな気もするんです。それと関数再帰コールのようなことがやりたいのですが(階層はプログラミング完了時にはどこまであるかがわからないため、フォルダ関係のプログラムでは再帰処理を使用する)、一体どうすればいいのかがわからない。MTSetVarTemplate使えばいいんだろうか?

目線を変えて、MTTopLevelCategoriesブロックのループ中に、文字列変数へappend="1"モデファイアでデータを作ってしまうか!とも考えましたが、そもそもMTTopLevelCategoriesなどでどう並びが変わってしまうのかが予測できないので、それもボツっぽい。

あと、カスタムフィールドが使用できないMTOS(ですよね?)向きに、他のタイプのコードを考えねばいけないと思っています。なので、この手法は、サブ・サブサブカテゴリ完全対応にまで昇華させるのか、あるいはフラットなカテゴリまで限定にしておき、他の手法を考えるかどうかの分岐点にいます。

忙しく記事を書いている途中にこのエントリ書きました...中途半端で、しかもとっ散らかった内容ですみません。

トラックバック(0)

このブログ記事を参照しているブログ一覧: ノープラグインでカテゴリーソート(MT4.1専用版)多分に反則

このブログ記事に対するトラックバックURL:

コメント(2)

oscar (2008年2月16日 20:00)

こんにちは、yoshiさん。

>MTのテンプレートタグでは「これがやりたかったんだよな」ということができない場合があり、時間もないので断念してしまいました。

やっぱり、これに尽きますね。

ちなみにこのコードで孫以下に対応するには、
<MTElseIf name="mvlevel" lt="0">の中で、$mvlevelがゼロになるまでループして、「</li></ul>」を書きだして行けば良いんじゃないかと思う。
実は$mvlevelって1以上にはならないんだよねぇ。だからマイナスの時だけうまく処理出来れば、いけると思ってます。

yoshi (2008年2月16日 21:31)

oscarさんこんにちは
時間を幾らかけてもいいのであればできそうなんですけどね...

>「」を書きだして行けば良いんじゃないかと思う。
そうですね、結局、階層を表現するのがul、liならば、ネストごとにそれを付け足すということは私も考えました。私が考えていたのは、MTSetVarTemplateタグを用いた再帰処理でそれを実現する、という案ですが。
これは時間ができたらやってみようと思っています。

また、私は、カスタムフィールドさえ使わずに同じことが実現できると、カナリ素敵と思います。

コメントする






Categories
Entries
Feed
スポンサードリンク

parts

フィードメーター - Under the Bridge

あわせて読みたい

なかのひと

2008年4月5日開催、MT4LP5

2008 yoshi(apstar)