0

単純なオブジェクトを指定すると、保存を押して、オブジェクトを保存するために必要なすべてのデータ (ID を含む) が含まれていることを確認できる単純なフォームの例を教えてください。

ここにあるプレイを使用して

(これは単なるプレースホルダーなので、答えを投稿できます-フレームワークで機能する例を誰も好まないのはなぜですか?ため息)

4

1 に答える 1

0

それは私が望んでいたことはあまり明白ではありませんでした-私は、フォームの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())。

于 2016-12-31T17:18:29.787 に答える