カテゴリー
Movable type

[MT]記事ページで表示記事を外しながら所属カテゴリ一覧を表示、しかも空いた枠に最新の記事を埋める(ややこし!)

つまり、

・記事一覧枠が3つあり、ここには記事ページが所属するカテゴリー一覧を表示したい
・でも表示している記事は外して欲しい
・そうなると、例えばカテゴリーに3件しか所属してない=該当記事がそのうちのひとつだから表示が2件になる。
・その空いた1枠には全記事からの最新記事を入れて欲しい
・もちろん表示している記事がいちばん新しかったら外してね!

・・・という要求仕様に応えるソースである。

以前探した記事で「MTの個別記事で同じカテゴリの記事一覧を表示する際に、現在の記事を除外する」というのがあったのだが、MTの仕様なのか「10件表示する」→「該当記事が入っている」→「表示させない」→「9件」という動きをしており、空いた穴を埋めてくれない物だった。それを前回のエントリーでまずはうまく行ったので、これをベースに分岐を交えてやってみた。



<mt:EntryCategory setvar="primary_category">
<mt:EntryCategories>
    <mt:if tag="CategoryLabel" eq="$primary_category">
        <mt:CategoryLabel setvar="now_cate">
        <mt:CategoryCount setvar="now_cate_count">
    </mt:if>
</mt:EntryCategories>


<mt:EntryID setvar="entryid">

<mt:Entries id="$entryid">
<mt:EntryTitle setvar="now_entry">
</mt:Entries>



<mt:If name="now_cate_count" eq="1">
<p>▼所属記事数1→カテ数0→最新記事3件表示</p>

 <MTEntries lastn="3" unique="1">
   <li><$MTEntryTitle$></li>
 </MTEntries>

<p>※合計3件表示</p>

<mt:ElseIf name="now_cate_count" eq="2">
<p>▼所属記事数2=カテ数1</p>

    <MTEntryCategories type="primary">
 <MTEntries unique="1">
   <li><$MTEntryTitle$></li>
 </MTEntries>
    </MTEntryCategories>

<p>▼空白補完→最新記事2件表示</p>

 <MTEntries lastn="2" unique="1">
   <li><$MTEntryTitle$></li>
 </MTEntries>

<p>※合計3件表示</p>


<mt:ElseIf name="now_cate_count" eq="3">
<p>▼所属記事数3=カテ数2</p>

    <MTEntryCategories type="primary">
 <MTEntries unique="1">
   <li><$MTEntryTitle$></li>
 </MTEntries>
    </MTEntryCategories>

<p>▼空白補完→最新記事1件表示</p>
 <MTEntries lastn="1" unique="1">
   <li><$MTEntryTitle$></li>
 </MTEntries>


<p>※合計3件表示</p>

<mt:Else>
<p>▼所属記事数4=カテ数フル</p>

    <MTEntryCategories type="primary">
 <MTEntries unique="1" lastn="3">
   <li><$MTEntryTitle$></li>
 </MTEntries>
    </MTEntryCategories>

<p>※合計3件表示</p>

</mt:If>


今回は、分岐用&カテゴリー指定用に所属カテゴリーと所属カテゴリーの記事数を取得し、これを変数変換する命令を最初に追加している。
そして、前回のエントリーIDを取得し、その記事をmt:Entriesで呼び出し、uniqueを使うための履歴の為に・・・というのは前回通り。
あとは、取得した所属カテゴリーの記事数の数字を使って分岐をし、それぞれ穴を埋めるための必要な記事数を呼び出していく、というわけですな。
uniqueが反応しているので、同カテゴリー一覧にも最新記事一覧にも表示記事は表示されないようになってるはず。これは多分色々使いまわせる技術ではないだろうか。

役に立った!と思った方は、広告バナーを一回ぽちっと押すだけでいいのでこの労力を誉めてください(笑

カテゴリー
Movable type

[MT]変数予約いろいろ

MT仕事で必要となってきたのが、変数のセット。
この分岐を理解することが、複雑な分岐がある程度クリアできてくる。

まずは変数をセットする構文。
大体2種類があるがどれも同じ命令となる。
例えば、mt:EntryIDをentry_numに入れる方法。


<MTSetVarBlock name="entry_num"><mt:EntryID></MTSetVarBlock>

<mt:EntryID setvar="entry_num">

例えば、記事のエントリーIDが999の場合は、この「999」がentry_numに収められる。
2番目のはmt:EntryIDを直で書いているように見えるが、変数に入れられるので表示はされない。

そして、entry_numに入った値を表示する方法は、Getvarを使う。


<mt:GetVar name="entry_num">

しかし、この値をMTタグ内で使用する際は、getvarでは対応できないので、「$」で呼び出すことになる。


<mt:Entries id="$entryid">
<mt:EntryTitle>
</Entries>

mt:if内では、nameに入れて、その値をモディファイアと比較することで、分岐を行える。
下記の内容だと、エントリーIDが999の場合、1000の場合、それ以外の場合、という分岐の内容になる。


<mt:If name="entry_num" eq="999">
<p>私はゾウを愛しています</p>
<mt:ElseIf eq="1000">
<p>私はゾウより、シロクマを愛しています</p>
<mt:Else>
<p>私はゾウもシロクマも愛していないのです</p>
</mt:If>


これを利用して、インデックステンプレートかカテゴリーテンプレートか、それとも記事テンプレートか・・・というような判別にも使える。各テンプレートの1行目などに仕込んでおくと超便利。下記の物はサンプルであるので、独自に名前を付けたり、インデックステンプレートが複数あるから名前を変えるなどもOK。


<$MTSetVar name="main_index" value="1"$>
<$MTSetVar name="category_index" value="1"$>
<$MTSetVar name="entry_archive" value="1"$>
<$MTSetVar name="page_archive" value="1"$>

そしてこれを分岐させる。


<mt:If name="main_index">
トップの時
<mt:ElseIf name="archive_index">
アーカイブ用インデックスの時
<mt:ElseIf name="entry_archive">
エントリーの時
<mt:ElseIf name="page_archive">
ウェブページの時
<mt:Elseif name="category_archive">
カテゴリの時
<mt:ElseIf name="datebased_archive">
月や年アーカイブの時
<mt:else>
その他
</mt:If>

MTの分岐もいろいろ面倒だが、分かりやすいと言えば分かりやすい。

追記。ループの回数でもいろいろできる模様。
例えば、記事を3個出すが、それぞれdivのクラスが違う場合とかに使える。



<MTEntries lastn="3">

<mt:If name="__counter__" eq="1">
            <div class="box1">
<mt:elseIf name="__counter__" eq="2">
            <div class="box2">
<mt:elseIf name="__counter__" eq="3">
            <div class="box3">
<mt:Else>           
</mt:If>

  <$mt:Include module="ブログ記事概要"$>
  </div>
</MTEntries>

incrementを使うことで増加する数値にも対応できるらしい。それについてはまだ必要ないかもしれないが。
これらで使える特殊変数はこんな物がある。

__first__
ループ出力の最初である場合 true (1) となります。

__last__
ループ出力の最後である場合 ture (1) となります。

__odd__
ループ出力の奇数回目の場合 ture (1) となります。

__even__
ループ出力の偶数回目の場合 ture (1) となります。

__index__
ループのインデックスを格納します。

__counter__
ループした回数を格納します。

カテゴリー
Movable type

[MT]記事ページで記事一覧を出す際、その一覧から当該記事を除外する(※基本形)

MTの記事ページに、記事一覧リストを吐き出して、その一覧から当該記事を表示させない場合のMTタグの使い回し方法の表記。
こういう面倒な事は分岐ーとかカスタムフィールドーとか考えちゃいますが、mt:Entriesのuniqueというモディファイアがあるので、こんなテストソースを書いた所、うまく行ったような感じ。


<mt:EntryID setvar="entryid">

<mt:Entries id="$entryid">
<mt:EntryTitle setvar="entrynow">
</mt:Entries>

<mt:Entries lastn="10" unique="1">
<li><mt:EntryTitle></li>
</mt:Entries>


まず、最初に表示している詳細記事のエントリーIDを取得し、setvarで代数へ。

そのエントリーIDの値を使って、その記事をmt:Entriesで呼び出す。これもsetvarで代数へ。

そして、uniqueを設定したmt:Entriesで記事リストを呼び出す。
現時点では、このリストの中に表示している記事のタイトルはないうえ、指定した件数が全部出ているのでまずは成功か。

このuniqueモディファイアは「その MTEntries ブロックタグは、同じテンプレート内で使用した MTEntries ブロックタグで出力した記事を除いて出力します。」というものなので、2番目のブロックでその記事を呼び出したことでこの条件に該当することになり、除外された。。。という仕組み。2番目のやつをsetvar指定したのは単に画面に表示させないようにするためだけなので、entrynowを使う予定は無し。

注意したいのは、このソースよりも前にmt:Entriesを使うような事をしてなければ、という感じか。

これは基本形。ここからさらに複雑になる実装を。これについては別エントリーで。