●カテゴリを任意の順に並び替える

一般的な方法としては、カテゴリの頭に数字をつける方法がある。でもそれはスマートじゃない。表示部以外にもディレクトリ名から何からあちこち手直しが必要になるからだ。カテゴリ並べ替え、という局所だけに働けばいいわけで、作業の数からいって手直しを加えるならここだろう。他にやり方があるはず、と探した。

looselife.net - MTSubCategories を使ってカテゴリーを好きな順番に並べる

package CatSort;
my %category_priorities = (
'Entertainment' => 200,
'Movie' => 150,
'Miscellany' => 900,
'Foods' => 300,
'Music' => 120,
'Sports' => 140,
'Internet' => 100
);
sub cat_sort ($$) {
my ($a, $b) = @_;
my $a_pri = $category_priorities{$a->label} || 1000;
my $b_pri = $category_priorities{$b->label} || 1000;
unless ($a_pri == 1000 && $b_pri == 1000) {
return $a_pri <=> $b_pri;
}
return $a->label cmp $b->label;
}

ソートしたい順番に小さい順に数字を対応させていきます。作ったファイルは extlib/CatSort.pm に保存。あとはソートしたいカテゴリーリストのコンテナタグに <MTSubCategories sort_method="CatSort::cat_sort"> と sort_method アトリビュートを加えるだけ。

とのことだが実行してみるとエラーが出てしまう。perl全然わからないんで *1 困って2ちゃんねるで質問してみた。すると、

MT質問スレ Ping 6
281 278 2006/03/15(水) 01:46:31 ID:E37eFszX
ほい。これで OK のはず。

sub cat_sort ($$) {
my ($a, $b) = @_;
my $a_pri = $category_priorities{$a->label} || 1000;
my $b_pri = $category_priorities{$b->label} || 1000;
unless ($a_pri == 1000 && $b_pri == 1000) {
return $a_pri <=> $b_pri;
}
return $a_pri <=> $b_pri;
}

最後の return で返す値が間違えてたみたい。

動いた。思い通りに並べ変わった。
すげえ。親切な人すげえ。

今現在うちで動いているのはこれ。もちろんMTSubCategoriesでもMTTopLevelCategories *2 でも動くよ。

package CatSort;
my %category_priorities = (
'information' => 100,
'investment' => 200,
'web' => 300,
'link' => 400,
'deposit' => 210,
'stocks' => 220,
'bond' => 230,
'exchange' => 240,
'movabletype' => 310,
'portfolio' => 250
);
sub cat_sort ($$) {
my ($a, $b) = @_;
my $a_pri = $category_priorities{$a->label} || 1000;
my $b_pri = $category_priorities{$b->label} || 1000;
unless ($a_pri == 1000 && $b_pri == 1000) {
return $a_pri <=> $b_pri;
}
return $a_pri <=> $b_pri;
}

*1 : こういう言い方をすると他は分かるみたいだが、他も全然わかってない。全部コピペと見よう見まねなり。
*2 : <MTTopLevelCategories sort_method="CatSort::cat_sort">

■追記(2006.03.17)

SubCategories - David Raynes Plugin Wiki
# Both are the default value (1000)
# so sort alphabetically
return $a->label cmp $b->label;

wiki上の記述 *3 を発見した。
設定忘れで数字未設定のカテゴリがいくつも出てきた時に、今の処理で大丈夫なんだろうか。perl読めないからわからないけどコメントアウトの中身読む限りなんか大丈夫じゃないような気がする。
アスキーコードの比較を忘れちゃっていいのかなあ。でも、どう書いていいものかまったくわからない。上のコードでは一応きちんと動いているし、まあいっか。


*3 : MT本体に組み込まれる前、プラグイン時代のwikiらしい。