2011-06-14 2 views
2

임 : 주어진 페이지의 본문 내용 만 포함하려면 g : include를 사용할 수 있는지 궁금합니다. Grails g : 포함 할 수 있습니까?

다음과 같이 내가 메인 레이아웃 페이지가 말 :

<html> 
    <head> 
    <title>My start page</title> 
    <g:layoutHead> 
    </head> 
    <body> 
    <g:layoutBody> 
    </body> 
</html> 

을 다음 메인 페이지 (의 index.gsp)

<html> 
    <head> 
    <!-- main layout reference --> 
    <meta name="layout" content="main"/> 
    </head> 
    <body> 
    THIS IS MY INDEX BODY CONTENT WITH AN INCLUDE 
    <g:include controller="book" action="list"/> 
    <g:link controller="book" action="list">See the full list!</g:link> 
    </body> 
</html> 

그리고 마지막으로 책/목록 페이지를

<html> 
    <head> 
    <!-- main layout reference --> 
    <meta name="layout" content="main"/> 
    </head> 
    <body> 
    <table> 
    <g:each in="${books}"> 
     <tr> 
     <td>${it.author}</td> 
     <td>${it.title}</td> 
     <td>${it.price}</td> 
     </tr> 
    </g:each> 
    </table> 
    </body> 
</html> 

그래서 내가 원하는 것은 기본 페이지 (index.gsp)는 책/목록 페이지에 정의 된 테이블 만 포함한다는 것입니다. 그러나, 내가 이것을 시도하면 정의 된 전체 HTML (<html> 태그와 모두)을 포함합니다.

어떻게 든이 작업을 수행 할 수 있습니까? 나는 <g:include controller="book" action="list" view="someView.gsp"/>과 같은 것을 시도했지만 이것은 작동하지 않는다. 나는 "인덱스 컨트롤러"에 도서 목록 로직을 추가하지 않아도되고 싶다. 기존 컨트롤러를 재사용하고 싶다.

나는이 유스 케이스를 가지고있는 첫 번째 사람이 될 수 없다. 당신은 어떤 해결책을 제시 했습니까?

답변

6

applyLayout 태그를 사용할 수 있습니다. applyLayout으로 include 태그를 장식 한 후

<g:layoutBody/> 

을 그리고 : 간단히 단지와 함께 empty.gsp 레이아웃을 만들

<g:applyLayout name="empty"> 
    <g:include controller="book" action="list"/> 
</g:applyLayout> 

추가 참조를 위해 Grails guide에 대한 항목을 참조하십시오.

+0

이것은 정확히 내가 뭘 찾고 있었는지 고마워요. – netbrain

+0

이 여전히 올바른 방법입니다. – Nix

0

이것은 직접적으로 가능하지 않습니다. 아이디어는 g:include을 기반으로 맞춤 태그를 만드는 것입니다.이 맞춤 태그는 코드의 일부를 예 : xpath 표현식. 나는 이것이 어딘가에 이미 존재한다는 것을 모르고있다.

대안은 index.gsp에서 템플릿 g:render를 사용하는 template 참조로 책의 list.gsp의 신체 일부를 리팩토링하는 것입니다. 그러나 이것은 g : render가 컨트롤러를 호출하지 않기 때문에 index.gsp 컨텍스트에서 데이터 모델을 사용할 수 있어야한다는 것을 의미합니다.

사이드 노트 : g:include을 사용하는 경우 페이지 조각 캐싱에 springcache plugin을 사용하는 것이 좋습니다.

+0

스프링 캐시 플러그인은 내가 의도 한대로 작동하도록하려는 이유 중 하나이기도합니다. – netbrain

-1

네, 그렇지만 더 많은 레벨이 필요합니다. Grails 템플릿을보십시오. _books.gsp 포함 :

<table> 
    <g:each in="${books}"> 
     <tr> 
     <td>${it.author}</td> 
     <td>${it.title}</td> 
     <td>${it.price}</td> 
     </tr> 
    </g:each> 
    </table> 

그런 다음 색인은 다음과 같습니다 기본적으로, 당신은 템플릿 거라고

<html> 
    <head> 
    <!-- main layout reference --> 
    <meta name="layout" content="main"/> 
    </head> 
    <body> 
    THIS IS MY INDEX BODY CONTENT WITH AN INCLUDE 
    <g:render template="books"> 
    <g:link controller="book" action="list">See the full list!</g:link> 
    </body> 
</html> 

을 그리고 당신의 목록은 다음과 같습니다

<html> 
    <head> 
    <!-- main layout reference --> 
    <meta name="layout" content="main"/> 
    </head> 
    <body> 
    <g:render template="books" /> 
    </body> 
</html> 

(내 구문을 이 작업을 한 지 2 개월이 지났기 때문에 100 % 적합하지 않을 수도 있지만, 템플릿 뒤에있는 아이디어는 재사용이 가능하고 GSP 코드의 재사용이 가능하고 독자적으로 표시되지 않습니다.

+0

여기를 제외하고는 색인 컨텍스트에서 도서 목록을 가져야합니다. ( – netbrain

관련 문제