Under the Bridge

a Picture of the Late Him

変数専用モジュールで取得したカテゴリ情報配列をほかのモジュールで使用する

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

Movable Type 4.1用のコード。

変数専用モジュールで取得したカテゴリ情報配列をほかのモジュールで使用する機能を実験してみた。

昨日の「定数・変数専用のモジュールを使う」をより一歩進めてみた実験である。

やっていることは「カテゴリごとに表示形態を変える」下準備のようなもんだが、表示を変えるCSSをそれぞれ書いたり、インクルードする専用テンプレートを書いたりするのが大変(面倒)なので、そこまではやっていない。

準備

mdlVarという、変数の宣言専用に追加したモジュールへ、カテゴリ情報取得と代入のコードを書く。

以下のようなコードでいいだろう。


<$mt:setvar name="counter" value="0"$>
<MTCategories lastn="0">
<$mt:setvar name="counter" op="++"$>
<MTSetVar name="CatIndex[$counter]" value="$counter">
<MTSetVarBlock name="CatName[$counter]"><MTCategoryLabel></MTSetVarBlock>
<MTSetVarBlock name="CatTmpl[$counter]">CatTmpl<MTGetVar name="counter"></MTSetVarBlock>
</MTCategories>
<MTSetVarBlock name="CatN"><MTGetVar name="counter"></MTSetVarBlock>

上から一行ずつ解説すると

1行目:counter変数をゼロで初期化。

2行目:カテゴリループの開始。lastn="0"モデファイアは気にしなくていい。全部強制的にループさせるという意味で、lastn="999"のようなものである。

3行目:counter変数を+1インクリメントする。

4行目:カテゴリのインデックスを保持するCatIndex[]配列へカウンタ値(つまりcounter変数の値)を代入。

5行目:カテゴリの名前を保持するCatName「」配列へカテゴリ名を代入。

6行目:カテゴリのテンプレート名を生成。テンプレート名を保持するCatTmpl[]配列へ、"CatTmpl"という文字列とカウンタ値を繋げた文字列を生成。つまり”CatTmpl1”、”CatTmpl2”...という文字列を取得して代入する。

7行目:カテゴリループの終了。

8行目:counter変数の値をCatNという変数へ保持する。これはカテゴリ数である。このサンプルの場合配列を1から扱っているが、ゼロから扱うこともできる。配列を利用するとき、 MTGetVar name="CatName" function="count" というコードでもCatName配列の要素数を取得することは可能であるが、配列を1から扱っている場合はひとつ大きい数字が取得されるので注意のこと。なおわざわざカテゴリ数をCatN変数へ保持しているのは単なる実験目的である。

なお、このmdlVarという変数宣言専用のモジュールを、使用するテンプレートモジュールよりインクルードしておく。今回はエントリで使用するので、メインページ、ブログ記事リスト、ブログ記事よりインクルードすればいいかと思う。

そしてその配列をエントリ中で使用してみるコード

エントリ中でテストを行った。eval-templateプラグインが必要である。エントリへ以下コードを直接書いてポストする。


<MTGetVar name="CatName" function="count">
<MTGetVar name="CatN">
<MTSetVarBlock name="counter"><MTGetVar name="CatN"></MTSetVarBlock>
<mt:for var="x" from="1" to="$counter">
<MTGetVar name="CatName[$x]">
<MTGetVar name="CatIndex[$x]">
<MTGetVar name="CatTmpl[$x]">
<MTGetVar name="$x">
</mt:for>

上から一行ずつ解説すると

1行目:CatName配列より直接配列の要素数を求める場合はこのように記述する。このテストの環境は全カテゴリ数12個、エントリが存在するカテゴリ数が10個、空カテゴリが2個である。答えは10個であるが、配列のゼロからカウントしているようなので11という答えが返ってきた。

2行目:カテゴリ数を取得するとき使用したcounter変数をCatNに記憶していたが、これの取得。10という値が帰ってきた。

3行目:ここではCatNをそのまま用いずにcounter変数へ代入して使用している。ここのcounter変数はmdlVar内で使用したcounterを上書きすると考えられる。つまり、スコープがパブリックな変数の扱いには留意が必要であるということ。

4行目:forループの開始。1から$counter、つまり10回のループである。

5行目:カテゴリ名の配列 CatName[]配列を順番に取得する。

6行目:カテゴリインデックスの配列 CatIndex[]配列を順番に取得する。

7行目:カテゴリに対応するテンプレート名の配列 CatTmpl[]配列を順番に取得する。

8行目:forループのカウンタxの値をそのまま出力。

9行目:forループ終わり。

実験結果のスクリーンショット

20080102_01.gif

結果の考察

求める結果は取得できているようだ。

空のカテゴリは取得できていないようである。しかし実際の使途では空のカテゴリは想定していないのでこれでよいと思う。なお、空のカテゴリも取得したい場合は、mdlVarのMTCategoriesブロックタグへshow_empty="1"モデファイアをつけるといい(実験済み)。

この結果を用い、たとえばインデックスが2番と6番のカテゴリではそれに対応するテンプレートを適用する、という処理が容易になる。配列は種類を増やし、カテゴリへのリンク、専用の画像へのリンク、埋め込み広告へのリンク、そのカテゴリの運用者へのリンク、スタイルシートへのリンクなども生成しておけば、更にきめ細かい管理が可能となる。

トラックバック(0)

このブログ記事を参照しているブログ一覧: 変数専用モジュールで取得したカテゴリ情報配列をほかのモジュールで使用する

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

コメントする






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

parts

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

あわせて読みたい

なかのひと

2008年4月5日開催、MT4LP5

2008 yoshi(apstar)