February 15, 2004

offsetだけでは駄目なわけ

カテゴリのテンプレートをいじっていて気になったことが。最新5件のエントリーは全文表示して、残りのエントリーは概要だけにしよう、と思って以下のようなコードを書きました。

<MTEntries lastn="5">
(全文を表示する)
</MTEntries>

<MTEntries offset="5">
(概要を表示する)
</MTEntries>


しかし、思ったとおりに動作しません。はじめの全文表示の方はうまくいくのですが、あとの概要表示の方で最新の5件にも入っているエントリーまでもが表示されてしまい、何かおかしいです。
何でだろうとマニュアルをみたところoffsetはlastnという属性と一緒に使用しないと、思った働きをしないようです。従って、今回のような場合、正解は
<MTEntries lastn="5">
(全文を表示する)
</MTEntries>

<MTEntries lastn="1000" offset="5">
(概要を表示する)
</MTEntries>

どうしてoffsetだけでは駄目なのだろうと気持ち悪くなっていたので、ソースハック。原因がわかりました。/path/to/mt/lib/MT/Template/Context.pmの594行目付近です。

    if (%$args) {
        my $n = $args->{lastn};
        ## If lastn is defined, we need to make sure that the list of
        ## entries is in descending order.
        if ($n) {
            @entries = sort { $b->created_on cmp $a->created_on }
            @entries;
        }
        my $off = $args->{offset} || 0;
        my($i, $j) = (0, 0);
        my @tmp;
        for my $e (@entries) {
            next if $off && $j++ < $off;
            last if $n && $i >= $n;
            next unless !$cat || $e->is_in_category($cat);
            next unless !$author || $e->author_id == $author->id;
            push @tmp, $e;
            $i++;
        }
        @entries = @tmp;
    }

ようするにlastnが指定されていないと、時間順にソートされないようです。このような設定がいやなら、強調してあるif条件を取り除けば、常に時間順ソートがかかりoffsetだけでうまくいくようになるはずです(ただし、上のコードの下に続く部分にresort(再び仕分けを行うかどうか)の条件分岐などがでてきますので、複数のタグの組み合わせによっては予期しない動作がおこる可能性があります)。

Context.pmをみているとテンプレートタグがどのように処理されているかわかって面白いですね。MovableTypeの中身に興味がある方は、是非見てみてはいかがでしょうか。

23:50 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | トラックバック
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/171
コメント

こんにちは、はじめまして

この方法でpmを改造すると
去年の12月の記事が一番上に来てしまいました( ̄∇ ̄;
もし解決法が分かるなら教えてください。。。

Posted by: charleroi : July 23, 2004 05:48 PM

すいません、よくみたら説明方法がまずかったような気がします。ということで、説明をなおしました。
もしよければ、どのような状況(『(なんとか)アーカイブのテンプレートで、属性にはoffsetの他に(ほげ)を指定』)でそのようになったのか教えていただければ対応できると思います。

Posted by: fenrir : July 23, 2004 07:48 PM

あ、なるほど!
ifの文全部が白くなっていたので
ifの中身も全部削除してました・・・

恐らくこれで解決するとは思いますが

カテゴリアーカイブ
属性は最初の五つのエントリーにlastn
後ろの残りにoffsetのみで

おかしいなとおもい、最初の五つのみを表示させてもおかしくなってました

では早速ためしてきます

Posted by: charleroi : July 23, 2004 08:15 PM

Σ(´□`;)ハゥ
その方法でやると今度は
offset="5"としたにもかかわらず
1番目の記事から全部表示されました。。。

Posted by: charleroi : July 23, 2004 11:03 PM

うーん、なんででしょうね。MTのバージョンの問題かもしれません、2.661ではこの改造でうまく動いています。お役にたてなくてもうしわけないです。

Posted by: fenrir : July 24, 2004 11:45 AM
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。