Как связать сложные типы в play-framework 2.0 - PullRequest
8 голосов
/ 04 января 2012

У меня есть класс модели в следующей структуре:

public class User {
   public String name;
   public Long id;
}

public class Play {
   public String name;
   public User user;
}

Теперь я хочу иметь форму, основанную на классе Play.Таким образом, у меня есть editPlay представление, которое принимает Form[Play] в качестве ввода.В представлении у меня есть форма, которая вызывает действие обновления при отправке:

@form (routes.PlayController.update()) 
{..}

, но я не могу найти правильный способ привязки пользовательского поля так, как я получу его должным образом в контроллере:

Form<Play> formPlay = form(Play.class).bindFromRequest();
Play playObj = formPlay.get();

Согласно API , значение Form.Field всегда является строкой.Есть ли другой способ автоматического связывания ввода с объектом пользователя?

Спасибо

Ответы [ 2 ]

15 голосов
/ 30 апреля 2012

Вы можете использовать пользовательские DataBinder В play.scla.html:

@form (routes.PlayController.update()) 
{
  <input type="hidden" name="user" id="user" value="@play.user.id"/>
}

в вашем методе в контроллере

public static Result update()
{
  // add a formatter which takes you field and convert it to the proper object
  // this will be called automatically when you call bindFromRequest()

  Formatters.register(User.class, new Formatters.SimpleFormatter<User>(){
    @Override
    public User parse(String input, Locale arg1) throws ParseException {
      // here I extract It from the DB
      User user = User.find.byId(new Long(input));
      return user;
    }

    @Override
    public String print(User user, Locale arg1) {
      return user.id.toString();
    }
  });
  Form<Play> formPlay = form(Play.class).bindFromRequest();
  Play playObj = formPlay.get();
}
2 голосов
/ 16 марта 2012

Я не совсем уверен, что понимаю ваш вопрос, но в основном я обрабатывал формы, подобные этой:

 final static Form<Play> playForm = form(Play.class);
 ...
 public static Result editPlay(){
     Form<Play> newPlayForm = form(User.class).bindFromRequest();
     Play newPlay = newPlayForm.get();
     ....    
 }

Я обслуживаю и отображаю шаблон из действия, используя:

return ok(play_form_template.render(playForm));

Тогда в шаблоне:

 @(playForm: Form[Play])
 @import helper._

 @helper.form(action = routes.Application.editPlay()) {
      @helper.inputText(playForm("name"))
      ...
 }
...