6

Kohana (PHP フレームワーク) では、レイアウト ビューとして機能する $template というメンバー変数を継続する Template_Controller を介してレイアウトが実装されます。次に、アクション メソッドで $template に追加のサブビュー (通常はコンテンツ ビュー) を設定できます。( http://forum.kohanaframework.org/discussion/3612/kohana-layout-system/p1 )

これにより、ランタイムでレイアウトの「テーマ」を変更できます。テナントが独自のテーマ (2 列、3 列など) を選択できるマルチテナント システムに役立ちます。

Scalaテンプレートエンジンを使用して、playframework 2 Scalaでそれを達成するにはどうすればよいですか? つまり、テナントが選択できる複数のレイアウト テンプレートが必要です。次に、コントローラーは、レイアウト テンプレートとアクション固有のコンテンツ テンプレートをレンダリングします。

(コントローラーのアクションの疑似コード) のようなもの:

  1. ユーザーに基づいて、レイアウト テーマ (データベース内の文字列に格納された名前で、対応するマッピング ビュー ファイルがあります) を取得します。
  2. アクション固有のコンテンツ ビューをレンダリングします。
  3. (1)で取得したレイアウトビューを(2)とともにレンダリングします。

注: アクションごとに、レイアウト テーマはユーザーごとに変更される場合がありますが、コンテンツ ビューは同じままです。

そのドキュメント ( http://www.playframework.com/documentation/2.1.1/ScalaTemplateUseCases )
では、コンテンツ テンプレート、たとえば index.scala.html に、main.scala.html で定義されているメインへの呼び出しが含まれています。 、レイアウト テンプレート。つまり、ハードコーディングされているため、index.scala.html は main.scala.html と密接に結合されています。

リフレクションを使用してコントローラーからメインを呼び出し、コンテンツを渡すことについて考えました。

別の方法は、Scalate などの解釈されたテンプレート エンジンを使用することです。

なにか提案を?

4

1 に答える 1

2

あなたが求めていることを達成するための2つのオプションがあります。1 つ目は、テーマ パラメーターをテンプレートに渡し (つまり、呼び出されたテンプレートに使用するテーマ/レイアウトを伝えるもの)、そのパラメーターを使用して条件付きでレイアウト テンプレートを呼び出すことです。2 つ目は、選択したテーマに基づいて適切なビューを返すことで、コントローラー内の条件を処理することです。

オプション1

アクションでは、テンプレートに何らかの値を渡して、使用するテーマを示します。

def index = Action {
  Ok(views.html.index("two-col"))
}

次に、あなたindex.scala.htmlは次のようなことをします:

@(theme: String)

@content = {
  <h1>Action Specific Content</h1>
}

@if("two-col" eq theme) {
  @twoCol("title")(content)
} else {
  @main("title")(content)
}

twoCol.scala.htmlこれは、次のようなテンプレートがあることを期待します。

@(title: String)(content: Html)
<!DOCTYPE html>
<html>
  ...
  <body>
    <h1>Two Column</h1>
    @content
  </body>
</html>

注:暗黙のパラメーターを使用してテーマを渡すこともできます。このSO questionを参照してください。これにより、レンダリングごとに明示的にテンプレートを渡す必要がなくなります。

オプション 2

これは、コントローラーでは次のように単純ですが、ビュー テンプレートでさらに多くのコードの繰り返しが必要になる可能性があります。

def index = Action {
  var theme = ...
  ...
  if (theme eq 'tow-col') {
    Ok(views.html.twocol.index("two-col"))
  } else {
    Ok(views.html.default.index())
}

twocolこれは、 があるとdefaultパッケージがあることを前提と/app/viewsしていindex.scala.htmlます。

追加コメント

オプション 1 からわかるように、index.scala.html は main.scala.html と密結合していません。main の呼び出しを他のテンプレートの呼び出しに置き換えることも、テンプレートなしで置き換えることもできます。

FWIW、私はオプション1を使用しますが、それはより良い解決策に発展する可能性があります.

于 2013-07-23T20:44:47.423 に答える