Bonjour,
Je début avec Play! et je me heurte à pas mal de choses. Notamment, ici, la récupération d'une collection.
Pour situer le contexte, j'ai un sondage qui propose plusieurs choix :
Le nombre de choix est inconnu et je génère à la volée les champs "qui vont bien" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 @Entity public class Poll extends Model { @Id public Long id; @Required public String title; public String description; @Valid public List<Choice> choices; }
J'aimerais récupérer ma collection de Choice mais le binding n'est pas aussi "automatique" que sur un objet simple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 @(poll: Poll, pollForm: Form[Poll])) @import helper._ @import helper.twitterBootstrap._ @choiceGroup(field: Field, className: String = "choice") = { <div class="@className"> <input name="label" placeholder="Choice"/> <a href="#" class="removeChoice btn btn-danger btn-mini"><i class="icon-white icon-remove-sign"></i> Remove</a> </div> } @main("Add choices") { <form method="post" action="/poll/addChoices/@poll.id"> <fieldset> <legend>Choices</legend> <div id="choices"> @repeat(pollForm("choices")) { choice => @choiceGroup(choice) } @** Keep an hidden block that will be used as template for Javascript copy code **@ @choiceGroup( pollForm("choices[x]"), className = "choice_template" ) <div class="manage"> <a class="addChoice btn btn-inverse btn-small">Add another choice</a> </div> </div> </fieldset> <div class="actions"> <input type="submit" class="btn btn-primary" value="Create" /> <a href="/" class="btn btn-link">Cancel</a> </div> </form> <script type="text/javascript" charset="utf-8"> $('.removeChoice').live('click', function(e) { $(this).parents('.choice').remove() renumber() }) $('.addChoice').live('click', function(e) { var template = $('.choice_template') template.before('<div class="choice">' + template.html() + '</div>') }) $('#form').submit(function() { $('.choice_template').remove() }) </script> }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 public static Result saveChoices(Long pollId) { Form<Poll> filledForm = pollForm.bindFromRequest(); Poll poll = filledForm.get(); PollService.saveChoices(pollId, poll.choices); return ok(index.render()); }Avez-vous un pointeur ou des suggestions pour faire ça "bien" ?[IllegalStateException: No value] : Poll = filledForm.get().choices;
Pour l'instant, j'utilise un Form<Poll> mais seule la collection m'intéresse réellement (le Poll est saisi à l'écran précédent).
J'ai honte de poser des questions comme ça mais je rame un peu avec le manque de doc (compréhensible) de cette version 2.
Merci et bonne journée !
Alban
Partager