February 15, 2004offsetだけでは駄目なわけカテゴリのテンプレートをいじっていて気になったことが。最新5件のエントリーは全文表示して、残りのエントリーは概要だけにしよう、と思って以下のようなコードを書きました。 <MTEntries lastn="5">
(全文を表示する) </MTEntries> <MTEntries offset="5"> しかし、思ったとおりに動作しません。はじめの全文表示の方はうまくいくのですが、あとの概要表示の方で最新の5件にも入っているエントリーまでもが表示されてしまい、何かおかしいです。 何でだろうとマニュアルをみたところoffsetはlastnという属性と一緒に使用しないと、思った働きをしないようです。従って、今回のような場合、正解は <MTEntries lastn="5">
(全文を表示する) </MTEntries> <MTEntries lastn="1000" offset="5"> どうして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の中身に興味がある方は、是非見てみてはいかがでしょうか。 コメント
こんにちは、はじめまして この方法でpmを改造すると すいません、よくみたら説明方法がまずかったような気がします。ということで、説明をなおしました。 あ、なるほど! 恐らくこれで解決するとは思いますが おかしいなとおもい、最初の五つのみを表示させてもおかしくなってました では早速ためしてきます Posted by: charleroi : July 23, 2004 08:15 PMΣ(´□`;)ハゥ うーん、なんででしょうね。MTのバージョンの問題かもしれません、2.661ではこの改造でうまく動いています。お役にたてなくてもうしわけないです。 Posted by: fenrir : July 24, 2004 11:45 AMコメントする
|
スポンサード リンク
|