MTでアイテムの順序制御
MTで、画像のギャラリーのようなコンテンツを作る場合です。
画像の上限が決められていない場合、まず思いつくのが、エントリーにカスタムフィールド作って単純に回せば実現できます。
こんな感じ。
<ul>
<mt:Entries>
<mt:gazoAsset><li><img src="<$MTAssetURL$>" /></li></mt:gazoAsset>
</mt:Entries>
</ul>
でも、エントリーの内容が画像しか必要ない場合。
EntryBodyには何も情報を入れないので、内容を入力する必要がなく、入力しても何も反映されないという、いわゆる「死んだエリア」ができてしまいます。
MTはデフォルトではEntryBodyを消せないので、できたらこんな実装はしたくありません。CMSに不慣れなクライアントもきっと不思議に思います。
なので、とりあえずアイテムとして登録し、アイテムのタグに「gallery」と入力。
そして、それをタギングして出力します。
<ul>
<mt:Assets tag="gallery">
<li><img src="<$MTAssetURL$>" /></li>
</mt:Assets>
</ul>
これで、意図したアイテムは出力されます。
ただこれだと、アイテムの並び順が制御しにくいんです。
mt:Assetsにも、sort_byモディファイアはあるんですが、
- ファイル名
- アップロードしたユーザー
- アップロードした日時
でしか並べかえられません;
これだと順番かえる為だけに、削除して、アップロードしなおさないといけません。
そらめんどいだろ!ってことで、以下のように実装してみました。
アイテムのタグには、前述の「gallery」タグと、カンマ区切りで並べたい順番の数字を入力します。
例えば、「1,gallery」みたいな感じ。
<!-- タグにgalleryと入力されているアイテムで、且つ、数値(順番制御用)も入力されているものの中から、最大数($maxIndex)を求める -->
<$MTSetVar name="maxIndex" value="0"$>
<mt:Assets tag="gallery">
<mt:AssetTags><mt:If tag="TagName" like="/^[0-9]+$/"><$MTTagName setvar="curIndex"$></mt:If></mt:AssetTags>
<mt:If name="curIndex" gt="$maxIndex"><$MTSetVar name="maxIndex" value="$curIndex"$></mt:If>
</mt:Assets>
<!-- 求めた$maxIndexを、mt:Forでtoの値に設定し、1から順に$maxIndex分該当アイテムのURLを配列($pubAssetURL)に挿入していく -->
<$MTSetVar name="pubAssetURL" value=""$>
<mt:For var="i" from="1" to="$maxIndex">
<mt:SetVarBlock name="searchTags"><$MTVar name="__counter__"$> AND gallery</mt:SetVarBlock>
<mt:Assets tag="$searchTags" limit="1">
<mt:SetVarBlock name="push(pubAssetURL)"><$MTAssetURL$></mt:SetVarBlock>
</mt:Assets>
</mt:For>
<!-- できた配列を、mt:Loopで展開。 -->
<ul>
<mt:Loop name="pubAssetURL">
<li><img src="<$MTVar name="__value__"$>" /></li>
</mt:Loop>
</ul>
これで一応できましたが、毎度ながら無理矢理です;
タグに余分に内容を入力しないといけないって事で、どっちみちめんどいです。
あと、検証はあんまりしてません。
- tag
- CMS
- movableType
- tips