2012-01-04 27 views
8

Tôi có một lớp mô hình trong cấu trúc sau:Làm thế nào để ràng buộc các loại phức tạp trong trận play-framework 2.0

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

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

Bây giờ tôi muốn có một hình thức dựa trên lớp Play. Vì vậy, tôi có chế độ xem editPlay chụp Form[Play] làm đầu vào. Trong giao diện Tôi có một hình thức trong đó kêu gọi một hành động cập nhật về nộp:

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

nhưng tôi không thể tìm ra đúng cách để ràng buộc các lĩnh vực sử dụng trong một cách mà tôi sẽ nhận được nó đúng cách trong bộ điều khiển:

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

Theo giá trị API, Form.Field luôn là một chuỗi. Có cách nào khác để tự động ràng buộc đầu vào cho đối tượng người dùng không?

Cảm ơn

+0

Lớp Mẫu đã thay đổi một chút thời gian gần đây, bạn có thể muốn để kiểm tra tài liệu mới. –

Trả lời

2

Tôi không khá chắc chắn tôi hiểu câu hỏi của bạn, nhưng hình thức về cơ bản tôi đã được xử lý như thế này:

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

tôi phục vụ và đưa ra các mẫu từ một hành động sử dụng:

return ok(play_form_template.render(playForm)); 

Sau đó, trong mẫu:

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

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

Tôi nghĩ bạn nên viết biểu mẫu (Play.class) trong phương thức editPlay (không phải Play.class) – yerlilbilgin

15

Bạn có thể sử dụng tùy chỉnh DataBinder Trong play.scla.html:

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

trong phương pháp của bạn trong bộ điều khiển

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

Có thể đặt cuộc gọi đăng ký trong đối tượng toàn cục hoặc một nơi nào đó tương tự như vậy không cần mã mã hóa này trong mọi bộ điều khiển ? – nylund

+0

Có bạn nên. – kshep92

+1

Lưu ý rằng, bạn phải gọi Formatters.register (...) trước khi bạn gọi Form.form (...). BindFromRequest() nếu bạn muốn trình định dạng này hoạt động. Chỉ cần có một nhức đầu vì điều đó. – Moebius

Các vấn đề liên quan