Under the Bridge

a Picture of the Late Him

カテゴリごとの表示形態を変える(多カテゴリ対応)

2008年1月 3日 23:13 | Writer: yoshi | 記事本文 | コメント(0) | トラックバック(0)

Movable Type 4において、カテゴリごとの表示形態を変える方法を模索。MTIfを入れ子入れ子...にしてやっても動作はするんだろうが、それだと表示形態を変えたいカテゴリが10個ほどになると、もうソースも見たくなくなる。これを解決しつつ、なるべく簡単なコードを模索。

ちなみに実験ではMovable Type 4.1b2を用いた。バージョン4.01では試してはいないんだが、恐らくOKである。昨日のMTVarモジュールでの配列記憶などは行っておらず、「ブログ記事リスト」テンプレートへ直接記述する方式。

ブログ記事リスト(カテゴリ)の場合のサンプルコード

ブログ記事リストテンプレート内へ記述する。


<!-- カテゴリごとの表示形態を変える -->

<!-- 比較用のカテゴリ名を取得 -->
<MTIf name="category_archive">
    <MTSetVarBlock name="curValue"><MTCategoryLabel></MTSetVarBlock>
</MTIf>

<!-- インクルードファイル名の初期化 -->
<MTSetVar name="IncludeCatName" value="None">

<!-- 表示形態を変えたいカテゴリへインクルードファイル名を与える -->
<MTIf name="curValue" eq="210Movable Type">
    <MTSetVar name="IncludeCatName" value="Cattmpl1">
</MTIf>
<MTIf name="curValue" eq="211Movable Type4">
    <MTSetVar name="IncludeCatName" value="Cattmpl2">
</MTIf>
<MTIf name="curValue" eq="230クルマ">
    <MTSetVar name="IncludeCatName" value="Cattmpl3">
</MTIf>

<!-- カテゴリの構成 -->
<MTIf name="IncludeCatName" eq="None">
    <!-- デフォルトのカテゴリ(インクルードなし) -->
    <MTSetVarBlock name="ecount">
    <$MTBlogEntryCount$>
    </MTSetVarBlock>
    <MTEntries lastn="$ecount">
    <$MTInclude module="ブログ記事の概要"$>
    <$MTInclude module="タグ"$>
    </MTEntries>
<MTElse>
    <!-- インクルードファイルがセットされている場合はインクルード(ここに直接コードを書いてもいいかも) -->
    <MTIf name="IncludeCatName" eq="Cattmpl1">
        <$MTInclude module="Cattmpl1"$>
    </MTIf>
    <MTIf name="IncludeCatName" eq="Cattmpl2">
        <$MTInclude module="Cattmpl2"$>
    </MTIf>
    <MTIf name="IncludeCatName" eq="Cattmpl3">
        <$MTInclude module="Cattmpl3"$>
    </MTIf>
</MTIf>

解説

4~6行目:比較用のカテゴリ名をMTSetVarBlockで取得するのはよく用いられる手法である。この例でもcurValue変数へ現在のカテゴリ名を代入している。MTIf name="category_archive"は、再構築エラーとなったのでつけた。ウェブページではMTCategoryLabelというタグが使えないため。深い意味はない。

9行目:このサンプルでは、後に「インクルードファイル名が"None"であればモジュールのインクルードを行わず、デフォルトのコードを用いる」というMTIf文が登場する。先頭付近で初期化しておけば、次にMTIf(カテゴリがxxxxxだったらファイル名は何々)/MTIfですべてのカテゴリのファイル名設定が完了する。よくあるMTIf(カテゴリがxxxxxだったらファイル名は何々)MTElse(ファイル名はNone)/MTIfは、ちょっと冗長である。

12~20行目:特定のカテゴリ名のときにインクルードするファイル名を指定する。まったくのキメウチである。特色といえば、ただひとつのIncludeCatName変数へ、カテゴリ名によって違うテンプレート名が代入されるところである。つまり、先頭付近で、インクルードファイル名"None"で初期化されたIncludeCatName変数を、カテゴリによっては別のデータ(インクルードファイル名)で上書きするのである。

23行目:IncludeCatName変数へセットされているインクルードファイル名が”None"であれば、24~31行目のデフォルトのカテゴリコードがそのまま使用される。

32行目:IncludeCatName変数が"None"以外、つまり何かしらのテンプレートファイル名がセットされている場合には33~42行目が使用される。

33~42行目:MTIf文を並べ、インクルードされるファイルをMTIncludeでインクルードする。残念なことに、「MTInclude module=変数名」は駄目なようである。管理画面の右ツールバーのインクルードモジュールに「新規ファイル」、などと表示され、ファイルを準備していてもインクルードされない。これができれば、コードは大幅に減少し、シンプルになるんだが...。

結果と考察

3つのカテゴリで試してみた。結果、うまくいった。

問題はやはり「MTInclude module=変数名」ができないところである。そのため仕方なく、前半と後半へ渡り2箇所に同じようなコードを記述しているので、ソースは冗長であり、ちょっと気分がよろしくない。

しかしこの方式では「インクルードファイル名が"Null"でない」と「インクルードファイル名は"xxxxx"である」の2つのIfネストしか存在しない。なのでソースの見通しは、MTIfがいくつも入れ子となった(深いネスト)ものよりは、断然いいはずである。

ブログ記事(エントリ)の場合のコード

エントリページが「表示を変えたいカテゴリ」に属していて、そのエントリも表示を変えてしまいたい場合。以下のようなコードで簡単に実現できる(先のブログ記事リストのコードをちょっと改造すればいい)。インクルードファイル名はもちろんカテゴリ用のものと別にせねばいけない(当然か)。ブログ記事テンプレート内へ記述する。


<!-- カテゴリの表示形態を変える -->

<!-- 比較用のカテゴリ名を取得 -->
<MTSetVarBlock name="curValue"><MTEntryCategory></MTSetVarBlock>

<!-- インクルードファイル名の初期化 -->
<MTSetVar name="IncludeCatName" value="None">

<!-- 表示形態を変えたいカテゴリへインクルードファイル名を与える -->
<MTIf name="curValue" eq="210Movable Type">
    <MTSetVar name="IncludeCatName" value="Enttmpl1">
</MTIf>
<MTIf name="curValue" eq="211Movable Type4">
    <MTSetVar name="IncludeCatName" value="Enttmpl2">
</MTIf>
<MTIf name="curValue" eq="230クルマ">
    <MTSetVar name="IncludeCatName" value="Enttmpl3">
</MTIf>

<!-- カテゴリの構成 -->
<MTIf name="IncludeCatName" eq="None">
    <!-- デフォルトのカテゴリ(インクルードなし) -->
    <$MTInclude module="ブログ記事の詳細"$>
    <$MTInclude module="トラックバック"$>
    <$MTInclude module="コメント"$>
<MTElse>
    <!-- インクルードファイルがセットされている場合はインクルード(ここに直接コードを書いてもいいかも) -->
    <MTIf name="IncludeCatName" eq="Enttmpl1">
        <$MTInclude module="Enttmpl1"$>
    </MTIf>
    <MTIf name="IncludeCatName" eq="Enttmpl2">
        <$MTInclude module="Enttmpl2"$>
    </MTIf>
    <MTIf name="IncludeCatName" eq="Enttmpl3">
        <$MTInclude module="Enttmpl3"$>
    </MTIf>
</MTIf>

トラックバック(0)

このブログ記事を参照しているブログ一覧: カテゴリごとの表示形態を変える(多カテゴリ対応)

このブログ記事に対するトラックバックURL:

コメントする






Categories
Entries
Feed
スポンサードリンク

parts

フィードメーター - Under the Bridge

あわせて読みたい

なかのひと

2008年4月5日開催、MT4LP5

2008 yoshi(apstar)