質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Play Framework 2

Play Framework 2はPlayのメジャーバージョンです。現代の web アプリケーション開発に必要なコンポーネント及び API を統合した生産性の高い Java と Scala の web アプリケーションフレームワークです。

Q&A

解決済

2回答

2718閲覧

【PlayFramework2.x】グルーピングされたradioボタンの値を取得する方法

Aipa

総合スコア43

Play Framework 2

Play Framework 2はPlayのメジャーバージョンです。現代の web アプリケーション開発に必要なコンポーネント及び API を統合した生産性の高い Java と Scala の web アプリケーションフレームワークです。

0グッド

0クリップ

投稿2016/04/24 03:03

いつもお世話になっております。

Playframework2.4で、複数同じnameのradioボタン値の取得について、値を配列で取得する方法をご教授頂きたいです。

お問い合わせフォームを用意しました。

内容は、ユーザー名とユーザーの得意なITジャンル(Java、Perl、ネットワーク、などなど)をradioボタンで選択してもらう。また、それを複数人入力してもらうという内容です。

html

1<div class="hogehoge-section"> 2 <div class="users-detail"> 3 <div class="user-name"> 4 <label>お問い合わせのお名前</label> 5 <input id="user-name-multiple" class="form-control" type="text" name="user.user_name.multiple" value="" required="required"> 6 </divL 7 <div class="user-radio"> 8 <label> 9 <input id="radio-multiple" class="form-control" type="radio" name="user.radio_multiple" value="0" required="required"> 10 <input id="radio-multiple" class="form-control" type="radio" name="user.radio_multiple" value="1" required="required"> 11 </label> 12 </div> 13 </div> 14 <!-- ↑の内容が入力する人数によって任意に増やすことができる --> 15</div>

↑のようなdom構造を用意されている追加ボタンを押すことで増やせるviewを作りました。

ここでお気づきのかたは気づくかなと思いますが、radioボタンのnameは同じnameだとすべてリンクしてしまいます。

つまり、入力1のユーザーを「Java」と選択した後に、入力2のユーザーを「Perl」と選択してしまうと入力1のradioボタンが未選択の状態になってしまいます。

http://mashi.hatenablog.com/entry/2013/01/02/165548

でもこれはHtmlの仕様であることは理解しています。そこで。

html

1<div class="hogehoge-section"> 2 <div class="users-detail"> 3 <div class="user-name"> 4 <label>お問い合わせのお名前</label> 5 <input id="user-name-multiple" class="form-control" type="text" name="user.user_name.multiple" value="" required="required"> 6 </divL 7 <div class="user-radio"> 8 <label> 9 <input id="radio-multiple" class="form-control" type="radio" name="user.radio_multiple[0]" value="0" required="required"> 10 <input id="radio-multiple" class="form-control" type="radio" name="user.radio_multiple[0]" value="1" required="required"> 11 </label> 12 </div> 13 </div> 14 <!-- ↑の内容が入力する人数によって任意に増やすことができる --> 15</div>

html

1<input ... name="user.radio_multiple[0]" value="1" required="required">

このようにグルーピング化すればいけると思いました。CakePHPとかだと似たような形式(name="data[User][0][radio_multiple]")でグルーピング化して渡せることができます。

しかし、レスポンスの中を確認すると配列では取得できずkeyがuser.radio_multiple[0]の文字列でセットされていました。

// debugした時の中身 "user.radio_multiple[0]" => ArrayBuffer(0) "user.radio_multiple[1]" => ArrayBuffer(1) // 本当はこうなってほしい "user.radio_multiple" => ArrayBuffer(0,1)

これはどうすれば良いでしょうか。

http://mashi.hatenablog.com/entry/2013/01/02/165548

こちらの方はnameの末尾が"[]"であれば、自動的に変換されると書いています。

何か前提が必要などヒントや回答を頂けますと助かります。お手数をおかけいますが、よろしくお願いいたしますm(_ _ )m

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

自己解決しましたので、メモします。

結論からいうと、複数グルーピングしたradioボタンの値取得を配列で取得することはできませんでした。
※できるかもしれませんが、ソース読んでもよくわかりませんでした。。。Scalaむずい

なので、こんな感じの実装を追加してみました。

java

1 /** 2 * リクエストパラメータから指定したKeyの値をStringで取得する 3 * 4 * @param map request().body().asFormUrlEncoded()で取得したMap 5 * @param k リクエストパラメータのKey 6 * @return 7 */ 8 public static String getParam(Map<String, String[]> map, String k) { 9 if (map.get(k) == null) { 10 return null; 11 } else { 12 return map.get(k)[0]; 13 } 14 } 15 16 /** 17 * リクエストパラメータから指定したKeyの値をStringで取得する 18 * 19 * @param request Httpリクエスト 20 * @param k パラメータのKey 21 * @return リクエストパラメータの値 22 */ 23 public static String getParam(Request request, String k) { 24 return getParam(request.body().asFormUrlEncoded(), k); 25 } 26 27 /** 28 * 登録できる利用同伴者数の最大 29 */ 30 public static final Integer MAX_JOIN_USER_COUNT = 8; 31 32 /** 33 * 指定回数のループで取得してListにして返す 34 * @return List<String> 35 */ 36 public static List<String> getRadioValueList(Request request, String key) { 37 List<String> resultList = new ArrayList<String>(); 38 for (Integer i = 0; i < MAX_JOIN_USER_COUNT; i++) { 39 String countKey = key + '.' + i.toString(); 40 String str = RequestUtils.getParam(request, countKey); 41 Option<String> strOptional = OptionUtil.apply(str); 42 String getString = strOptional.getOrElse(""); 43 if (0 < getString.length()) { 44 resultList.add(getString); 45 } 46 } 47 return resultList; 48 } 49 50 public static mainMethod(Request request) { 51 // ... 省略 52 List<String> multipleUserList = getRadioValueList(request, "user.radio_multiple"); 53 } 54 55// ... 省略 56} 57public class OptionUtil { 58 59 public static <A> F.Option<A> apply(A value) { 60 if(value != null) { 61 return F.Option.Some(value); 62 } else { 63 return F.Option.None(); 64 } 65 } 66// ... 省略 67}

view側は下記

html

1<div class="hogehoge-section"> 2 <div class="users-detail"> 3 <div class="user-name"> 4 <label>お問い合わせのお名前</label> 5 <input id="user-name-multiple" class="form-control" type="text" name="user.user_name.multiple" value="" required="required"> 6 </divL 7 <div class="user-radio"> 8 <label> 9 <input id="radio-multiple.0.1" class="form-control" type="radio" name="user.radio_multiple.0" value="0" required="required"> 10 <input id="radio-multiple.0.2" class="form-control" type="radio" name="user.radio_multiple.0" value="1" required="required"> 11 </label> 12 </div> 13 </div> 14 <div class="users-detail"> 15 <div class="user-name"> 16 <label>お問い合わせのお名前</label> 17 <input id="user-name-multiple" class="form-control" type="text" name="user.user_name.multiple" value="" required="required"> 18 </divL 19 <div class="user-radio"> 20 <label> 21 <input id="radio-multiple.1.1" class="form-control" type="radio" name="user.radio_multiple.1" value="0" required="required"> 22 <input id="radio-multiple.1.2" class="form-control" type="radio" name="user.radio_multiple.1" value="1" required="required"> 23 </label> 24 </div> 25 </div> 26</div>

とりあえず、これでやりたいことはできるようになりました。ただ、ご覧の通りradioのグルーピング数が動的ではないので、数が変更になると、そのたびにコードを変更しなければならいため、良いコードとはいえないかなと思います。

ただ、play.data.Form.javaを読んでみると、何かしら[]の文字列で判断してリクエストの値を操作しているのが見受けられるので、その辺をうまく理解して処理を追加したりすると、もう少しコードがよくなるかなと思いました(多分)

ありがとうございました。

投稿2016/05/07 06:47

編集2016/05/07 06:49
Aipa

総合スコア43

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

htmlの中にid="radio-multiple"が2つありますが、予期せぬ動作につながると思われます。

投稿2016/04/24 03:21

enokiyo

総合スコア78

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Aipa

2016/05/07 06:27

回答ありがとうございます! お返事が遅くなりすみません。 idが複数あるのは確かにまずいですね。こちらは修正しますー。 ありがとうございましたm(_ _ )m
enokiyo

2016/05/07 09:04

自分もアンケートを実装した時にユーザ一覧表示をだして一部クイック選択できるようにした時に同じような問題に遭遇したのですが、playのフォームヘルパー側のコードにnameにindexをつけるようなコードをオーバーライドして対応した記憶があります。 ただ記載されているURLみるとできそうな感じがしますね。 カエルが表紙のplayframeworkの本が出てます。自分は書籍版とkindle版と2冊買いました。 ネットで調べるより時間の節約になるかと思いますよ。
Aipa

2016/05/17 01:15

>自分もアンケートを実装した時にユーザ一覧表示をだして一部クイック選択できるようにし>た時に同じような問題に遭遇したのですが、playのフォームヘルパー側のコードにnameにi>ndexをつけるようなコードをオーバーライドして対応した記憶があります。 そうなんですねー。やっぱり自分で書く力をつけないとダメですね。 >カエルが表紙のplayframeworkの本が出てます。自分は書籍版とkindle版と2冊買いました。 >ネットで調べるより時間の節約になるかと思いますよ。 仰るとおりだと思います! ありがとうございました^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問