2013-06-24 38 views
6

在Kohana(PHP框架)中,佈局是通過Template_Controller實現的,該模板繼承了名爲$ template的成員變量,該變量用作佈局視圖。 然後在操作方法中,您可以使用更多的子視圖(通常是內容視圖)填充$模板。 (http://forum.kohanaframework.org/discussion/3612/kohana-layout-system/p1在運行時更改佈局模板

這使我可以在運行時更改佈局「主題」。對於租戶可以選擇自己的主題(兩列,三列等)的多租戶系統非常有用。

如何在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。

有什麼建議嗎?

回答

2

我看到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()) 
} 

這假定有一個twocoldefault包在/app/views具有一個index.scala.html

附加評論

你可以從選項1講,i​​ndex.scala.html不緊密結合main.scala.html。您可以將呼叫替換爲任何其他模板的呼叫,甚至不需要模板。

FWIW,我會選擇1,它可能演變成更好的解決方案。