Grails g: включить это можно сделать? - PullRequest
2 голосов
/ 14 июня 2011

Мне интересно, можно ли использовать g: include для включения только содержимого тела данной страницы.

Скажите, что у меня есть главная страница макета следующим образом:

<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"/>, но это не работает. Я действительно хочу избежать необходимости добавлять логику списка книг в «контроллер индекса», я хочу повторно использовать свой существующий контроллер.

Я не могу быть первым человеком, имеющим этот сценарий использования, какие решения вы, ребята, придумали?

Ответы [ 3 ]

6 голосов
/ 14 июня 2011

Вы можете использовать тег applyLayout.Просто создайте макет empty.gsp только с:

<g:layoutBody/>

, а затем украсьте тег include с помощью applyLayout:

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

См. Запись в Grailsруководство для дальнейшего использования.

0 голосов
/ 14 июня 2011

Да, но вам нужен еще один уровень.Посмотрите на шаблоны 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>

(Мой синтаксис может быть не на 100% правильным, поскольку прошло уже пару месяцев с тех пор, как я это сделал, но идея шаблонов - это короткие, повторно используемые фрагменты кода GSP, которые не предназначены для отображения сами по себе.

0 голосов
/ 14 июня 2011

Это ИМХО напрямую не возможно.Идея заключалась бы в создании пользовательского тега на основе g:include, который удаляет части кода, например, с помощью выражения xpath.Я не знаю, что это уже где-то существует.

Альтернативой может быть реорганизация части тела list.gsp книги в шаблон и ссылка на этот шаблон из index.gsp с использованием g:render.Но это означает, что модель данных должна быть доступна в контексте index.gsp, поскольку g: render не вызывает контроллер.

Примечание: при использовании g:include рекомендуется использовать плагин springcache для кэширования фрагментов страницы.

...