2012-01-04 16 views
8

tengo una clase modelo en la siguiente estructura:Cómo enlazar tipos complejos en juego-marco 2.0

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

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

Ahora quiero tener un formulario basado en la clase de reproducción. Así que tengo una vista editPlay que toma Form[Play] como entrada. En la vista que tienen una forma que se llama una acción de actualización en enviar:

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

pero no puedo encontrar el camino correcto para unir el campo de usuario de una manera voy a recibir correctamente en el controlador:

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

Según el API, Form.Field el valor es siempre una cadena. ¿Hay alguna otra forma de vincular automáticamente una entrada al objeto de usuario?

Gracias

+0

La clase Form ha cambiado un poco recientemente, es posible que desee para verificar la nueva documentación. –

Respuesta

2

No estoy muy seguro de entender su pregunta, pero básicamente he estado manejando formas como esta:

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

que sirven y hacer que la plantilla a partir de una acción mediante:

return ok(play_form_template.render(playForm)); 

Luego, en la plantilla:

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

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

Creo que debes escribir form (Play.class) en el método editPlay (no Play.class) – yerlilbilgin

15

Puede hacer uso de la costumbre DataBinder En el play.scla.html:

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

en su método en el controlador

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

¿Es posible colocar la llamada de registro en el objeto global o en algún lugar similar para que no haya necesidad de este código repetitivo en cada controlador ? – nylund

+0

Sí, deberías. – kshep92

+1

Tenga en cuenta que debe llamar a Formatters.register (...) antes de llamar a Form.form (...). BindFromRequest() si desea que este formateador funcione. Solo tuve un dolor de cabeza por eso. – Moebius

Cuestiones relacionadas