Почтовый плагин Grails: абсолютный путь к просмотру - PullRequest
2 голосов
/ 01 сентября 2011

Мне нужно хранить свои шаблоны электронной почты в месте, которое можно редактировать без повторного развертывания приложения grails.Я ищу способ визуализировать эти шаблоны как представления для почтового плагина на основе абсолютного пути.В настоящее время как встроенный 'view', так и метод визуализации grails основаны на расположении grails-app / views.

ОБНОВЛЕНИЕ: сейчас я собираюсь использовать SimpleTemplateEngine и просто передать строку втело.Я все еще хотел бы знать, есть ли еще способ «грааля» для этого.

1 Ответ

1 голос
/ 02 сентября 2011

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

Вот что я попробовал в resources.groovy:

mailMessageContentRenderer(gregg.stackoverflow.CustomPathMailMessageContentRenderer) {
    groovyPagesTemplateEngine = ref('groovyPagesTemplateEngine')
    groovyPagesUriService = ref('groovyPagesUriService')
    grailsApplication = ref('grailsApplication')
}

Если вы просматриваете mail-plugin, то определены два bean-компонента mailMessageBuidlerFactory и mailMessageContentRenderer. Исходя из того, что сделали другие люди , я действительно ожидал, что это переопределит средство визуализации и позволит вам настроить поведение. Когда я включаю запись в журнал, чтобы увидеть класс mailService.mailMessageBuilderFactory.mailMessageContentRenderer, он настраивается так, что кажется, что проводка работает правильно. Я создал следующий пользовательский рендер:

    package gregg.stackoverflow

    import org.codehaus.groovy.grails.commons.ConfigurationHolder

    class CustomPathMailMessageContentRenderer extends grails.plugin.mail.MailMessageContentRenderer {


    @Override
    protected createTemplate(String templateName, String controllerName, String pluginName) {
        def gspOverride = ConfigurationHolder.config.mailtemplate.gsp.dir
        println "Custom one!"
        if (!gspOverride) {
            return super.createTemplate(templateName, controllerName, pluginName)
        }
        else {

            def contextPath = gspOverride + templateName +".gsp"

            def gspFile = new File(contextPath)

            def template = groovyPagesTemplateEngine.createTemplate(gspFile)

            if (!template) {
                if (pluginName) {
                    throw new IllegalArgumentException("Could not locate email view ${templateName} in plugin [$pluginName]")
                } else {
                    throw new IllegalArgumentException("Could not locate mail body ${templateName}. Is it in a plugin? If so you must pass the plugin name in the [plugin] variable")
                }
            }

            return template
        }
    }
}

Кроме того, я добавил свойство в Config.groovy, чтобы указать каталог GSP с именем mailtemplate.gsp.dir, который будет переключаться между функциональностью по умолчанию и пользовательским каталогом.

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

Upate

Ладно, потому что я заболел, как только начал работать с такими вещами, и могу долго жить на кофеине и без еды, я получил эту работу за ланчем ... вроде как, в большинстве случаев ...: -) Вы должны использовать представления GSP, но я не уверен, что шаблоны будут работать (я предполагаю, что включение шаблонов в ваши представления GSP также не будет работать). Так что sendMail звонки выглядят так:

mailService.sendMail {
        to "name@domain.tld"
        body (view:"/test", model:[name:"Chris"])
        // subject, from, etc still work
}

Итак, со всем приведенным выше кодом и строкой:

mailtemplate.gsp.dir=C:\\gsptest

и GSP с именем C:\gsptest\test.gsp Мне удалось успешно отправить электронное письмо из внешнего GSP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...