数値のゼロ埋め
Movable Typeでは、カテゴリなどを並べ替える際にIDを利用すると、数値が文字列として評価されてしまい、並び順が意図したとおりにならないことが多々あります。
下記コードはカテゴリIDをキーに、カテゴリラベルをデータとしハッシュを生成、MTLoopで結果を並べるサンプルですが、MTLoopへsort_by="key"モデファイアを指定しても、カテゴリIDが1桁・2桁・3桁と混在すると、並び順が思うようにいかないです。これはMTLoopのsort_byモデファイアで並べ替えに用いられるキー(カテゴリID)が文字列で扱われているためです。
<MTCategories>
<MTSetvarBlock name="keyvalue"><$MTCategoryID$></MTSetvarBlock>
<MTSetvarBlock name="ShowCategory" key="$keyvalue"><$MTCategoryLabel$></MTSetvarBlock>
</MTCategories>
<MTLoop name="ShowCategory" sort_by="key">
<p><$mt:getvar name="__key__"$> <$mt:getvar name="__value__"$></p>
</MTLoop>
1から20までのIDがある場合は、以下のように並びます。
- 1
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 2
- 20
- 3
- 4
- 5
- 6
- 7
- 8
- 9
これを改善するには、keyvalueキーへMTCategoryID取得・代入時にzero_pad="N"(Nは任意の桁数)としてゼロ埋め・桁あわせをするのが一番簡単です。こうすると、キーのIDが文字列評価されても正しく並べ替えされます。
<MTCategories>
<MTSetvarBlock name="keyvalue"><$MTCategoryID zero_pad="4"$></MTSetvarBlock>
<MTSetvarBlock name="ShowCategory" key="$keyvalue"><$MTCategoryLabel$></MTSetvarBlock>
</MTCategories>
<MTLoop name="ShowCategory" sort_by="key">
<p><$mt:getvar name="__key__"$> <$mt:getvar name="__value__"$></p>
</MTLoop>
1から20までのIDがある場合は、以下のように並びます。
- 0001
- 0002
- 0003
- 0004
- 0005
- 0006
- 0007
- 0008
- 0009
- 0010
- 0011
- 0012
- 0013
- 0014
- 0015
- 0016
- 0017
- 0018
- 0019
- 0020
- カテゴリ:Tips系