Movable Type 備忘録

 ハッシュ変数を使って同一カテゴリ内の前・次リンク表示

こんばんわ^^

今日は月島でもんじゃ焼き食べてきました ( ̄∇ ̄)
連れてってくれた人がもんじゃ焼き大好きらしくって、ウンチクをタンタン聞かされました (; ̄∇ ̄A どぅでもいいのに。

あと野球の話も延々と・・・今日だけは聞き上手だった bzbell です。

さて、前回に引き続きハッシュを使って同一カテゴリ内の前・次リンクを表示してみたのでご紹介します ( ̄∇ ̄)/

'Pandora' テンプレートにも不具合対応と同時に、Ver0.06 で組み込んでいます。

エントリページで表示する前・次リンクは、以下のように MTEntryNext、MTEntryPrevious ファンクションタグで表示することができます。

  1. <ul>
  2. <MTEntryNext><li>Next Page: <a href="<$MTEntryPermalink$>" title="次のエントリ"><$MTEntryTitle$></a></li></MTEntryNext>
  3. <MTEntryPrevious><li>Prev Page: <a href="<$MTEntryPermalink$>" title="前のエントリ"><$MTEntryTitle$></a></li></MTEntryPrevious>
  4. </ul>

でも表示されるリンクは投稿された順になります。
せっかくカテゴリ分けしてるんだから、同一カテゴリ内での前・次リンクを表示したいものです。

以前のバージョンの MT では、カテゴリ内で前・次リンクを行うでご紹介した、PreviousNextInCategory プラグインで同一カテゴリ内のリンクを表示することができます。

Movable Type 4.1 ではハッシュ機能が備わったので、プラグインに頼らずデフォルト・タグだけで同様のことをやってみました。

同一カテゴリ内の前・次リンク

以下のそのコードになります。

  1. <MTIf name="entry_template">
  2. <ul>
  3. <MTIfNonEmpty tag="EntryCategory">
  4.     <MTEntryCategories>
  5.         <MTSetVarBlock name="cat_name"><$MTCategoryLabel$></MTSetVarBlock>
  6.     </MTEntryCategories>
  7.  
  8.     <MTSetVarBlock name="cat"><MTGetVar name="cat_name" index="0"></MTSetVarBlock>
  9.     <MTSetVarBlock name="date"><$MTEntryDate format="%Y%m%d%H%M%S"$></MTSetVarBlock>
  10.  
  11.     <MTEntries lastn="0" category="$cat">
  12.         <MTSetVarBlock name="ent_date"><$MTEntryDate format="%Y%m%d%H%M%S"$></MTSetVarBlock>
  13.         <MTSetVarBlock name="ent_name" key="$ent_date"><$MTEntryTitle$></MTSetVarBlock>
  14.         <MTSetVarBlock name="ent_link" key="$ent_date"><$MTEntryPermalink$></MTSetVarBlock>
  15.     </MTEntries>
  16.  
  17.     <MTLoop name="ent_name" sort_by="key value">
  18.         <MTIf name="date" eq="$__key__">
  19.             <$MTSetVar name="find" value="1"$>
  20.         <MTElseIf name="find">
  21.             <li>Next Page: <a href="<MTGetVar name="ent_link" key="$__key__">" title="次のエントリ"><MTGetVar name="ent_name" key="$__key__"></a></li>
  22.             <$MTSetVar name="find" value="0"$>
  23.         </MTIf>
  24.     </MTLoop>
  25.  
  26.     <MTLoop name="ent_name" sort_by="key value reverse">
  27.         <MTIf name="date" eq="$__key__">
  28.             <$MTSetVar name="find" value="1"$>
  29.         <MTElseIf name="find">
  30.             <li>Prev Entry: <a href="<MTGetVar name="ent_link" key="$__key__">" title="前のエントリ"><MTGetVar name="ent_name" key="$__key__"></a></li>
  31.             <$MTSetVar name="find" value="0"$>
  32.         </MTIf>
  33.     </MTLoop>
  34. <MTElse>
  35.     <MTEntryNext><li>Next Page: <a href="<$MTEntryPermalink$>" title="次のエントリ"><$MTEntryTitle$></a></li></MTEntryNext>
  36.     <MTEntryPrevious><li>Prev Page: <a href="<$MTEntryPermalink$>" title="前のエントリ"><$MTEntryTitle$></a></li></MTEntryPrevious>
  37. </MTIfNonEmpty>
  38. </ul>
  39. </MTIf>

まず青い字の部分でエントリに関連付けされたメインカテゴリ名称を取得します。
そして、赤い字の部分でそのカテゴリに属するすべてのエントリをハッシュ変数に登録していきます。

最後に緑の字の部分でハッシュ内から現在のエントリを検索して、その次のエントリ、その前のエントリのタイトル、リンクを取得するわけです ( ̄∇ ̄)b

この時、MTLoop ブロックタグで次リンクを検索するときは降順、前リンク時は昇順でソートしておきます。ソートしておくことで配列という観点から見ると、現在のエントリの次は必ず前(次)エントリと決め打ちすることができますね。

以上です。

 Trackback Pings(0)

No trackbacks found.

 Comments(6)

#1: Posted by Author Profile Page I am Google @ February 4, 2008 [REPLY]
user-pic

初めてコメントさせていただきます。

同一フォルダ内のウェブページの前後に MTPagePrevious MTPageNext のリンクを貼れるようにしたいと思い、
検索したら、MovableType備忘録さまのサイトにたどり着きました。

ハッシュ変数を使って同一カテゴリ内の前・次リンク表示が可能ということは、
ハッシュ変数を使って同一フォルダ内の前・次リンク表示は可能でしょうか。

ぶしつけな質問になってしまい申し訳ございませんが
ご教授いただけますでしょうか。

#2: Posted by Author Profile Page bzbell @ February 4, 2008 [REPLY]
user-pic

>>1 bzbell さん

こんにちわ^^

> ハッシュ変数を使って同一カテゴリ内の前・次リンク表示が可能ということは、
> ハッシュ変数を使って同一フォルダ内の前・次リンク表示は可能でしょうか。

はい。可能だと思いますよぺこり
今はお仕事中(なわりに、コメントに答えてる bzbell です)なので作れないですが、帰宅したら作ってみましょうかキャハハ

#3: Posted by Author Profile Page I am Google @ February 4, 2008 [REPLY]
user-pic

早速のご返信ありがとうございます。
また、お忙しい中ありがとうございます。

是非、教えていただけますでしょうか。
宜しくお願いいたします。

#4: Posted by Author Profile Page bzbell @ February 4, 2008 [REPLY]
user-pic

>>3 bzbell さん

はい。
ブログページの前・次リンクもそうなのですが、MTLoop を 2 回やらないといけないところが気に食わなかった(ブログページ再構築のたびにループするので再構築に時間がかかる)ので、そちらも合わせて検討しみますサングラス

#5: Posted by Author Profile Page bzbell @ February 4, 2008 [REPLY]
user-pic

>>3 bzbell さん

遅くなりましたぁふつう

基本的にはブログページと同様、以下のようにやればウェブページでの前・次リンクができます。

<MTIf name="page_archive"><mt:ignore>▼ウェブページの場合▼</mt:ignore>
<ul class="asset_navi">
<MTSetVarBlock name="fol_name"><$MTFolderLabel$></MTSetVarBlock>
<MTIf name="fol_name">
<MTSetVarBlock name="date"><$MTPageDate format="%Y%m%d%H%M%S"$></MTSetVarBlock>
<MTPages lastn="0" folder="$fol_name">
<MTSetVarBlock name="page_date"><$MTPageDate format="%Y%m%d%H%M%S"$></MTSetVarBlock>
<MTSetVarBlock name="page_name" key="$page_date"><$MTPageTitle$></MTSetVarBlock>
<MTSetVarBlock name="page_link" key="$page_date"><$MTPagePermalink$></MTSetVarBlock>
</MTPages>
<MTLoop name="page_name" sort_by="key value">
<MTIf name="date" eq="$__key__">
<$MTSetVar name="find" value="1"$>
<MTElseIf name="find">
<li class="list_entry">Next Page: <a href="<MTGetVar name="page_link" key="$__key__">" title="次のページ"><MTGetVar name="page_name" key="$__key__"></a></li>
<$MTSetVar name="find" value="0"$>
</MTIf>
</MTLoop>
<MTLoop name="page_name" sort_by="key value reverse">
<MTIf name="date" eq="$__key__">
<$MTSetVar name="find" value="1"$>
<MTElseIf name="find">
<li class="list_entry">Prev Page: <a href="<MTGetVar name="page_link" key="$__key__">" title="前のページ"><MTGetVar name="page_name" key="$__key__"></a></li>
<$MTSetVar name="find" value="0"$>
</MTIf>
</MTLoop>
</ul>
</MTIf>
</MTIf>

MTLoop 2 回 を 1 回にする件ですが、カレントページを見つけてその前後のページを抽出できればいいんですけど・・・なんだかできなさそう。

とりあえず、ご確認くださいもじもじ

また、わたしのサイトで配布してるテンプレート内で使っても良いですかあせあせ

#6: Posted by Author Profile Page I am Google @ February 4, 2008 [REPLY]
user-pic

いえいえ!お忙しいなか、すばいやいご対応ありがとうございます!うるうる
早速、ハッシュ変数の勉強をさせていただきます。
理解できるようにがんばってみますはて?

素人のコメントに対応していただき感謝感激できです!

どうぞ。テンプレート内でご利用になってください!

本当にありがとうございます!テレテレ

 Post a Comment

 

コメント用フィード