Подтвердить что ты не робот

Помощник формы Form Framework 2.0: от флажка до списка <String>

У меня есть модель, содержащая строку и список:

public String title;    
public List<String> topics;

В index.scala.html Я использую форму для добавления новых элементов:

@form(routes.Application.newPaper()) {
    @inputText(paperForm("title"))
    <input type="submit" value="Create">
    }

с простой строкой, это работает хорошо. Но я хотел бы показать флажки

@for(t <- topics) {
    <input type='checkbox' name='topic' [email protected]>@t <br>
}

а затем добавьте все отмеченные темы в List<String> topics; моего нового элемента. Как я могу обработать флажки в @form {...}?

4b9b3361

Ответ 1

Я использую Play! Framework 2.1.0, ниже это решение:

1. В шаблоне scala вы должны указать все флажки:

@form(action = routes.Application.newPaper()) {
   @inputText(paperForm("title"))

   @******* Indexed chekbox name *********@
   @for((t, index) <- topics.zipWithIndex) {
       <input type="checkbox" name="topics[@index]" value="@t">@t <br>
   }

   <input type="submit" value="Create">
}

2. Затем в вашем контроллере, в качестве действия для обработки формы submit, вы должны сделать что-то вроде этого:

public static Result newPaper() {
    // Bind submitted form value to your model, ex. Paper.java
    Form<Paper> paperForm = Form.form(Paper.class).bindFromRequest();
    Paper paper = paperForm.get();

    Logger.info("Title entered = " + paper.title);
    // Because in template we use indexed name, unchecked item are binded with null value
    paper.topics.removeAll(Collections.singleton(null)); // remove value for unchecked topic
    for (String t : paper.topics) {
       Logger.info("The topic is " + t);
    }
    Logger.info("Total topic selected = " + paper.topics.size());

    return redirect(routes.Application.index()); // redirect page
}

UPDATE

Это другая идея для решения. Ваш код флажка на шаблоне scala не изменен.

@for(t <- topics) {
    <input type='checkbox' name='topic' [email protected]>@t <br>
}

Итак, контроллер должен выглядеть следующим образом:

public static Result newPaper() {
    // Bind submitted form value to your model, ex. Paper.java
    Form<Paper> paperForm = Form.form(Paper.class).bindFromRequest();
    Paper paper = paperForm.get();

    // get request value from submitted form
    Map<String, String[]> map = request().body().asFormUrlEncoded();
    String[] checkedVal = map.get("topic"); // get selected topics

    // assign checked value to model
    paper.topics = Arrays.asList(checkedVal);

    // for debugging purpose
    for (String t : paper.topics) {
        Logger.info("The topic is " + t);
    }
    Logger.info("Total topic selected = " + paper.topics.size());

    return redirect(routes.Application.index()); // redirect page
} 

Надеюсь, что эта идея более элегантна..:)

Примечание. Я тоже тестировал на Play! Framework 2.1.1, и это работает для меня.