2014-04-16 1 views
5

Die Form muss ich muss so etwas umgehen:Wie ein Array Formularfeld mit Playframework scala binden

<label for="features_1"> 
    <input type="checkbox" id="features_1" name="features[]" value="4"> foo 
</label> 
<label for="features_2"> 
    <input type="checkbox" id="features_2" name="features[]" value="8"> bar 
</label> 

ich das Array wie diese

request.body.asFormUrlEncoded.get("features[]") 

bekommen kann, die mir gibt, wenn beide Titel sind List(4, 8)

ausgewählt Aber wenn ich versuche, dies in einer Form zu binden

case class MyFeatures(features: Seq[Long]) 

val myForm = Form (
    mapping(
     "features" -> seq(longNumber) 
    )(MyFeatures.apply)(MyFeatures.unapply) 
) 

ich immer eine leere Sequenz, das gleiche mit "Eigenschaften []"

EDIT

Das obige Beispiel funktioniert tatsächlich bekommen, war das Problem woanders. Bei der Bindung mit den Merkmalen Spiel übersetzt Funktion [0] = 4 und Funktionen [1] = 8, die dann in der Seq richtig gehandhabt wird (...) oder Liste (...) Mappings

+1

Können Sie ein bisschen mehr von dem umgebenden Code zeigen, wie, wie Sie das Formular aus dem Antrag binden. Gibt es auch keine Funktionen zum Anwenden/Auflösen auf myForm? –

+0

Ok, etwas ist fischig, entsprechend der Form binde code name [] Werte sollten zu name [0], name [1] erweitert werden ... Ich werde das ein bisschen mehr debuggen müssen. https://github.com/playframework/playframework/blob/2.2.x/framework/src/play/src/main/scala/play/api/data/Form.scala#L90 – Somatik

+0

Ok, mein Problem war total woanders Mit dem falschen Feldnamen in meinem Formular funktioniert das mitgelieferte Beispiel korrekt – Somatik

Antwort

6

Versuchen:

<label for="features_1"> 
    <input type="checkbox" id="features_1" name="features[0]" value="4"> foo 
</label> 
<label for="features_2"> 
    <input type="checkbox" id="features_2" name="features[1]" value="8"> bar 
</label> 

EDIT

Oder:

myForm.bind(myForm.bindFromRequest.data + ("features"-> request.body.asFormUrlEncoded.get("features[]"))).fold(
... 
) 

Dadurch werden alle anderen Felder aus Anfrage binden direkt, und dann, wenn es um Eigenschaften geht, sie gehen manuell hinzugefügt werden. Wenn Sie mehr Daten nicht binden müssen dann schreiben Sie einfach:

myForm.bind("features"-> request.body.asFormUrlEncoded.get("features[]")).fold(
... 
) 
+0

Danke für den Vorschlag, aber ich habe keine Kontrolle über die Formularerstellung und da play scheint diese inputCheckboxGroup zu haben Ich nehme an, es muss einen Weg geben, dies zu beheben backend side – Somatik

+0

Versuchen Sie, Ihr Formular mithilfe des Vorschlags zu binden, den ich in meiner Bearbeitung hinzugefügt habe. – Peter