石輪っぷり!
エントリー等の一覧から更にフィルタリングしたリストの件数が0の時のHTML文法エラー対策
2009年8月24日 22時30分 | コメント(0) | トラックバック(0)
※この投稿は180日以上前のものです。最新の情報とは異なる場合があります。
何やら長ったらしいタイトルになってしまいました。(笑
Movable Type で <mt:Entries> を使ってエントリーをリストアップし、それを <ul> などのリストタグでマークアップする場合、次のように記述すればリスト件数が0のときは <ul> タグは表示されないので HTML の文法エラーになりませんね。( <ul> の内側に <li> が一つもないと文法エラーになる。)
<mt:Entries>
<mt:EntriesHeader><ul></mt:EntriesHeader>
<li><a href="<$mt:EntryPermaLink$>"><$mt:EntryTitle$></a></li>
<mt:EntriesFooter></ul></mt:EntriesFooter>
</mt:Entries>
これは、<mt:Entries> に category モディファイアなどを加えてフィルタリングした場合でも有効です。
しかし、更にエントリータイトルに特定の文字列があるものといった特定の条件でフィルタリングしたり、複数のカスタムフィールドの値などからフィルタリングする場合( field:customfieldbasename モディファイアは複数指定できない)、上記の方法ではうまく行きません。
例えば、エントリータイトルに"○○"が含まれるものだけをリストアップする場合、
<mt:Entries>
<mt:If tag="EntryTitle" like="○○">
<mt:EntriesHeader><ul></mt:EntriesHeader>
<li><a href="<$mt:EntryPermaLink$>"><$mt:EntryTitle$></a></li>
<mt:EntriesFooter></ul></mt:EntriesFooter>
</mt:If>
</mt:Entries>
と記述しても、<mt:EntriesHeader> や <mt:EntriesFooter> は <mt:Entries> に対して、最初あるいは最後のエントリーの場合に動作するので、<mt:Entries> の内側でフィルタリングしても駄目なのです。
これは、<mt:TopLevelCategories> に対する <mt:SubCatIsFirst> など、他のリストアップでも同様で、また、<mt:If name="__first__"> といった組み込み変数を使っても同じです。
そこで、次のような方法を考えました。
<mt:SetVar name="count" value="0">
<mt:Entries>
<mt:If tag="EntryTitle" like="○○">
<mt:SetVar name="count" value="1" op="+">
<mt:If name="count" eq="1"><ul><mt:If>
<li><a href="<$mt:EntryPermaLink$>"><$mt:EntryTitle$></a></li>
</mt:If>
</mt:Entries>
<mt:If name="count" ge="1"></ul></mt:If>
まず、変数"count"に"0"を代入します。
そして、フィルタリングされたエントリーのリストアップを繰り返す毎に、変数"count"に"1"を足していき、変数"count"の値が"1"の時、つまり最初のエントリーで、<ul> を記述します。
最後に、エントリーリストを吐き出したあとで、変数"count"の値が"1"以上であれば、つまり1件でもリスアップされてたら </ul> を記述します。
なお、一つのテンプレート内でこのようなフィルタリングが1回しか登場しなければ、上記コードの1行目は不要です。
トラックバック(0件)
- :
- « 前の記事
- IE6 は2014年までサポートされる?
- 次の記事 »
- TimeMachineから復元中

コメント(0件)
コメントする