2

私は Play Framework にかなり慣れていないので、これがわかりやすいことを願っています。

フォーム要素をフォームのクラスのオブジェクト フィールドにマップするように play に指示するにはどうすればよいですか?

ORM からオブジェクトの名前をドロップダウンで選択するフォームがあります。ドロップダウン項目の値は、ORM オブジェクトの ID フィールドです。

Java側のフォームオブジェクトには、ORMオブジェクトのタイプのフィールドと、文字列を取得してオブジェクトに変換するセッターがありますが、フォーム送信時に、変換が無効であることを示すフォームエラー「無効な値」のみが表示されますまったく行われています。

私のテンプレートにはフォームコンポーネントがあります:

@helper.select(
    createAccountForm("industry"),
    helper.options(industries)
)

whereindustriesはテンプレート コンストラクターで : によって定義され、industries: Map[String, String] ID 文字列からユーザーが読み取り可能な名前で構成されます。

私のコントローラーはクラスを定義します:

public static class CreateAccountForm {
    public String name;
    public Industry industry;

    public void setIndustry(String industryId) {
        this.industry = Industry.getIndustry(Integer.parseInt(industryId));
    }
}

編集:この答えがそうするように指示されたので、私はクラスでセッターをしていましたが、それはうまくいきませんでした。

EDIT2:セッターメソッドは、これを行う方法ではなかったことがわかりました。アノテーションを機能させようとして頭を悩ませた後、Formatters.SimpleFormatter に気付き、それを試してみました。うまくいきましたが、その周りに余分なブロックが必要な理由はわかりません。

Global.java:

public class Global extends GlobalSettings {


// Yes, this block is necessary; no, I don't know why.
{
    Formatters.register(Industry.class, new Formatters.SimpleFormatter<Industry>() {

        @Override
        public Industry parse(String industryId, Locale locale) throws ParseException {
            return Industry.getIndustry(Integer.parseInt(industryId));
        }

        @Override
        public String print(Industry industry, Locale locale) {
            return industry.name;
        }
    });

}

}

4

1 に答える 1

0

ドキュメントで説明されているように、Play はフォームをオブジェクトにバインドします: https://github.com/playframework/Play20/wiki/JavaForms

したがって、コントローラーは次のようになります。

 Form<models.Task> taskForm = form(models.Task.class).bindFromRequest();
 if (taskForm.hasErrors()) {
     return badRequest(views.html.tasks.create.render(taskForm));
 }
 Task task = taskForm.get();

タスク オブジェクトには、Priorityオプション リストを含めることができます。そして、次のようなフォーム (ビュー) で使用します。

@select(editForm("priority.id"), options(Task.priorities),  'class -> "input-xlarge", '_label -> Messages("priority"), '_default -> Messages("make.choice"), 'showConstraints -> false, '_help -> "")

priorities.id選択した値を優先度 ID でバインドする必要があることを play に伝えるために を使用していることに注意してください。もちろん、タスクの優先度を取得します。

public static Map<String, String> priorities() {
    LinkedHashMap<String, String> prioritiesList = new LinkedHashMap<String, String>();
    List<Priority> priorities = Priority.getPrioritiesForTask("task");
    for (Priority orderPrio : priorities) {
        prioritiesList.put(orderPrio.getId().toString(), orderPrio.getDescription());
    }
    return prioritiesList;
}
于 2013-01-25T20:55:20.767 に答える