Movable Typeで項目の並べ替えとかハンドラの上書きとかモードのつくり方とか。
公開日 : 2007-05-06 05:22:58
Entryの並べ替えのキーに"keywords"は指定できるか?
<MTEntries sort_by="keywords" sort_order="ascend">
<$MTEntryTitle$>
</MTEntries>
ってのは効くのか? マニュアルには excerpt には対応しているとの記述があるが...
ということで MT::Template::ContextHandlers.pm の _hdlr_entries を眺めていたのだが、excerpt は良くて keywords が駄目ってところがどう見てもないような...じゃぁ、Entry.pm で excerpt だけインデックス指定されているのかというと...そうでもない。
じゃぁ、やっちまえってことで実験。効いているようだ。
何故 excerpt じゃだめかというと、ちゃんと理由があるのだ。
並べ替えのキーになるフィールドにコメントタグを入れて番号を振っていこうとしていたんだけど問題が2つあって1つめは「<$MTEntryTrackbackData$>」の中に 「dc:description=excerpt」という感じで概要が入るのだが、これに並べ替えのためのコメントが入ってしまう点。もう一つはエントリーからトラックバックを送る際に、こちら側のエントリーの概要がコメントタグになってしまう点。
title でも同じことがひっかかるし、日付は日付でちゃんと持っていたいし...ということで上述のように keywords でやってみたらちゃんと並べ替えられるじゃないか...というヲチ。
テンプレートタグやハンドラの上書きは可能か?
キーワードで並べ替えられるのはいいとして、今度はこの並べ替えのためのコメントが出力されなくなるようにする方法について。
まず、思いつくのはグローバルフィルターを書いてちょん切ってやるやり方。
以下のようなプラグインを書いて remove_num="1" を追加する。
# <$MTEntryKeywords remove_num="1"$>
# ex : <!--item-sort-0001--> => ""
MT::Template::Context->add_global_filter(remove_num => ¥&_Remove_Num);
sub _Remove_Num {
my $text = shift;
my $beg = quotemeta('<!--item-sort-');
my $end = quotemeta('-->');
$text =~ s/^$beg[0-9]{4}?$end//;
return $text;
}
ところが、「テンプレート書き換えるのが面倒」みたいな話が出て来て(どこでだよ?)、以下のようにすると優先されるようだ。でも思いっきり非推薦、自己責任というか、こういうノウハウって開発元の方には嫌がられるだろうから、あくまでもメモです。良い子は真似しないこと。
MT::Template::Context->add_tag(EntryKeywords => ¥&_Alt_EntryKeywords);
アプリケーションの「__mode」を追加する, 上書きする
今まではよく分かっていなくて Transformer プラグイン でテンプレートが呼び出される時に無理矢理違う動作をさせていたんだけど「オリジナルの__mode が追加できる」とリファレンスにもあるのでやってみた。
sub init_app {
my $plugin = shift;
my ($app) = @_;
return unless $app->isa('MT::App::CMS');
$app->add_methods(itemsort => ¥&_Itemsort);
}
として、mt.cgi?__mode=itemsort&blog_id=1 とかすると、あら動いたわ。
ついでに、既に指定されている __mode をプラグインで指定してやるとどうか。
$app->add_methods(ping => ¥&_Alt_Ping);
上書き(プラグインで書いたものが優先)されるようだ。これも嫌がられる感じがするので良い子は真似しないこと(<=もうええわ!)。