2013-06-09 2 views
0

템플릿에 공통 상태가 전달되는 것과 관련하여 Play 프레임 워크를 이해하는 데 다소 일반적인 질문이 있습니다. 다음과 같이 널리 논의되는 주제입니다. http://jazzy.id.au/default/2012/10/26/passing_common_state_to_templates_in_play_framework.html 그래도 여전히 가장 좋은 방법은 무엇인지 잘 모르겠습니다. 저는 CakePHP 나 Django와 같은 스크립팅 언어 기반의 MVC 프레임 워크에 익숙합니다. 그래서이 문제는 절 중요하지 않습니다. 그래서, 기본적으로 두 가지 가능성이 있습니다 : 단지 스칼라와 함께 작동 템플릿에 암시 적 변수를 사용하여Play Framework에서 공통 상태 전달하기

  • 당신은 여전히 ​​모든 단일 템플릿에 그 변수를 선언해야!?
  • 데이터를 저장하기 위해 Http.Context 클래스를 사용하는 것이 더 많은 데이터를 전달하는 데 적합하지 않은 해킹처럼 보입니다. (내가 틀렸다면 나를 바로 잡으십시오.)

나는이 문제에 대해 두 가지 중요한 사용 사례가 있습니다. 첫 번째는 로그인 한 사용자 객체를 모든 곳에서 사용할 수있게하는 것입니다. Http.Context를 사용하면 쉽게 해결할 수 있습니다. 두 번째 것은 나를 위해 더 어렵습니다. 로그인 양식이나 일부 사용자 별 옵션을 표시하는 헤더가 있습니다. 따라서 템플릿에 if 조건이있어 사용자가 로그인했는지 확인합니다. 그러나 로그인 폼을 표시 할 때 컨트롤러에 생성 된 폼 개체가 필요합니다. 그래서 모든 사용자가 하나의 컨트롤러에 해당 객체를 생성하고 모든 단일 템플릿에 전달해야합니다. 사용자가 로그인하지 않은 상태에서 필요할 때만 필요합니다. Play 프레임 워크 제작자가 그런 의미인지 확인해야합니다.

나는 어떤 통찰력이나 충동에 대해 매우 기뻐할 것입니다. 감사합니다. .

답변

0

양식을 표시하려면 다른 서식 파일을 호출하는 대신 양식을 만들고 양식을 렌더링하는 메소드를 호출하면됩니다.

이 같은 사용자 정보 또는 형태로 표시 할 경우 예를 들어, 템플릿을 가질 수 있습니다

views/home.scala.html : 

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

사용자가 이미 로그인되어있는 경우를 그냥 (loggedInHeader.scala을 다른 템플릿을 렌더링,

app/controllers/Application.java : 

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

이 방법은 양식을 구성하고이 같은 템플릿을 사용하여 렌더링 :

를 다른 사람이 컨트롤러에 다른 방법을 호출 (하지만이 클래스의 모든 유형)에있을 수 있습니다)이 경우, .html 파일
views/loginFormHeader.scala.html : 

@(form: Form) 
... 

원하는 서식 파일 (주 레이아웃 템플릿의 이벤트)에서 @controllers.Application.loginFormHeader() 메서드를 호출 할 수 있으며 다른 곳에서는 Form 개체를 작성할 필요가 없습니다.

+0

감사합니다. 그 해결책은 저를 위해 아주 잘 작동합니다. 그러나 Play에서 컨트롤러 액션을 뷰에서 호출하는 것이 좋습니다. – linsenfips

+0

사실 그것은 컨트롤러 액션이 아닙니다 (액션은'Result'를 리턴하고 라우트 파일에서 선언됩니다, 여기서 우리는'Html'을 리턴합니다). 이 메소드는 컨트롤러가 아닌 클래스에 넣을 수 있습니다. 필자는 개인적으로 이런 종류의 것을 "구성 요소"라고 부릅니다 (Symfony 1.x에서이 패턴을 많이 사용했습니다 : http://symfony.com/legacy/doc/gentle-introduction/1_4/en/07- 인사이드 - 뷰 - 레이어 # chapter_07_sub_components). 이러한 종류의 코드를 실제 컨트롤러와 분리 할 전용 'Component' 클래스를 만드는 것이 좋습니다. – mguillermin

관련 문제