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