0

共通の状態をテンプレートに渡すことに関して、Play フレームワークを理解するという多かれ少なかれ一般的な質問があります。http://jazzy.id.au/default/2012/10/26/passing_common_state_to_templates_in_play_framework.htmlのように、広く議論されているトピック ですが、ベストプラクティスが何であるかはまだわかりません。私は CakePHP や Django などのスクリプト言語ベースの MVC フレームワークに精通しているので、この問題は私には関係ありませんでした。したがって、基本的に 2 つの可能性があります。

  • テンプレートで暗黙の変数を使用すると、Scala だけで動作しますが、すべてのテンプレートでその変数を宣言する必要があります!?
  • Http.Context クラスを使用してデータを保存します。これは、多くのデータを渡すのに適していないハックのように思えます。(間違っていたら訂正してください)

その問題には 2 つの重要な使用例があります。1 つ目は、ログイン ユーザー オブジェクトをどこでも使用できるようにすることです。これは、Http.Context で簡単に解決できます。2つ目は私にとってより難しいです。ログインフォームまたはユーザー固有のオプションを表示するヘッダーがあります。したがって、テンプレートにif条件があり、ユーザーがログインしているかどうかを確認します。しかし、ログインフォームを表示するときは、コントローラーでフォームオブジェクトを生成する必要があります。そのため、すべてのコントローラーでそのオブジェクトを生成し、すべてのテンプレートに渡す必要がありますが、ユーザーがログインしていないときに必要なだけです。それが Play フレームワークのメーカーからこのように意図されているかどうかは確かです。

洞察や衝動があればとてもうれしいです。ありがとう。

4

1 に答える 1

0

フォームを表示するには、別のテンプレートを呼び出す代わりに、フォームを作成してテンプレートをレンダリングするメソッドを呼び出すだけです。

たとえば、次のようなユーザー情報またはフォームを表示するテンプレートを作成できます。

views/home.scala.html :

...
@if(user.isLoggedIn()) {
  @loggedInHeader()
} else {
  @controllers.Application.loginFormHeader()
}
...

ユーザーがすでにログインしている場合は、別のテンプレート (この場合は loggedInHeader.scala.html) をレンダリングするだけです。それ以外の場合は、コントローラーで別のメソッドを呼び出します (ただし、任意のタイプのクラスで可能です)。

app/controllers/Application.java :

class Application extends Controller {
  ...
  public static Html loginFormHeader() {
    Form form = Form.form(...);
    return views.html.loginFormHeader.render(form);
  }
}

このメソッドはフォームを構築し、次のようなテンプレートを使用してレンダリングします:

views/loginFormHeader.scala.html :

@(form: Form)
...

必要な任意のテンプレート (メイン レイアウト テンプレートからのイベント) からメソッドを呼び出すことができ、@controllers.Application.loginFormHeader()他の場所で Form オブジェクトを構築する必要はありません。

于 2013-06-10T10:30:51.573 に答える