Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Groovy & Grails > аналог <jsp:invoke fragment=""> в gsp


Автор: 4eJIoBekMoJIekyJIa 13.5.2011, 20:59
Всем, привет. Хочу создать тег, который в качестве параметра будет принимать кусок кода.
В JSP2.0 я могу сделать так:
<p:foo>
      <jsp:attribute name="attr">
            blahblahblah
            <p:bar paramt='${param}'/>
      </jsp:attribute>
</p:foo>

и в реализации тега p:foo добавить

<jsp:invoke fragment="attr" />

Подскажите, есть чтолибо подобное в Grails GSP?

Автор: emmanuil 24.5.2011, 10:25
В gsp есть шаблоны. Например, через <g:render ... />, <g:include ... />
[url=http://grails.org/doc/latest/guide/6.%20The%20Web%20Layer.html#6.2.3 Views and Templates]См. тут.[/url]

Автор: 4eJIoBekMoJIekyJIa 24.5.2011, 17:47
с помощью g:include того что я хочу добиться нельзя.

Похоже единственное решение это:
<g:set var="attr">
        blahblahblah
        <p:bar paramt='${param}'/>
</g:set>

<g:render template="foo" model="[attr: attr]"/>


_foo.gsp:

<p>in foo</p>
${attr}
<p>still inn foo</p>

Конечно не совсем то но все же

Автор: emmanuil 24.5.2011, 17:56
Через include, если нужно передать модель, то просто через контроллер рендер делать.
Цитата(4eJIoBekMoJIekyJIa @  24.5.2011,  15:47 Найти цитируемый пост)
Конечно не совсем то но все же 

Так ты напиши, что нужно? Зачем тебе set? Запихивать в переменную разметку, по мне это плохое решение. Лучше доп. шаблон сделать.

Автор: 4eJIoBekMoJIekyJIa 8.6.2011, 17:49
Цитата(emmanuil @  24.5.2011,  17:56 Найти цитируемый пост)
Через include, если нужно передать модель, то просто через контроллер рендер делать.


Не понимаю, поясни пожалуйста, как с помощью include я смогу передать разметку в созданный мной шаблон?


Цитата(emmanuil @  24.5.2011,  17:56 Найти цитируемый пост)
Так ты напиши, что нужно? 


Нужно создать шаблон foo в который я передам разметку как параметр и выведу ее.

Т.е если я на gsp странице вызову темплейт foo вот так:
Код

<g:foo>
    <my:param name="bar">
        <p>Hello World!</p>
    </my:param>
</g:foo>


и внутри моего шаблона foo я напишу

Код

Template said:
<my:invoke fragment="bar"/>



то в итоге получу страницу

Template said:
Hello World!


Автор: emmanuil 8.6.2011, 18:56
Через include:
Код

<g:include controller="book" action="get" />

А в контролере делаешь render(template: 'path_to_template', model: [par1, par2])
То же самое можно сделать через тег <g:render />, просто в контролере можно реализовать логику по подготовке модели, например.

Цитата(4eJIoBekMoJIekyJIa @  8.6.2011,  15:49 Найти цитируемый пост)
Нужно создать шаблон foo в который я передам разметку как параметр и выведу ее.

Вот я и спрашиваю зачем передавать разметку через переменную?! Может я чего не до понял...
Этот участок кода сделать шаблоном:
Код

<my:param name="bar">
    <p>Hello World!</p>
</my:param>

и потом в коде
Код

Template said:
<g:render template="path" />

и получишь то же самое.

Добавлено через 2 минуты и 22 секунды
А, чуть не упустил. Можно передавать название шаблона в другой шаблон и рендерить, если заранее не известен шаблон.

Автор: 4eJIoBekMoJIekyJIa 9.6.2011, 11:59
Цитата(emmanuil @  8.6.2011,  18:56 Найти цитируемый пост)
Вот я и спрашиваю зачем передавать разметку через переменную?! Может я чего не до понял...


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

Т.е я пишу

Код

<my:table params=...>
  <my:param name='controlColumnsHeader'>
     <th>control1</th><th>control2</th>
  </my:param>
  <my:param name='controlColumnsContent'>
    <td><input name='control1' .../></td>
    <td><input name='control2' .../></td>
  </my:param>
</my:table>


И в реализации тега:

Код

<table>
<tr>
  <th>..</th>
  ...
  <my:invoke fragment="controlColumnsHeader"/>
</tr>
<tr>
  <td>...</td>
  ...
  <my:invoke fragment="controlColumnsContent"/>
</tr>
</table>


И соответственно то что я передал как controlColumnsHeader подставляется в хедер таблицы, аналогично controlColumnsContent подставляется в тело таблицы.

Автор: emmanuil 12.6.2011, 15:43
Теперь понятно.
Может так - http://grails.org/doc/latest/guide/6.%20The%20Web%20Layer.html#6.2.5 Sitemesh Content Blocks?

Добавлено через 5 минут и 59 секунд
Еще можно подумать над реализацией самого тега в grails и там контролировать, что и когда рендерить.

Автор: emmanuil 12.6.2011, 16:04
Да. Блоки тут не подойдут наверное. Можно пошаманить над реализацией тега таблицы и там контролировать.
Еще можно попробовать реализовать на jsp и использовать в gsp - http://grails.org/doc/latest/guide/6.%20The%20Web%20Layer.html#6.3.6 Using JSP Tag Libraries.
Других вариантов не знаю.
Лучше, наверное, сделать свои шаблоны на каждый случай.

Автор: 4eJIoBekMoJIekyJIa 17.6.2011, 11:42
ясн, спасибо за ответ.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)