2013-06-24 3 views
6

Kohana (PHP 프레임 워크)에서 레이아웃은 Template_Controller를 통해 구현됩니다.이 템플릿 변수는 레이아웃 뷰로 사용되는 $ template이라는 멤버 변수를 계속합니다. 그런 다음 액션 메소드에서 $ 템플릿에 추가 하위보기 (일반적으로 컨텐츠보기)를 채울 수 있습니다. (http://forum.kohanaframework.org/discussion/3612/kohana-layout-system/p1)런타임에 레이아웃 템플릿 변경

이렇게하면 런타임의 레이아웃 "테마"를 변경할 수 있습니다. 세입자가 자신의 테마를 선택할 수있는 멀티 테넌트 시스템에 유용합니다. (2 열, 3 열 등)

스칼라 템플릿 엔진을 사용하여 2 스칼라에서 어떻게 달성 할 수 있습니까? 즉, 세입자가 선택할 수있는 여러 레이아웃 템플릿을 갖고 싶습니다. 그런 다음 컨트롤러는 레이아웃 템플릿과 작업 관련 컨텐츠 템플릿을 렌더링합니다. 같은

뭔가 (컨트롤러의 액션 의사) :

사용자를 기반으로
  1. , 레이아웃 테마 검색 (데이터베이스에 문자열에 저장된 이름을 매핑보기 파일을 해당했다).
  2. 작업 관련 콘텐츠 뷰를 렌더링합니다.
  3. (2)와 함께 (1)에서 얻은 렌더링 레이아웃보기.

참고 : 각 동작에 대해 레이아웃 테마는 사용자별로 변경 될 수 있지만 콘텐츠보기는 동일하게 유지됩니다. 그것에서

이 문서의 (http://www.playframework.com/documentation/2.1.1/ScalaTemplateUseCases)
컨텐츠 템플릿은, 말의 index.scala.html는 main.scala.html에 정의 된 주를 호출, 레이아웃 템플릿이 포함되어 있습니다. 즉, 하드 코딩되었으므로 index.scala.html은 main.scala.html과 밀접하게 결합되어 있습니다.

리플렉션을 사용하여 컨트롤러에서 main을 호출 한 다음 내용을 전달하는 것에 대해.

대안으로 Scalate와 같은 해석 된 템플릿 엔진을 사용하는 것이 좋습니다.

의견이 있으십니까?

답변

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/views에서 twocoldefault 패키지가 가정합니다. 당신은 옵션 1에서 알 수 있듯이

추가 댓글

는 index.scala.html 단단히 main.scala.html와 결합되지 않습니다. main에 대한 호출을 다른 템플릿이나 심지어 템플릿이없는 호출로 바꿀 수 있습니다.

FWIW, 옵션 1을 사용하면 더 나은 솔루션으로 발전 할 것입니다.