MTEntries タグの lastn 属性と sort_order 属性(ascend)の同時指定が有効にならない件について
Category:[トラブルシューティング]
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;
が、このパッチは他の属性と競合した場合の問題等を考慮していません。ご指摘ならびに改善案をお待ち申し上げます(他力本願)。
- Movable Type 4 でテンプレート編集画面の内容が途中から消失する問題の対処
- Windows XP のローカルサーバ環境(ジャンクション利用)への Movable Type 4.1 のインストールで「mt-staticがみつかりません」という警告が表示される場合の対処
- Movable Type でサブドメインを利用する場合の設定
- Movable Type 4.1 でコメント投稿者情報が保存されない不具合について
- 「月別アーカイブリスト」が月別アーカイブで正常に表示されない不具合について
- Movable Type 4.0x でブログ記事へのリンクが post.html になる/ブログ記事のプレビューができない不具合について
- テンプレートの再構築で「モジュールというテンプレートが見つかりませんでした」というエラーになる場合の対処
- Movable Type 4 の管理画面で詳細メッセージのないエラーが発生する不具合について
- Movable Type 4 のデフォルトテンプレートで @import が表示される問題
- 検索結果のページ分割(3.3x 版)
- Movable Type でコメント投稿・トラックバックが重くなる事象を解消する
- HTTP/1.1 の「条件付きGET」を利用して PHP ファイルアクセスによるサーバ負荷を削減する
- Movable Type 3.x デフォルト・テンプレートのAtomフィードの不具合について
- Movable Type 3.3 で TypeKey サイン・イン時の JavaScript エラーを解消する
- カテゴリーリストで MTArchiveListHeader と MTArchiveListFooter が正常に動作しない問題
- Movable Type 3.2 と 3.31 におけるサブカテゴリーリストの表示の違いについて
- Movable Type 3.3 の再構築で「<MTTagName>タグが閉じられていません」になる問題の対処(改)
- Movable Type の検索でエラーになる問題について
- コメント・プレビューで実体参照が無効になる不具合を解消する
≫ 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 の属性の組み合わせは多岐にわたるので、実装は大変そうですね…。

