サムネイル画像エントリリストの改造(OK版)
サムネイル画像エントリリストの改造が、一応完了。
なおこれは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ソースには無駄な空白行がたくさん生成され、見た目はイマイチ。
- カテゴリ:211Movable Type4
トラックバック(0)
このブログ記事を参照しているブログ一覧: サムネイル画像エントリリストの改造(OK版)
このブログ記事に対するトラックバックURL:
- Categories
- Entries
-
- MT4:エントリ投稿画面をホゲる実験
- MT4LP5で得たもの
- MT4LP5に参加しました
- MT4.1:mtde.info 開設しました。
- Movable Type4で、かなり気に入っていること
- Movable Type4で、かなり気に入らないこと
- MT4.1:CustomEditorButton2 プラグイン
- MT4.1:「テンプレートの編集」画面のコードスニペットを拡張する
- MT4.1:自サイト・他サイトのFeed情報を取得してリスト化(続編)
- 日記(K0、mtde、MT)
- MT4.1:自サイト・他サイトのFeed情報を取得してリスト化
- ノープラグインでカテゴリーソート(MT4.1専用版)多分に反則
- 自サイト内の特定カテゴリのRSSを出力
- MT4.1:モジュール化(雑談ですが)
- MT4.1:カテゴリリストへ代表画像を付与する(Asset系)
- MT4.1:カテゴリリスト+エントリ全展開+エントリのAsset代表画像表示
- MT4.1:イメージの幅指定で高さを自動的に計算(Asset系)
- MT4.1:MTでサポートされない演算をJavaScript関数ライブラリ化する
- MT4.1:エントリと同じタグのついた他エントリをリストアップする(自エントリを強調表示・改良版)
- エントリと同じタグのついた他エントリをリストアップする(自エントリを強調表示)
- 最新記事で使用されているタグの最新5件を表示
- MT4.1:エントリリストへ、特定カテゴリ用画像をつける
- MT4LP5
- MT4.1で乱数を取得したい場合
- ★マークでエントリ数を示すエントリリストつきカレンダー
- 横型カレンダー(素ノーマル)
- ファンキーな横置きカレンダー
- サムネイル画像エントリリストの改造(MT4.1用)
- MT4.1 ついにリリース
- 日記
- MT4.1:変数2つでの演算 (2)
- MT4.1:テンプレートタグで100までの数から素数を求める
- MT4.1:変数2つでの演算
- 日記
- MT4.1:年度タイトルつき月別アーカイブ(4月で新年度切り替え)
- MT4.1:年タイトルつき月別アーカイブ(1月で新年切り替え)
- 全カテゴリからエントリを3件ずつ表示する。キメウチ禁止
- MT4.1:カテゴリの並べ替え+表示切り替え+現カテゴリ展開+強調表示つき(カスタムフィールド+ハッシュ変数)
- MT4.1:カテゴリの並べ替え+表示切り替え(カスタムフィールド+ハッシュ変数)
- MT4.1:カテゴリの並べ替え(カスタムフィールド+ハッシュ変数)
- 日記
- MT4.1:文字列を繋げる
- MT4.1:カテゴリの並べ替え(プラグイン使わず)
- エントリと同じタグのついた記事一覧をリストアップ(3)
- あるエントリの存在するカテゴリの、サブカテゴリ内のエントリを抽出する
- 配列に対するpopとshift
- MTのテンプレートタグでFizzBuzz。
- エントリと同じカテゴリ内のエントリ一覧取得
- MT4.1:Forループ(文字列の連結)
- MT4.1:Forループ(配列中より特定のデータのインデックスを取得)
- MT4.1:Forループ(配列の並びを逆にする)
- MT4.1:Loopループ(基本形)
- MT4.1:Forループ(基本形)
- MT4.1:配列サンプル(配列の先頭・末尾からデータ取得・削除)
- MT4.1:配列サンプル(特定カテゴリの全エントリのみを配列へ代入)
- MT4.1:配列サンプル(全カテゴリを配列へ代入)
- 外部ブログのRSSを自サイトへ読み込み
- 名無しコメントに対応する
- 複数カテゴリの最新情報5件(例2)
- 複数カテゴリの最新情報5件(例1)
- カテゴリごとの表示形態を変える(多カテゴリ対応)
- 特定のカテゴリの最新エントリ5件をメインページへ表示
- 変数専用モジュールで取得したカテゴリ情報配列をほかのモジュールで使用する
- 定数・変数専用のモジュールを使う
- タグ名の全取得、配列へセット、生成文字列連結
- カテゴリ名の全取得、配列へセットする
- サムネイル画像エントリリストの改造(さらにチューン)
- サムネイル画像エントリリストの改造(OK版)
- サムネイル画像エントリリストの改造
- MT4のコメントフォーム
- 配列使ってみたテスト
- ブログ記事投稿時のタグ・キーワードとか
- 実験記事:キーワードのつけ方と概要の書き方
- デザイン小変更
- MT4書籍購入
- MT4で日本語を用いたタグクラウドがおかしい・~が出ない問題点
- 小粋な本の購入
- ちょっと気づいたこと
- MTSetVarでクリッカブルマップ
- 画像サムネイルエントリリスト(改)
- MTGetVarによるアンカーリンク
- MT3>MT4バージョンアップ時不具合
- pageを用いたナビゲーションバー
- 画像の取り扱い
- MT3サイトをMT4サイトへコンバート
- 月別アーカイブのタイトルが0000年12月となる不具合
- MT4で、エントリが再構築されないとき
- MTGetVarで文字列置換
- エントリと同じタグのついた記事一覧をリストアップ(2)
- 同一カテゴリーに属するエントリ一覧
- Folderの親子関係を調べる
- FolderLabel・FolderDescription関係調査
- カテゴリ・エントリリスト(改)
- カテゴリ・エントリリスト
- folder調査用テンプレート(1)
- トップレベルのウェブページのみ抜き出す
- ドロップダウンタグリスト
- Feed情報調査用テンプレート
- MTEntryCreatedDate
- コメント調査用テンプレート
- カテゴリ数、エントリ数、ウェブページ数の取得
- strip_tagsモデファイア
- replaceモデファイア
- regex_replaceモデファイア
- count_paragraphsモデファイア
- count_charactersモデファイア
- catモデファイア
- count_wordsモデファイア
- MTAuthor関連調査
- 画像サムネイルエントリリスト
- MTAsset関連調査(2)
- MTAsset関連調査
- カテゴリ毎に表示を変えるには?
- 強調表示付きカテゴリリスト
- MT4ライセンス購入
- MT4:Webページで生成するグローバルナヴィゲーション
- MT4:エントリと同じタグのついた記事一覧をリストアップ
- MT4:テンプレート構想変更
- MT4:beta7の生成xhtmlコード解析、ほか
- MT4:うっかりやってはいけないこと
- MT4:スタイルシートの切り替え
- MT4:モジュール化成果
- MT4:モジュール化・アルファ(本文)エリアの改造
- MT4:モジュール化・システムテンプレート
- MT4:モジュール化・ウェブページ
- MT4:モジュール化・エントリアーカイブページ
- MT4:モジュール化・カテゴリアーカイブページ
- MT4:モジュール化・アルファ(本文)エリア
- MT4:エントリについて
- MT4:モジュール化・バナーエリア
- MT4:モジュール化・ヘッダコード
- MT4:モジュール化・モジュール名の命名規則
- MT4:モジュール化・基本形改造
- MT4:XML宣言モジュール
- MT4:モジュール化・基本形
- MT4:カテゴリソート(MTCategoryLabel remove_html="1")

コメントする