2012-01-04 9 views
8

में जटिल प्रकार बाध्य करने के लिए मैं निम्नलिखित संरचना में एक मॉडल वर्ग है:कैसे नाटक के ढांचे 2.0

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

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

अब मैं प्ले वर्ग के आधार पर एक फार्म करना चाहते हैं। तो मेरे पास editPlay व्यू है जो इनपुट के रूप में Form[Play] लेता है। ध्यान में रखते हुए मैं एक रूप है जो पर एक अद्यतन कार्रवाई कॉल सबमिट करें:

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

लेकिन मैं मैं नियंत्रक में ठीक से यह प्राप्त करेंगे एक तरह से उपयोगकर्ता क्षेत्र बाध्य करने के लिए सही तरीके से नहीं मिल सकता है:

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

API के अनुसार, Form.Field मान हमेशा एक स्ट्रिंग होता है। उपयोगकर्ता ऑब्जेक्ट में इनपुट को स्वचालित रूप से बांधने का कोई अन्य तरीका है?

धन्यवाद

+0

फार्म वर्ग हाल ही में एक सा बदल गया है में अपने विधि में

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

, आप चाहते हो सकता है नए दस्तावेज की जांच करने के लिए। –

उत्तर

2

मैं नहीं काफी यकीन है कि मैं अपने प्रश्न समझ में हूँ, लेकिन इस तरह मूल रूप से मैं से निपटने की है रूपों:

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")) 
     ... 
} 
+0

मुझे लगता है कि आपको संपादन प्ले प्ले (प्ले.क्लास) में फॉर्म (प्ले.क्लास) लिखना चाहिए (Play.class नहीं) – yerlilbilgin

15

आप कस्टम DataBinder का उपयोग कर सकते play.scla.html में: नियंत्रक

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

क्या रजिस्टर कॉल को वैश्विक ऑब्जेक्ट में या कहीं भी समान रखना संभव है ताकि प्रत्येक नियंत्रक में इस बॉयलरप्लेट कोड की आवश्यकता न हो ? – nylund

+0

हां आपको चाहिए। – kshep92

+1

ध्यान दें कि, Form Formform (...) को कॉल करने से पहले आपको Formatters.register (...) को कॉल करना होगा। BindFromRequest() यदि आप इस फ़ॉर्मेटर को काम करना चाहते हैं। इसके कारण सिरदर्द था। – Moebius

संबंधित मुद्दे