MTEntries タグの lastn 属性と sort_order 属性(ascend)の同時指定が有効にならない件について
テンプレートに対し、一番古いエントリータイトルを取得するタグ(下記)を設定しても、最新のエントリータイトルが取得されます。
<MTEntries lastn="1" sort_order="ascend"><$MTEntryTitle$></MTEntries>
この問題は「『Ajax月送りカレンダー』でデフォルト表示を一番過去の月にしたい」というご質問で発覚しました。
とりあえずネットで類似情報がないか検索したところ、Movable Type Community Forum で下記の記事を発見。
Sort_order Ascend Not Working In 3.33?
lastn 属性は、MTEntries タグで指定された sort_order 属性をくつがえす、内部の「sort_order="descend"」を持っています。 この振舞いのため、lastn 属性が指定された場合、sort_order 属性は無視されます
と、Nov 3 2006, 07:54 PM の回答で書かれています。たしかに lib/MT/Template/ContextHandlers.pm
の 1333 行にそのような実装がありました。
仕様か不具合かという話は別として、とりあえず lastn 属性が指定された場合でも sort_order 属性を有効にするためのパッチを作ってみました。
--- lib/MT/Template/ContextHandlers.pm.bak Fri Aug 4 12:31:56 2006
+++ lib/MT/Template/ContextHandlers.pm Wed Dec 27 00:47:35 2006
@@ -1330,7 +1330,7 @@
}
}
$args{'sort'} = 'created_on';
- $args{direction} = 'descend';
+ $args{direction} = $args->{sort_order} ? $args->{sort_order} : 'descend';
if (!@filters) {
if (my $last = $args->{lastn}) {
$args{limit} = $last;
が、このパッチは他の属性と競合した場合の問題等を考慮していません。ご指摘ならびに改善案をお待ち申し上げます(他力本願)。
- MovableTypeプラグインの独自CGIをNginxに対応させる方法
- Movable Type 5で「Got an error: Can't use 'defined(%hash)' (Maybe you should just omit the defined()?)」というエラーになる場合の対処
- 旧バージョンのMTでPerl5.26(Perl5.24以降)に対応する方法
- MT6.2のファイルアップロードで「Undefined subroutine &POSIX::strftime」になる問題の対処
- Movable Typeのファイルアップロードで「アップロードしたファイルは大きすぎます。」というエラーになる場合の対処
- Movable Typeのパスワード変更で「URLが不正です。」というエラーなる件についての対処
- Movable Typeで「Cannot find column 'blogs' for class 'MT::Blog'」となる場合の対処
- Movable TypeでMTPageNextタグが効かなくなる不具合について
- Movable Typeの復元で「Request-URI Too Large」になるときの対処
- サーバ故障と「Connection error: Too many connections」エラーおよびMySQLテーブル破損について
- Movable Typeでエラー発生箇所を特定する方法
- IE9でMovable Typeを利用する方法
- MTIfタグにtagモディファイアを利用する場合の注意事項
- Movable Type 5のブログの設定で「Can't call method &quot;label&quot; on unblessed reference」が発生する問題について
- Movable Type 5.03へのアップグレードで再構築時に「Script Error」が発生する件について(つづき)
≫ Movable Type 3.34 3.35 不具合・カスタマイズメモ from Back Yard Weblog
ページの改装は大体終わったわけだが、そもそもなかなか改装に踏み切れなかった理由... [続きを読む]
私は、この現象は仕様だと思っています。
だって「lastn」はたぶん「最近のN件(the Last N)」っていう意味ですから。
そう解釈して割り切って、「古い記事からN件」とかそういうニーズがあるときには MTCollate プラグインを使用して対処しています。
おはようございます。
ざっとペーパーデバッグしてみました。
>他の属性と競合した場合の問題
days属性とsort_order="ascend"を指定した場合に、「過去○日分の記事を古い順に表示」、という動作になりますね。
1313行目に
if (my $days = $args->{days}) {
という記述があるので、この$daysを利用してもう一つ条件をかませるとよいかもです。
ほかにも気になるところはあるのですが、時間もないのでとりあえずそれだけ。
また改めて確認したいと思います。
失礼しました。
今朝の書き込みに誤りがありました。
そもそもdaysとsort_orderって併用できますね。両方指定(sort_order="ascend")で古い順に表示、は仕様通りの動作です。
先の書き込みは忘れてください。
引き続き詳しく見てみました。
1409行目に
unless ($no_resort) {
という記述があり、このブロックの中でソートをし直している模様です。
再ソートをする条件は、変数$no_resortが 0 の時で、$no_resortは1304行目で 0 で初期化されたあと、1360行目と1369行目で 1 が代入されています。
1360行目は、MTEntries の recently_commented_on 属性が指定された場合。
1369行目はコンテキストにあらかじめエントリー一覧(の候補)が保管されているとき(=アーカイブテンプレート中に<MTEntries>が記述されていた場合)です。
このうち recently_commented_on が指定された場合の処理の前に、1333行目を通ります。けれども、$no_resort=1;の前に、独自に最近付けられたコメントの新しい順にソートされているので、結局は1333行目の影響は受けません。
ということで、この記事のパッチで「lastnとsort_orderを両方有効」は大丈夫なようです。
そなると気になるのが、たった一行変更するだけで要望が満たせるのにそれに応じていないMTの仕様ですが;;
>あんちもん2さん
こんばんは。
情報&解析ありがとうございました。
ということで、Six Apart にフィードバックしておきたいと思います。
MTEntries の属性の組み合わせは多岐にわたるので、実装は大変そうですね…。