Under the Bridge

a Picture of the Late Him

サムネイル画像エントリリストの改造(OK版)

2007年12月30日 17:46 | Writer: yoshi | 記事本文 | コメント(0) | トラックバック(0)

サムネイル画像エントリリストの改造が、一応完了。

なおこれはMovable Type 4.1向けのコードであり、Movable Type 4.0では動作しない(と思う)。実験では2007年12月30日現在、Movable Type 4.1b2でテストを行っている。

これは、元祖はこちらである。ありがとうございます。

WingMemo:サムネイルリストからブログ記事(エントリー)にリンクを張る (MT4用)

これをもとに、

というテーマのもと、改造を行ってみた。

今までの自作コードの問題点

エントリ中の画像の枚数が複数になると、リスト画像の数が減る症状。あと、少々コードが難解である。頭の中でやりたいことは思い浮かび、フローに起こせる。が、もっとプログラムちっくなコードを書かねば実現できないことであり、これまでMovable Type 4.0のテンプレートタグではどうしようもないと思っていた。だがしかしMovable Type4.1では配列が扱える・ループが扱える・変数のインクリメントができるようであるので、可能性を覚え、いつかはやろうと思っていた。

新作のコード

以下。少ない。


<MTIfNonZero tag="AssetCount">
<$mt:setvar name="counter" value="0"$>
<dl>
<dt>Photos(Tune)</dt>
<dd>
<ul>
<MTEntries lastn="0">
<MTEntryAssets type="image" lastn="1">
    <MTIf name="counter" lt="10">
        <$mt:setvar name="counter" op="++"$>
        <MTSetVarBlock name="imagewidth"><$MTAssetProperty property="image_width"$></MTSetVarBlock>
        <MTSetVarBlock name="imageheight"><$MTAssetProperty property="image_height"$></MTSetVarBlock>
        <li class="item">
            <a href="<$MTEntryPermalink$>">
                <MTIf name="imagewidth" gt="$imageheight">
                    <img src="<$MTAssetThumbnailURL height="70"$>" alt="on <$MTAssetProperty property="description"$>:<$MTAssetProperty property="description"$>" title="on <$MTEntryTitle$> : <$MTAssetProperty property="description"$>" />
                <MTElse>
                    <img src="<$MTAssetThumbnailURL width="70"$>" alt="on <$MTAssetProperty property="description"$>:<$MTAssetProperty property="description"$>" title="on <$MTEntryTitle$> : <$MTAssetProperty property="description"$>" />
                </MTIf>
            </a>
        </li>
    </MTIf>
</MTEntryAssets>
</MTEntries>
</ul>
</dd>
</dl>
</MTIfNonZero>
</MTIf>

動作原理とキモになる部分を説明

このコードの動作原理はいたってシンプルだ。まずMTEntryAssetsで、画像の存在するエントリのみを抽出する。次にcounterという名前の変数を、MTEntriesループ中で10になるまで監視する。その二つの条件をクリアしたら、counter変数を+1インクリメントし、リストへ追加するだけである。エントリが10となったら、以後処理が行われず、ループ終了で勝手に終わる(できれば、エントリ数が10を越えた時点でElse条件分岐でExit For(ループの脱出)して無駄にループさせないようキッチリ作りたいのだが、MTExitForというテンプレートタグは無いと思うので略している。今のところ再構築の速度は速いので、まあ大きな問題ではない)。ちなみにこういうのは本業でよく使う。IfやElseがどんだけあるのさ?というネストの深い・長いコードは嫌いだ(苦手ではないんだが汚い)。

11行目から21行目まで、ここは上記の画像リストエントリの抽出判断とは関係が無い。その際に縦横比を70pxに調整するが、これはメインの処理とは完全に切り離して考えてよい。つまり何をやってもいい。リスト制御には関与しない。ここは、モジュール化もできなくは無いとは思う。が、ここで一度しか使用しない処理なんであえてこのままにしておく。無駄なモジュール化は必要が無い。

キモはcounter変数をループ前に $mt:setvar name="counter" value="0"$ と、一度初期化することである。これを行わないと正常に動かない(昨晩かなり嵌った)。昔のプログラミングでは、使用されている可能性のある変数は使用前に初期化することは基本的なことであった。変数をループで扱う前・正常動作しない場合はいちおう初期化をしたほうがいいかもということだろう。

動作サンプル

上記コードのテストサイトは下記。右サイドバーの「Photos」は今までのもの。サムネイル画像エントリリストが7個しか出てない不具合が見れる。「Photos(Tune)」が新作。リストはきちっと10個出ている。なおこのサイトは予告無く削除することがあります。

http://www.apstars.com/mt41b2/

仕様

画像が複数あるエントリの場合、最後の画像がリストへ追加される。エントリに画像はひとつしかないよ、という場合は特に問題は無いが。

あと、リストがdlだったり、インデントが適当で、いわば書きっぱなしの実験コードである。利用する方は適当に書き換えてください。

2007/12/31 追記:この部分の出力htmlソースには無駄な空白行がたくさん生成され、見た目はイマイチ。

トラックバック(0)

このブログ記事を参照しているブログ一覧: サムネイル画像エントリリストの改造(OK版)

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

コメントする






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

parts

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

あわせて読みたい

なかのひと

2008年4月5日開催、MT4LP5

2008 yoshi(apstar)