単純なオブジェクトを指定すると、保存を押して、オブジェクトを保存するために必要なすべてのデータ (ID を含む) が含まれていることを確認できる単純なフォームの例を教えてください。
ここにあるプレイを使用して
(これは単なるプレースホルダーなので、答えを投稿できます-フレームワークで機能する例を誰も好まないのはなぜですか?ため息)
単純なオブジェクトを指定すると、保存を押して、オブジェクトを保存するために必要なすべてのデータ (ID を含む) が含まれていることを確認できる単純なフォームの例を教えてください。
ここにあるプレイを使用して
(これは単なるプレースホルダーなので、答えを投稿できます-フレームワークで機能する例を誰も好まないのはなぜですか?ため息)
それは私が望んでいたことはあまり明白ではありませんでした-私は、フォームのIDをある種の隠しフィールドなどで「隠す」学校の出身です。
play-bootstrap コードベースにはそれを行うための気の利いた方法があるのかもしれませんが、私はそれをドキュメンテーションで見ませんでした.オブジェクト。
簡潔にするために、db コードは省略しました。
まず、データベースからモデルを取得するアクション (コントローラー クラス) を次に示します。私が使用しているバッキングモデルは、データベースが返すものと同じで、プライベートフィールドなどがあることに注意してください(つまり、単なる一般的な POJO です)。
public Result editLesson(int languageId){
Form<Language> languageForm = formFactory.form(Language.class);
try {
//here da is just how i get things from the database.
Language language = da.getLanguage(languageId);
languageForm = languageForm.fill(language);
} catch (SQLException e){ //SAD! }
return ok(editLesson.render(languageForm));
}
きちんとした。そのため、フォームを取得して、いくつかのページに表示するだけです。formFactory はコントローラーに魔法のように注入する必要があることに注意してください。次に、ページはどのように見えますか?
まあ、それは通常のテンプレートですが、次のとおりです。
私はこれを最初の行として持っています:@import b3.vertical.fieldConstructor
そして、私が持っているフォームを表示したい場所
@b3.form(routes.HomeController.saveLesson) {
@b3.hidden( "id", languageForm("id").value, 'attr -> false )
@b3.text( languageForm("name"), '_label -> "Title", 'placeholder -> "The Title" )
@b3.text( languageForm("description"), '_label -> "Description", 'placeholder -> "The Description" )
@b3.submit('class -> "btn btn-default"){ <span class="glyphicon glyphicon-ok"></span> Save }
}
オーケー、これでフォームができました - これはフォームにどこへ行くかを伝え (5 秒でルートを見ていきます)、編集可能なフィールドを配置します。ここで id フィールドを非表示に設定します。アクセス方法は私には直感的ではありませんでしたが、そこにあります。
私のルートファイルにはこれがあります:
GET /edit-lesson/:languageId controllers.HomeController.editLesson(languageId: Integer)
POST /save-lesson/ controllers.HomeController.saveLesson()
最初の行は、ページの編集を開始する方法です。2 行目は、編集したレッスンを保存する場所です。を使用しroutes.HomeController.saveLesson
て、保存レッスンを逆にポイントします。コントローラーの名前が Bob (ダム名) の場合は、代わりに を使用routes.Bob.saveLesson
してメソッドにリンクしsaveLesson
ます。
最後に、私の saveLesson コードは次のようになります (Bob ~ erm、HomeController 内)
public Result saveLesson(){
Form<Language> languageForm = formFactory.form(Language.class).bindFromRequest();
if (languageForm.hasErrors()){
return badRequest(editLesson.render(languageForm));
} else {
Language language = languageForm.get();
try {
da.saveLanguage(language);
return ok(share.render());
} catch (SQLException e){
//TODO: log this, but really we don't have much to do, do we?
return ok(e.getMessage());
}
}
}
Play ではデータ バインディングが台無しになっていることに注意.get()
してください - フォームにエラーがある場合、呼び出しは失敗します。そのため、コントローラーで何らかの理由でフォーム データの一部が必要な場合は、フォームにエラーがあるかどうかを確認する必要があります。しません、何でもします。そうであれば、フォーム オブジェクトで使用する必要があります。.field(String).value()
フォーム オブジェクトをバインディングに変換することはできません ( を介してget()
)。