libro
www.tuyano.com
初心者のためのPlay Framework入門

フォームヘルパーを活用しよう![Scala編] (5/5)

作成:2013-02-03 20:58
更新:2013-02-03 21:00

■Selectのmultipleによる複数選択

コントロールの利用の仕方はだいたい使ってみればわかると思いますが、1つだけ注意しておきたいのが「Select」です。

これは、普通に複数項目から1つを選ぶのであれば、その他のコントロールと同じ感覚で使うことができます。

が、複数項目を選択できるようにしたい場合、いろいろと修正しなければならない点があります。まず、ビューテンプレートのselectメソッドです。これは、
@helper.select( フォームの指定 , options = Helper.options( 表示項目の指定 ),
    'multiple -> "multiple")
このように、()内に'multiple -> "multiple"と追記することで、multiple属性が設定され、複数の項目が選択できるようになります。が! 修正はこれだけではありません。フォームの指定で、名前の後に[]をつけなければいけません。例えば、前回作成したselectを複数対応にする場合、
myForm("country") → myForm("country[]")
このように修正しておく必要があります。これを忘れると、値が正しく渡されなくなります。

これ以上に重要なのは、コントローラー側の処理です。ここでは、フォーム管理クラスとFormインスタンスを作成している部分のMapping内の記述を以下のように修正しておく必要があります。

・フォーム管理クラスの定義――「名前: List[String]」と指定する。
・FormのMapping内の定義――「名前 -> list(text)」と指定する。

これで、リストの値がStringからListへと変更されます。複数のテキストを持ったListとして値が用意されるようになるわけですね。

後は、コントローラーでの処理を必要に応じて調整すればいいでしょう。取り出される値はListになりますから、そこから順に値を取り出して処理すればいいでしょう。

下に、先ほどのサンプルで、選択リストを複数項目選択可能に変更したものを挙げておきます。ここでは単純にval msg = "data: " + dataとしてdataオブジェクトの値を出力させていますが、リストの値としてListオブジェクトに選択した項目の値がまとめられていることがよくわかるでしょう。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

●index.scala.htmlのselectメソッド部分

@helper.select(
    myForm("country[]"),
    options = helper.options(("JP","Japan"),("US","U.S.A"),("UK","UK"),("etc","Other")),
    '_default -> "-- Choose --",
    'multiple -> "multiple",
    'size -> "5",
    '_help -> ""
)


●Application.scalaのソースコード

package controllers

import play.api._
import play.api.mvc._
import play.api.data._
import play.api.data.Form
import play.api.data.Forms._

object Application extends Controller {
    
    case class MyFormData(
        check:Boolean, gender:String, country:List[String])
    
    val form1 = Form(
        mapping(
            "check" -> boolean,
            "gender" -> text,
            "country" -> list(text)
        )(MyFormData.apply)(MyFormData.unapply)
    )
    
    def index = Action {
        val title = "サンプルページ"
        val msg = "サンプルのページです。"
        Ok(views.html.index(title, msg, form1))
    }
    
    def sendform = Action { implicit request =>
        var myForm = form1.bindFromRequest
        val data: MyFormData = myForm.get
        val title = "サンプルページ"
        val msg = "data: " + data
        Ok(views.html.index(title, msg, myForm))
    }
}

※関連コンテンツ

「初心者のためのPlay Framework入門」に戻る