- 2010-04-11 (日) 12:30
- MovableType


- ハッシュに目覚めてしまいました・・・
最近MTMLでハッシュ使うのが大好きになってます。
何が便利かというと、「重複削除が簡単」「要素の個数が不明な時に条件判断を組み合わせやすい」「MTUnlessで条件除外している時の最初と最後の判断をし易い」などいろんな事が出来たりするからですね。
例えば、とあるテーマで使ったサイトマップの例。プラグインで並べ替え対応になっている。
サイトマップと設定用は出したくないので除外。でもその2つのうち一方が順番で最後の時には、普通にコンテナタグで処理するとLIタグに付けたい「tree_end」というクラスが付かなくなっちゃう。
<mt:SortedTopLevelFolders>
<mt:FolderLabel setvar="FolderName">
<mt:unless name="FolderName" like="サイトマップ|設定用">
<mt:SetVarBlock name="sitemap_html" function="push">
<a href="<$mt:var name="website_url"$><$mt:FolderPath$>" title="<$mt:FolderLabel$>"><$mt:FolderLabel$></a>
</mt:SetVarBlock>
</mt:unless>
</mt:SortedTopLevelFolders>
<ul>
<li class="home"><a href="<$mt:Link template="メインページ"$>">トップ</a>
<ul class="tree">
<mt:Loop name="sitemap_html">
<li class="tree<mt:If name="__last__">_end</mt:If>"><MTGetVar name="__value__">
</li>
</mt:Loop>
</ul>
</li>
</ul>
こんな感じで一旦ハッシュに格納してやり、吐き出し時に最後かどうか判断させれば、すっきりと処理される。
後、関連エントリーのから自エントリーを削除する場合に、lastn="6"とするやり方で悩んでる方がいたような・・・
そういう時も、ハッシュにぶち込んでループ出力で件数制限すれば大丈夫。
<MTEntryID setvar="this_entry_id" />
<MTBlogID setvar="blog_id" />
<MTSetVar name="counter" value="0" />
<MTEntryIfTagged>
<MTRelatedEntries lastn="5" weight="idf">
<MTEntryID setvar="entry_id" />
<MTUnless name="entry_id" eq="$this_entry_id">
<MTSetVarBlock name="related_htmls{$entry_id}"><li class="relRank1"><a href="<$MTEntryPermalink escape="url"$>"><$MTEntryTitle escape="html"$></a></li></MTSetVarBlock>
<MTSetVar name="counter" op="++" />
</MTUnless>
</MTRelatedEntries>
<MTSetVarBlock name="etag"><MTEntryTags glue=" OR "><$MTTagName$></MTEntryTags></MTSetVarBlock>
<MTBlogs include_blogs="$blog_id" ignore_archive_context="1">
<MTEntries include_blogs="$blog_id" lastn="8" tags="$etag">
<MTIf name="counter" lt="10">
<MTEntryID setvar="entry_id" />
<MTUnless name="entry_id" eq="$this_entry_id">
<MTUnless name="related_htmls{$entry_id}">
<MTSetVar name="counter" op="++" />
<MTSetVarBlock name="related_htmls{$entry_id}"><li class="relRank2"><a href="<$MTEntryPermalink escape="url"$>"><$MTEntryTitle escape="html"$></a></li></MTSetVarBlock>
</MTUnless>
</MTUnless>
</MTIf>
</MTEntries>
</MTBlogs>
</MTEntryIfTagged>
<MTIf tag="EntryCategory">
<MTSetVarBlock name="ecat"><MTEntryCategories glue=" OR "><$MTCategoryLabel$></MTEntryCategories></MTSetVarBlock>
<MTBlogs include_blogs="$blog_id" ignore_archive_context="1">
<MTEntries include_blogs="$blog_id" lastn="10" categories="$ecat">
<MTIf name="counter" lt="10">
<MTEntryID setvar="entry_id" />
<MTUnless name="entry_id" eq="$this_entry_id">
<MTUnless name="related_htmls{$entry_id}">
<MTSetVar name="counter" op="++" />
<MTSetVarBlock name="related_htmls{$entry_id}"><li class="relRank3"><a href="<$MTEntryPermalink escape="url"$>"><$MTEntryTitle escape="html"$></a></li></MTSetVarBlock>
</MTUnless>
</MTUnless>
</MTIf>
</MTEntries>
</MTBlogs>
<MTElse>
<MTSetVarBlock name="ecat">NOT (<MTCategories glue=" OR "><$MTCategoryLabel$></MTCategories>)</MTSetVarBlock>
<MTBlogs include_blogs="$blog_id" ignore_archive_context="1">
<MTEntries include_blogs="$blog_id" lastn="5" categories="$ecat">
<MTIf name="counter" lt="10">
<MTEntryID setvar="entry_id" />
<MTUnless name="entry_id" eq="$this_entry_id">
<MTUnless name="related_htmls{$entry_id}">
<MTSetVar name="counter" op="++" />
<MTSetVarBlock name="related_htmls{$entry_id}"><li><a href="<$MTEntryPermalink escape="url"$>"><$MTEntryTitle escape="html"$></a></li></MTSetVarBlock>
</MTUnless>
</MTUnless>
</MTIf>
</MTEntries>
</MTBlogs>
</MTIf>
<MTLoop name="related_htmls">
<MTIf name="__first__">
<div class="relatedEntries">
<h2>わりと新しめの関連してる<em>かも</em>しれないエントリー達(<$MTVar name="counter"$>件)</h2>
<ul>
</MTIf>
<$mt:var name="__value__"$>
<MTIf name="__last__">
</ul>
</div>
</MTIf>
<MTElse>
<div class="relatedEntries"><p>関係ないエントリーが多いみたいですね・・・<em>orz</em></p></div>
</MTLoop>
「TagSupplementalsのRelatedEntriesで抽出・普通にタグで抽出・同一カテゴリーで抽出・カテゴリーが無い場合はカテゴリーに属さないエントリーを抽出」と順番に処理していって、最後にまとめて出力。このケースは10件以降はハッシュに入れないようにしている。だから必ず10件以下で出力される。
条件によってはMTLoop内で<MTIf name="__counter__" le="10">を使っても大丈夫。
絶対覚えた方がいいよ。ハッシュの使い方。
- Newer >: ファンクションタグをトリミングして「...」付ける
- < Older: MT5.01で更新履歴が使えなかった
ping a Trackback
- TrackBack URL for this entry.(1)




スクリプトの読み込みが完了していません。
メールフォーム(Javascriptを使用していません)や、
Twitter経由のCommentでもReplyいたします。ただし返信はブログのコメントとして行う事もあります。