2013-06-24 8 views
6

Kohana(PHPフレームワーク)では、レイアウトは、テンプレートビューのテンプレートとして機能する$ templateと呼ばれるメンバ変数であるTemplate_Controllerによって実装されます。 アクションメソッドでは、$テンプレートにさらにサブビュー、通常はコンテンツビューを設定することができます。 (http://forum.kohanaframework.org/discussion/3612/kohana-layout-system/p1実行時のレイアウトテンプレートを変更する

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

スカラテンプレートエンジンを使用して、プレイフレームワーク2でどのように達成できますか? つまり、テナントが選択できる複数のレイアウトテンプレートが必要です。コントローラはレイアウトテンプレートとアクション固有のコンテンツテンプレートをレンダリングします。ユーザーに基づいて

  1. 、(名前はデータベース内の文字列に格納され、マッピング・ビュー・ファイルを対応している)レイアウトのテーマを取得:

    (コントローラのアクションの擬似コード)のようなものを。

  2. アクション固有のコンテンツビューをレンダリングします。
  3. (2)とともに(1)から得られたレンダリングレイアウトビュー。

注:アクションごとに、レイアウトテーマはユーザーごとに変更できますが、コンテンツビューは変更されません。それに

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

私はリフレクションを使用してコントローラからメインを呼び出してから、コンテンツを渡します。

代わりに、Scalateなどの解釈済みテンプレートエンジンを使用することもできます。

提案がありますか?

答えて

2

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

オプション1

あなたが使用するテーマを示すために、あなたのテンプレートにいくつかの値を渡すことになるでしょう。

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

その後にごindex.scala.htmlあなたはこのようなものだろう:

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

注:

@(theme: String) 

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

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

これは、のようなtwoCol.scala.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()) 
} 

これはindex.scala.htmlを持って/app/viewstwocoldefaultパッケージがある前提としています。

追加コメント

あなたはオプション1から言うことができるように、index.scala.htmlがしっかりmain.scala.htmlと結合されていません。 mainへの呼び出しを、他のテンプレートへの呼び出しで置き換えることも、テンプレートなしで呼び出してもかまいません。

FWIW、私はオプション1を使用し、より良い解決策に進化する可能性があります。

関連する問題