@Repeat Form Helper со сложным объектом - Play Framework
Мне не удается получить повторяющееся поле с выбранным значением в соответствии с данными, которые у меня есть в моей модели.
В настоящее время я имею в моей модели пользователя:
@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;
Моя форма просмотра Scala:
@(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 содержит значение метода toString моей модели Stay.
@stayField.value = Paris Mon Oct 29 00:00:00 CET 2018 Wed Jun 11 00:00:00 CEST 2014
@stayField.value.productArity = 1
2 ответа
Нашел решение:
@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 вместо моих классических Place.options, которые я использую в своем другом поле @select.
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(), я забыл указать идентификатор места в моем выборе:
@select(formUser(stayField.name.toString + ".place"), options(Place.optionsTitle))
Должно стать:
@select(formUser(stayField.name.toString + ".place.id"), options(Place.options))
"Выбранное" значение в поле формы шаблона должно исходить из предварительно заполненной формы, помощник использует это значение, чтобы определить, какую опцию пометить как выбранную.
Например, вот форма редактирования для сущности User из одного из моих проектов:
контроллер:
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 пометить как "выбранный".