offsetだけでは駄目なわけ
カテゴリのテンプレートをいじっていて気になったことが。最新5件のエントリーは全文表示して、残りのエントリーは概要だけにしよう、と思って以下のようなコードを書きました。
(全文を表示する)
</MTEntries>
<MTEntries offset="5">
(概要を表示する)
</MTEntries>
しかし、思ったとおりに動作しません。はじめの全文表示の方はうまくいくのですが、あとの概要表示の方で最新の5件にも入っているエントリーまでもが表示されてしまい、何かおかしいです。
何でだろうとマニュアルをみたところoffsetはlastnという属性と一緒に使用しないと、思った働きをしないようです。従って、今回のような場合、正解は
(全文を表示する)
</MTEntries>
<MTEntries lastn="1000" offset="5">
(概要を表示する)
</MTEntries>
どうしてoffsetだけでは駄目なのだろうと気持ち悪くなっていたので、ソースハック。原因がわかりました。/path/to/mt/lib/MT/Template/Context.pmの594行目付近です。
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の中身に興味がある方は、是非見てみてはいかがでしょうか。
コメント
すいません、よくみたら説明方法がまずかったような気がします。ということで、説明をなおしました。
もしよければ、どのような状況(『(なんとか)アーカイブのテンプレートで、属性にはoffsetの他に(ほげ)を指定』)でそのようになったのか教えていただければ対応できると思います。
あ、なるほど!
ifの文全部が白くなっていたので
ifの中身も全部削除してました・・・
恐らくこれで解決するとは思いますが
↓
カテゴリアーカイブ
属性は最初の五つのエントリーにlastn
後ろの残りにoffsetのみで
おかしいなとおもい、最初の五つのみを表示させてもおかしくなってました
では早速ためしてきます
Posted by: charleroi : July 23, 2004 08:15 PMΣ(´□`;)ハゥ
その方法でやると今度は
offset="5"としたにもかかわらず
1番目の記事から全部表示されました。。。
うーん、なんででしょうね。MTのバージョンの問題かもしれません、2.661ではこの改造でうまく動いています。お役にたてなくてもうしわけないです。
Posted by: fenrir : July 24, 2004 11:45 AMコメントする
- 匿名でのコメントは受け付けておりません。
- お名前(ハンドル名可)とメールアドレスは必ず入力してください。
- メールアドレスを表示されたくないときはURLも必ず記入してください。
- コメント欄でHTMLタグは使用できません。
- コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
- コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。
- 投稿ボタンを押してエラーがでなければ、投稿は成功しています。反映されるまでには少し時間がかかります。
こんにちは、はじめまして
この方法でpmを改造すると
Posted by: charleroi : July 23, 2004 05:48 PM去年の12月の記事が一番上に来てしまいました( ̄∇ ̄;
もし解決法が分かるなら教えてください。。。