2013-11-02 2 views
1

У меня есть разные типы html-писем, которые я хочу отправить своим пользователям, но каждый адрес электронной почты использует тот же макет (emailLayout.gsp). Мне нужно отправить эти письма (gsp) в строку, чтобы отправить их по электронной почте.Рендеринг gsp/view с макетом не работает

Используя этот код, это действительно работает, но мне нужно, чтобы он работал с методом groovyPageRenderer.render(), потому что мне нужно отправлять электронные письма в фильтр или службу grails (вышеприведенные 2 изложенных примеров не работают):

//def emailContent = groovyPageRenderer.render(view: '/email/emailConfirmation', model: [userInstance: userInstance]) 
    //def emailContent = g.render(view: "/email/emailConfirmation", model: [userInstance: userInstance]) 
    def emailContent = g.include(view: "email/emailConfirmation.gsp", model: [userInstance: userInstance]) 

Использование groovyPageRenderer не включает мой макет html, создается только содержимое emailConfirmation.gsp. Так что заголовок и нижний колонтитулы из моего emailLayout.gsp отсутствуют. Почему groovyPageRenderer.render() не отображает полный макет gsp WITH?

Благодарим за помощь!

ответ

6

Вот полезный пост об использовании groovyPageRenderer по mrhaki: http://mrhaki.blogspot.de/2012/03/grails-goodness-render-gsp-views-and.html

Это фактически демонстрирует использование с примером оказания подтверждения по электронной почте. В нем также указано, почему Sitemesh не работает.

Мы можем использовать теги из библиотек тегов в наших представлениях и шаблонах GSP. Макеты Sitemesh не могут использоваться. PageRenderer работает за пределами области запроса, что необходимо для макетов Sitemesh.

Так что, если вы не можете использовать Sitemesh, вам необходимо изменить свои шаблоны. Например, вы можете поместить макет в GSP emailConfirmation

<g:render template="/email/header" /> 
<g:render template="/email/emailConfirmation" /> 
<g:render template="/email/footer" /> 

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

<g:render template="/email/header" /> 
<g:render template="${templateName}" /> 
<g:render template="/email/footer" /> 

и передать фитинг модель от службы

def emailContent = groovyPageRenderer.render(view: '/email/mailLayout', model: [templateName: '/email/emailConfirmation', userInstance: userInstance]) 

Таким образом, вы можете повторно использовать макет для различных шаблонов электронных писем.

Или вы предоставляете содержание в качестве первого шага и передать его в шаблон

def confirmation = groovyPageRenderer.render(template: '/email/emailConfirmation', model: [userInstance: userInstance]) 
def emailContent = groovyPageRenderer.render(view: '/email/mailLayout', model: [content: confirmation]) 

где выводится

<g:render template="/email/header" /> 
${content} 
<g:render template="/email/footer" /> 
+0

Спасибо за ваш ответ! Это сработало для меня! :-) – whitenexx

Смежные вопросы