2012-01-04 4 views
8

karmaşık tipini bağladığı: nasıl aşağıdaki yapıda bir model sınıf var play-çerçeve 2.0

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

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

Şimdi ben Çal sınıfına dayalı bir form olmasını istiyorum. Yani bir giriş olarak Form[Play] alır bir editPlay görünümü var. görünümünde Ben bir güncelleme eylemi çağıran bir form var gönderin:

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

ama ben denetleyicisi düzgün alırsınız şekilde kullanıcı alanını bağlamak doğru yolu bulamıyor:

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

API, Form.Field değerine göre, her zaman bir dizedir. Kullanıcı Nesnesine otomatik olarak giriş yapmak için başka bir yol var mı?

Teşekkür

+0

kontrolörde, sen isteyebilirsiniz yeni belgeleri kontrol etmek için. –

cevap

2

Sorunuzun oldukça emin anlamaya değilim, ama böyle temelde ben işleme edilmiş formları:

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

Ben hizmet etmek ve kullanan bir eylem şablonu işlemek:

Sonra şablonda
return ok(play_form_template.render(playForm)); 

:

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

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

Sanırım editPlay yönteminde (Play.class değil) form (Play.class) yazmalısınız. – yerlilbilgin

15

Sen play.scla.html olarak özel DataBinder yararlanabilirler:

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

sizin yöntemde Form sınıfı son zamanlarda biraz değişti

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

Kayıt çağrısını genel nesnelere veya benzer bir yere koymak mümkün mü, bu nedenle her denetleyicide bu boilerplate koduna gerek yoktur ? – nylund

+0

Evet, yapmalısınız. – kshep92

+1

Bu biçimlendiricinin çalışmasını istiyorsanız, Form.form (...) çağrılmadan önce Formatters.register (...) öğesini çağırmanız gerektiğini unutmayın. Sadece bunun yüzünden başım ağrıyordu. – Moebius