技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

Playframework2.1.0 で ComboBox のテンプレートを使ってみる

無いかなーと思ってソースコード読んでて見つけた。
公式ドキュメントに乗ってない(まだ書いてないだけ?)のでこれはみんな難儀するだろうなーということで共有。

  • /play-2.1.0/framework/src/play/src/main/scala/views/helper

この辺開くとテンプレートヘルパーが色々おいてある。
で、意中のあの子は select.scala.html
中身を開くと

@**
 * Generate an HTML select.
 *
 * Example:
 * {{{
 * @select(field = myForm("isDone"), options = options("Yes","No"))
 * }}}
 *
 * @param field The form field.
 * @param args Set of extra attributes.
 * @param handler The field constructor.
 *@
@(field: play.api.data.Field, options: Seq[(String,String)], args: (Symbol,Any)*)(implicit handler: FieldConstructor, lang: play.api.i18n.Lang)

@input(field, args:_*) { (id, name, value, htmlArgs) =>
    <select id="@id" name="@name" @toHtmlArgs(htmlArgs)>
        @args.toMap.get('_default).map { defaultValue =>
            <option class="blank" value="">@defaultValue</option>
        }
        @options.map { v =>
            <option value="@v._1" @(if(value == Some(v._1)) "selected" else "")>@v._2</option>
        }
    </select>
}

見たまま。
第一引数にフィールド指定して、第二引数にToupleのSequence突っ込めばよい。

  val permissions = Seq(
    "admin"   -> "管理者うぇーい",
    "power"   -> "ユーザ",
    "default" -> "名無しの権兵衛"
  )

  val userForm = Form(
    touple(
      "accountName"  -> text.verifying(Constraints.nonEmpty),
      "passCode" -> text.verifying(Constraints.nonEmpty, Constraints.minLength(5)),
      "permitName" -> text,
      "userName" -> text.verifying(Constraints.nonEmpty, Constraints.minLength(5))
    )
  )

てな風に書いて

@helper.select(field=userForm("permitName"),options=permissions)

でコンボボックス化。