maki-o memo

制作に関する私的なメモです

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>

これで一応できましたが、毎度ながら無理矢理です;
タグに余分に内容を入力しないといけないって事で、どっちみちめんどいです。

あと、検証はあんまりしてません。


プロフィール

フロントエンドエンジニア

Tomokazu Makita

名古屋でフリーランスでWeb制作してます。 フロントエンドのことを主にやってます。
a-blog cmsを使用したサイト制作が得意です。
お仕事のご相談随時受付中。

雪山大すき。冬は雪山の合間に仕事します。
財布はいつも吹雪です。

エントリーリスト

タグ