MovableType

PowerCMSで表示値と送信される値の違う複数選択のチェックボックスを作成する

More than 1 year has passed since last update.

何が問題か

MovableTypeProの法人向け拡張であるPowerCMSには、複数選択のチェックボックスがあります。
ラジオボタンならば、「01=北海道,02=青森県...」みたいに書けば、
<label><input type="radio" value="01" /> 北海道</label> みたいなものが作れますが、
複数選択のチェックボックスで同じことはできません。
普通に「北海道,青森県」のように書くと、<label><input type="checkbox" value="北海道" /> 北海道</label> みたいなものが出来ます。
実際に送信される値は「01」にしたいってこと、よくあると思います。そんなことを実現する方法はあるのでしょうか?

答え:スニペットを使う

自前でHTMLタグとMTMLタグを駆使してゴリゴリ書くしかありません。
私のほうで都道府県の複数チェックボックスを生成するサンプルを作りました。
以下の方法に従えば、期待しているものが作れます。まあPowerCMSの導入コストが高すぎるので役に立つかは未知数ですが…

  1. カスタムフィールド > 新規 で、システムオブジェクト:記事、種類:スニペットを選択
  2. オプションにname属性に入れたい値(例: prefectures)を入力して保存をクリック
  3. 既定値のところに以下の内容をコピペして保存をクリック
<mt:SetVar name="prefectures" value="北海道,青森県,岩手県,宮城県,秋田県,山形県,福島県,茨城県,栃木県,群馬県,埼玉県,千葉県,東京都,神奈川県,新潟県,富山県,石川県,福井県,山梨県,長野県,岐阜県,静岡県,愛知県,三重県,滋賀県,京都府,大阪府,兵庫県,奈良県,和歌山県,鳥取県,島根県,岡山県,広島県,山口県,徳島県,香川県,愛媛県,高知県,福岡県,佐賀県,長崎県,熊本県,大分県,宮崎県,鹿児島県,沖縄県">
<mt:Var name="prefectures" regex_replace="/[^,]/g","" cat="," count_characters="1" setvar="length">
<mt:For var="i" from="1" to="$length">
<mt:Var name="prefectures" regex_replace="/^([^,]+).*/","$1" setvar="value">
<mt:Var name="prefectures" regex_replace="/^([^,]+,?)(.*)/","$2" setvar="prefectures">
<label><input type="checkbox" name="prefectures" value="<mt:Var name="i" zero_pad="2">"<mt:loop name="prefectures_loop"><mt:if name="snippet_option" eq="$i">checked="checked"</mt:if></mt:loop>/><mt:Var name="value"></label>
</mt:For>
  1. 記事のところで表示オプションで該当のカスタムフィールドを表示

値の取得

<mt:Entries><mt:HogeHoge key="prefectures" /></mt:Entries>とかで取得できます。
カンマ区切りで "01,02,21,30,47" みたいな内容が取得できます。
あとはそれをPHPでexplodeするなりよしなに。

追記

上のやつだと、valueに01、02とかの連番しかできませんでした。
しかし、valueに任意の値を入れたいことも多いと思います。
それに対応したバージョンも作りました。Foreach的なことができたらこんなまどろっこしいことしなくていいんですけどね。。

<mt:SetVar name="categories" value="aaa=あああ,bbb=いいい,ccc=ううう">
<mt:Var name="categories" regex_replace="/[^,]/g","" cat="," count_characters="1" setvar="length">
<mt:For var="i" from="1" to="$length">
<mt:Var name="categories" regex_replace="/^([^,]+).*/","$1" setvar="value">
<mt:Var name="value" regex_replace="/^(.*?)=.*$/","$1" setvar="code">
<mt:Var name="value" regex_replace="/^.*?=(.*)$/","$1" setvar="name">
<mt:Var name="categories" regex_replace="/^([^,]+,?)(.*)/","$2" setvar="categories">
<label><input type="checkbox" name="categories" value="<mt:Var name="code">"<mt:loop name="categories_loop"><mt:if name="snippet_option" eq="$code">checked="checked"</mt:if></mt:loop>/><mt:Var name="name"></label>
</mt:For>