Movable Type 備忘録

 Movable Type 5 で sort_method が使えない?!

  • Jan192010
  • Vote:
    http://bizcaz.com/archives/2010/01/19-231116.php
  • Categories: MovableType
  • Tags: ,
  • Social Bookmark

こんばんわ^^

MT5.x にしてから数週間経ちますが、やっぱり sort_method が正しく動作してませんぶー2
sort_method とは MTTopLevelCategories や MTSubCategories で任意の順番にカテゴリを並べ替えることができるモディファイアです。

sort_method の使い方

具体的には以下のように使います笑1

sort_method によるカテゴリの並び替え

  1. <mt:TopLevelCategories sort_method="CategorySort::cat_sort">
  2.     <mt:SubCatIsFirst><ul></mt:SubCatIsFirst>
  3.  
  4.     <mt:IfNonZero tag="CategoryCount">
  5.         <li><a href="<$mt:CategoryArchiveLink$>" title="<$mt:CategoryDescription$>"><mt:CategoryLabel decode_html="1" remove_html="1"></a>
  6.     <mt:Else>
  7.         <li><span><mt:CategoryLabel></span>
  8.     </mt:IfNonZero>
  9.     <mt:SubCatsRecurse></li>
  10.  
  11.     <mt:SubCatIsLast></ul></mt:SubCatIsLast>
  12. </mt:TopLevelCategories>

青字の部分ように使います。
で、mt/extlib/ フォルダ内に CategorySort.pm というファイルを新規作成して、以下の内容を保存します。

CategorySort.pm の内容一例

  1. package CategorySort;
  2. use utf8;
  3.  
  4. my %cat_priority = (
  5.     'MovableType<ムーバブルタイプ>' => 1,
  6.     'Template<テンプレート>' => 110,
  7.     'Customize<カスタマイズ>' => 120,
  8.     'Tips<小技>' => 121,
  9.     'Plugins<プラグイン>' => 122,
  10.     'Install<インストール>' => 130,
  11.     'Troubleshooting<トラブルシューティング>' => 140,
  12.     'Tools<ツール>' => 2,
  13.     'JavaScript<スクリプト>' => 210,
  14.     'jQuery<jQuery>' => 211,
  15.     'prototype<prototype>' => 212,
  16.     'mootools<mootools>' => 213,
  17.     'Rental Server<レンタルサーバ>' => 3,
  18.     'Moblog<雑記>' => 4,
  19.     'Topic<トピック>' => 410,
  20.     'Analytics<アクセス解析>' => 411,
  21.     'Books<書籍>' => 5,
  22. );
  23. sub cat_sort ($$) {
  24.     my ($a, $b) = @_;
  25.     my $a_pri = $cat_priority{$a->label} || 1000;
  26.     my $b_pri = $cat_priority{$b->label} || 1000;
  27.     unless ($a_pri == 1000 && $b_pri == 1000) {
  28.         return $a_pri <=> $b_pri;
  29.     }
  30.     return $a->label cmp $b->label;
  31. }

上記はウチのカテゴリを任意の順番に並べ替えるための例で、実際に使ってるものです。
カンタンに説明すると、MTTopLevelCategories や MTSubCategories ブロックタグのハンドラ内にて、sort_method が指定されていた場合、そのモジュール( 上記例では CategorySort )のファンクション( 上記例では cat_sort )を実行することでカテゴリをソートしますよ…と指定してます。

青字には実際のカテゴリ名を明記し、赤字には並べ替えたい順を明記します。
上記例ですと、Movable Type<ムーバブルタイプ> が一番最初に表示されて、次に Template<テンプレート>、Customize<カスタマイズ> と続き、最後に Books<書籍> が表示されてました。

MT4.261 では上記のまま使うことができたのですが、MT5.x では大泣き 残念な結果に。

原因と対策

[2010.01.24] 原因が分かりました。
記事中の CategorySort.pm は問題ないようです。問題なのは、MT から渡された、比較する 2 つのテキストが文字化けしてたことで CategorySort.pm 内の配列にマッチングしないことが原因でした。 cat_sort ファンクション内で比較対象の文字列をファイルに出力することで発覚しました。
さて、原因が分かったことでどう対応するかにや

何だか文字の化け方が変です…全角文字( 日本語 )だけが化けてるんじゃなくって半角文字も化けてるってどういうこと大泣き

[2010.01.24] 解決しました。
CategorySort.pm 内に use utf8; を追加すれば問題なくソートしてくれました。Movable Type 5 では文字コードに悩まされそうですむか

サンプルとして以下にウチで使ってる CategorySort.pm を置いておきます。参考にしてください。

どなたか原因が分かる人いましたら教えて頂けますか。切実です泣きべそ

 Trackback Pings(0)

No trackbacks found.

 Comments(4)

#1: Posted by @ January 19, 2010 [REPLY]
user-pic

こんにちは。

リストの22行目を以下のように変えれば良いと思います。

my $a = $MT::Template::Tags::Category::a;
my $b = $MT::Template::Tags::Category::b;

#2: Posted by Author Profile Page Kei @ January 20, 2010 [REPLY]
user-pic

こんばんは~

5.0入れ替えの時からbzbellさんが言ってた物ですねぇ
私も色々調べてみた結果「sort_method」を使っての記事は古い物ばかりで・・・
「カテゴリ並び換え」でヒットするのは殆どがプラグインでした(;・∀・)

あとは、5.01でも使用できたプラグインを使用しないでカテゴリ並び替えは
モディファイア「regex_replace」を使う記事が多く検索で出ました
私もサーバー移転前までその方法でやってました
英字を日本語に変更できるかはわかりませんが><

まったく話かわりますが
私のブログへ来て書き込みする時にサインインしますよね?
サインインの画面はどうなってますかね(意味わかりませんよね
bzbellさんの所でサインイン画面なるとすごく長いページになるんです
ブラウザのせいでしょうか・・・後でIEでも試してみます

#3: Posted by Author Profile Page bzbellからへの返信 @ January 21, 2010 [REPLY]
user-pic

>>1 壱 さん

こんばんわ^^

アドバイスありがとございます。
結論から申しますとうまくいきませんでしたキャハハ
よかったら教えて頂きたいのですが、lib/MT/Templates/Tags/Category.pm 内から sort_method で指定されたファンクションが実行されるかと思うのですが、その際パラメータで比較する文字列をもらうもの…と思ってたのですが、壱 さんが教えてくださった以下の方法ですと lib/MT/Templates/Tags/Category.pm 内に $a と $b という変数が定義されてて、それを参照するという理解で正しいでしょうか。

my $a = $MT::Template::Tags::Category::a;
my $b = $MT::Template::Tags::Category::b;

機会がありましたら教えて頂けるとうれしいですぺこり

#4: Posted by Author Profile Page bzbellからKeiへの返信 @ January 21, 2010 [REPLY]
user-pic

>>2 Kei さん

こんばんわ^^

いろいろ調べて頂いたようでありがとございますエーン
壱さん(>>1)からアドバイス頂いたのですが、あまり理解してないこともあってかうまくいかなくって四苦八苦してますキャハハ

ログイン画面の件ですが、Kei さんのブログではちゃんとドロップダウンリストで表示されてます。ですが、ウチはなぜかドロップダウンリストではなく、旧ログイン画面になってしまってるみたいなんですよねぇ。
だいぶ前から気づいてたのですが原因が分からなくって、とりあえずコメント投稿はできるからいいかなぁって放置してましたあせあせ

 Post a Comment

 

コメント用フィード