記事本文
Movable Type のテンプレートタグリファレンスのサンプルコード
Movable Type のテンプレートタグリファレンスは、 Movable Type 4.0 のリリースと共にリニューアルされて、テンプレートタグの機能ごとのタグ分類が導入されるようになっています。
その反面、そのテンプレートタグをどのように使うかのサンプルは非常にシンプルに書かれており、テンプレートタグの使い方が理解しづらくなって、テンプレートタグをうまく活用できる機会を逃してしまいそうです。 例えば、 MTBlogResultHeader は MTSearchResults 内で使用するテンプレートタグなのですが、
<MTBlogResultHeader>
<!-- do something -->
</MTBlogResultHeader>
というサンプルコードからはそれが読み取れません。 そこで、今回は検索結果のテンプレートに用いるテンプレートタグについて、自分用のメモとして書いたサンプルコードを記録しておきます。
MTSearchResults ブロックタグ - 実行した検索の結果
<MTSearchResults>
~
</MTSearchResults>
で囲むことにより、検索条件に合致した内容を、合致数だけ繰り返して全て出力します。
このブロックタグ内で MTBlogResultHeader や MTBlogResultFooter を用いることにより、検索結果の記事数の表示や検索結果に対する見出しなど、合致数に関わらず 1 回だけ表示したい内容を出力することも可能です。
例えば、検索キーワードに該当した記事を dl, dt, dd, dt, dd, dt, dd... のように、 1 つの定義リスト内で羅列したい場合には次のように記述します。
<MTSearchResults>
<MTBlogResultHeader><dl class="headline"></MTBlogResultHeader>
<dt><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a><span class="date"> - Posted date: <$MTEntryDate format="%x %X"$></span></dt>
<dd>
<ul>
<li class="textBody"><$MTEntryExcerpt$></li>
<li class="author">Posted by: <span class="name"><$MTEntryAuthorDisplayName$></span></li>
<li class="category">Category: <MTEntryCategories glue=" | "><a href="<$MTCategoryArchiveLink$>" title="<$MTCategoryLabel$> Index"><$MTCategoryLabel$></a><li>
<li class="tag">Tag: <MTEntryTags glue=", "><a href="<$MTTagSearchLink$>" rel="nofollow"><$MTTagName$></a></li>
</ul>
</dd>
<MTBlogResultFooter></dl></MTBlogResultFooter>
</MTSearchResults>
この例で MTBlogResultHeader や MTBlogResultFooter を用いなければ、 dl, dt, dd, dl, dt, dd... のように、検索条件に合致した数の分だけ定義リストが出力されるでしょう。
MTNoSearchResults ブロックタグ - 検索条件に合致した結果が得られなかった
<MTNoSearchResults>
~
</MTNoSearchResults>
で囲むことにより、検索条件に合致する結果が全く無かった場合の内容を出力します。
MTSearchResults と違い、繰り返しはありません。
例えば、検索キーワードに該当した記事が無かったことを示したい場合には次のように記述します。
<MTNoSearchResults>
<div class="section entry">
<h2>検索結果</h2>
<div class="textBody">
<p><em><$MTSearchString$></em>というキーワードを含む記事は見つかりませんでした。次項のヒントを参考にして、検索キーワードを変えてもう一度検索してみてください。</p>
<ul>
<li>キーワードに誤字や脱字がありませんか ?</li>
<li>キーワードの意味はそのままで、表現や言い回しを変えてみてください。</li>
<li>専門的なキーワードだったり、長い文字列のキーワードだったりした場合は、より一般的で短いキーワードにしてください。</li>
<li>キーワードを複数指定している場合は、キーワードの数を減らしてみてください。</li>
</ul>
</div>
</div>
</MTNoSearchResults>
MTNoSearch ブロックタグ - 検索が実行されていない
検索フォームに、キーワードを入力しないまま検索を実行した場合のように、検索条件が指定されていない場合の内容を出力します。 このブロックタグも MTSearchResults と違い、繰り返しはありません。
例えば、検索キーワードが入力されていなかったことを示したい場合には次のように記述します。
<MTNoSearch>
<div class="section entry">
<h2>Error</h2>
<div class="textBody">
<p>検索キーワードが入力されていません。</p>
</div>
</div>
</MTNoSearch>
また、 MTElse と組み合わせることで、「合致する・合致しないに関わらず、何かしらの検索条件が与えられている」条件での内容を表示することも可能です。
<MTNoSearch>
<MTElse>
<MTIfStraightSearch>
<p>今回入力した<em><$MTSearchString$></em>というキーワードを含む記事を今後もチェックしたい場合、<a href="<$MTCGIPath$><$MTSearchScript$>?search=<$MTSearchString encode_url="1"$>&Template=feed&IncludeBlogs=<$MTSearchIncludeBlogs$>"><img src="<$MTStaticWebPath$>images/status_icons/feed.gif" width="9" height="9" alt="" />"<$MTSearchString$>"を含む記事の Feed</a> を Feed リーダに登録することで、チェック漏れの可能性を低くできます。</p>
</MTIfStraightSearch>
<MTIfTagSearch>
<p><em><$MTSearchString$></em>というタグが設定された記事を今後もチェックしたい場合、<a href="<$MTCGIPath$><$MTSearchScript$>?tag=<$MTSearchString encode_url="1"$>&Template=feed&IncludeBlogs=<$MTSearchIncludeBlogs$>"><img src="<$MTStaticWebPath$>images/status_icons/feed.gif" width="9" height="9" alt="" />"<$MTSearchString$>"というタグが設定された記事の Feed</a> を Feed リーダに登録することで、チェック漏れの可能性を低くできます。</p>
</MTIfStraightSearch>
</MTElse>
</MTNoSearch>
MTIfStraightSearch コンディショナルタグ - ブログ記事の検索の場合
検索の種類が、サイト内検索の場合の内容を出力します。
例えば、サイト内検索の条件に合致した記事数を表示したい場合には次のように記述します。
<MTSearchResults>
<MTBlogResultHeader>
<MTIfStraightSearch>
<ul class="info">
<li>Search:<em><$MTSearchString$></em></li>
<li><em><span class="count"><$MTSearchResultCount$></span></em> Hits</li>
</ul>
</MTIfStraightSearch>
</MTBlogResultHeader>
</MTSearchResults>
または、 MTElse を用いて「タグ検索ではない」という条件を指定して次のように記述することもできます。 これはブログ記事の検索とタグ検索の場合の記述を分ける時に、 MTIfStraightSearch と MTIfTagSearch の両方で If という名前を含むテンプレートタグを用いるより、 If-Else で記述したいという場合に用いると良いでしょう。
<MTSearchResults>
<MTBlogResultHeader>
<MTIfTagSearch>
<MTElse>
<ul class="info">
<li>Search:<em><$MTSearchString$></em></li>
<li><em><span class="count"><$MTSearchResultCount$></span></em> Hits</li>
</ul>全文検索結果
</MTElse>
</MTIfTagSearch>
</MTBlogResultHeader>
</MTSearchResults>
MTIfTagSearch コンディショナルタグ - タグ検索の場合
検索の種類が、ブログ記事・タグ検索の場合の内容を出力します。
例えば、特定のタグが設定された記事数を表示したい場合には次のように記述します。
<MTSearchResults>
<MTBlogResultHeader>
<MTIfTagSearch>
<ul class="info">
<li>Tag:<em><$MTSearchString$></em></li>
<li><em><span class="count"><$MTSearchResultCount$></span></em> Hits</li>
</ul>
</MTITagSearch>
</MTBlogResultHeader>
</MTSearchResults>
または、 MTElse を用いて「ブログ記事の検索ではない」という条件を指定して次のように記述することもできます。 これはブログ記事の検索とタグ検索の場合の記述を分ける時に、 MTIfStraightSearch と MTIfTagSearch の両方で If という名前を含むテンプレートタグを用いるより、 If-Else で記述したいという場合に用いると良いでしょう。
<MTSearchResults>
<MTBlogResultHeader>
<MTIfStraightSearch>
<MTElse>
<ul class="info">
<li>Tag:<em><$MTSearchString$></em></li>
<li><em><span class="count"><$MTSearchResultCount$></span></em> Hits</li>
</ul>
</MTElse>
</MTIfStraightSearch>
</MTBlogResultHeader>
</MTSearchResults>
サンプルコードの元ネタは 3ping.org
今回のサンプルコードは、 MTNoSearch と MTElse を組み合わせたものを除き、 3ping.org の検索ページを元に作ってみました。
何故 hxxk.jp の検索ページを使わなかったかというと、最終的に出力された XHTML をヒントに、元々のテンプレートがどのように書かれているかを推測するのもいい勉強になるかなあ、と思いまして。 今回のサンプルコードと 3ping.org で実際に使われているテンプレート、どれくらいの違いがあるでしょうか ?
......ということで 3ping.org のうーたんに採点をお願いしようと思いましたが、よく考えたら Vicuna - Movable Type テンプレートをダウンロードしたら正解のソースが容易に入手できるんじゃないでしょうかもしかして。

