MTEntries タグの lastn 属性と sort_order 属性(ascend)の同時指定が有効にならない件について

MTEntries タグの lastn 属性と sort_order 属性(ascend)の同時指定が有効にならない件について

Posted at December 27,2006 1:10 AM
Tag:[MovableType, MTEntries, TroubleShooting]

テンプレートに対し、一番古いエントリータイトルを取得するタグ(下記)を設定しても、最新のエントリータイトルが取得されます。

<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;

が、このパッチは他の属性と競合した場合の問題等を考慮していません。ご指摘ならびに改善案をお待ち申し上げます(他力本願)。

関連記事
トラックバックURL


トラックバック

Movable Type 3.34 3.35 不具合・カスタマイズメモ from Back Yard Weblog
ページの改装は大体終わったわけだが、そもそもなかなか改装に踏み切れなかった理由... [続きを読む]

Tracked on April 21, 2007 7:33 PM
コメント

私は、この現象は仕様だと思っています。
だって「lastn」はたぶん「最近のN件(the Last N)」っていう意味ですから。
そう解釈して割り切って、「古い記事からN件」とかそういうニーズがあるときには MTCollate プラグインを使用して対処しています。

[1] Posted by あんちもん2 : December 27, 2006 10:04 PM

おはようございます。
ざっとペーパーデバッグしてみました。

>他の属性と競合した場合の問題
days属性とsort_order="ascend"を指定した場合に、「過去○日分の記事を古い順に表示」、という動作になりますね。

1313行目に

if (my $days = $args->{days}) {

という記述があるので、この$daysを利用してもう一つ条件をかませるとよいかもです。

ほかにも気になるところはあるのですが、時間もないのでとりあえずそれだけ。
また改めて確認したいと思います。

[2] Posted by あんちもん2 : December 28, 2006 8:46 AM

失礼しました。
今朝の書き込みに誤りがありました。
そもそも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の仕様ですが;;

[3] Posted by あんちもん2 : December 28, 2006 2:23 PM

>あんちもん2さん
こんばんは。
情報&解析ありがとうございました。
ということで、Six Apart にフィードバックしておきたいと思います。
MTEntries の属性の組み合わせは多岐にわたるので、実装は大変そうですね…。

[4] Posted by yujiro : December 28, 2006 7:31 PM
コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)