2014-04-13 82 views
4

根据我在模型中的数据,我无法设置具有选定值的重复字段。@复制对象的重复表单助手 - 播放框架

目前,我有我的用户模型:

@Required 
public String username; 

@ManyToMany 
public List<Stay> places; 

而且我住的模型:

@Required 
@ManyToOne 
public Place place; 

@Required 
@Formats.DateTime(pattern="yyyy-MM-dd") 
public Date startDate; 

@Required 
@Formats.DateTime(pattern="yyyy-MM-dd") 
public Date endDate; 

我的斯卡拉视图形式:

@(formUser: Form[User]) 
... 
    @repeat(formUser("places"), min = 1) { stayField => 
     <div id="groupLocationField"> 
     // Don't manage to reach User->Places->Place 
     @select(formUser("stayField.places"), options(Place.optionsTitle)) 
     @inputDate(formUser("stayField.startDate")) 
     @inputDate(formUser("stayField.endDate")) 
     </div> 
    } 

stayField是Form.Field型其中包含 Field(null,places[1],ArrayBuffer(),None,ArrayBuffer(),Some(Paris Mon Oct 29 00:00:00 CET 2018 Wed Jun 11 00:00:00 CEST 2014 null))

但似乎已将我的位置和日期转换为字符串。 @stayField包含我的Stay模型toString方法的值。

@stayField.value = Paris Mon Oct 29 00:00:00 CET 2018 Wed Jun 11 00:00:00 CEST 2014 
@stayField.value.productArity = 1 

回答

7

找到了解决办法:

@repeat(formUser("places"), min = 1) { stayField => 
     <div id="groupLocationField"> 
     @select(formUser(stayField.name.toString + ".place"), options(Place.optionsTitle)) 
     @inputDate(formUser(stayField.name.toString + ".startDate")) 
     @inputDate(formUser(stayField.name.toString + ".endDate")) 
     </div> 
    } 

stayField.name将显示地方[1],地方[2],等等...

注意,我不得不使用Place.optionsTitle代替我在其他@select字段中使用的经典Place.options。

public static Map<String,String> optionsTitle() { 
     LinkedHashMap<String,String> options = new LinkedHashMap<String,String>(); 
     for(Place c: Place.find.orderBy("title desc").findList()) { 
      options.put(c.title, c.title); 
     } 
     return options; 
    } 
    public static Map<String,String> options() { 
     LinkedHashMap<String,String> options = new LinkedHashMap<String,String>(); 
     for(Place c: Place.find.orderBy("title desc").findList()) { 
      options.put(c.id.toString(), c.title); 
     } 
     return options; 
    } 

编辑:其实我没有使用特定方法optionsTitle(),我忘了在指定地点ID我选择:

@select(formUser(stayField.name.toString + ".place"), options(Place.optionsTitle)) 

应该改为:

@select(formUser(stayField.name.toString + ".place.id"), options(Place.options)) 
+0

这个方法对'form.fill'和'bindFromRequest'有效吗? – lvarayut

+0

@LaVarayut是的,它的确如此。这是人们尝试实现这一目标的主要原因! :) – Martijn

1

在模板表单字段中的“选择”值应来自预填充形式中,辅助使用该值来确定作为选择标记的选项。

例如,这里是从我的一个项目中,用户实体编辑表单:

控制器:

def edit(id: Long) = authorizedAction(Administrator) { 
    Ok(views.html.user.edit(id, editUserForm.fill(User.findById(id).get))) 
} 

模板:

@(id: Long, userForm: Form[User]) 

@main("Edit User") { 
    <h2>Edit User</h2> 
    @helper.form(action = routes.UserController.update(id)) { 
    <fieldset> 
     <input type="hidden" name="id" value="@userForm("id").value" /> 
     @helper.inputText(userForm("name"), '_label -> "Name") 
     @helper.inputText(userForm("email"), '_label -> "Email Address") 
     @helper.select(userForm("permission"), 
      models.Permission.displayValues, 
      '_label -> "Permissions", '_default -> "-- Select --", 
      '_showConstraints -> false) 
    </fieldset> 
    // Submit button 
    } 
} 

现在,选择了“许可“将查看”userForm“属性”权限“来确定将哪个HTML选项标记为”选中“。

+0

感谢您的回答。我更新了我的问题以提供更具体的信息。我尝试填写名单。 – Mike