2010-04-17 5 views
4

Supposons que j'ai un extrait gsp stocké dans ma base de données. Comment puis-je le fusionner par programmation avec un modèle de données pour produire une chaîne.GSP rendu programme

Répondre

4

Le applicationContext d'une application Grails contient un haricot nommé

groovyPagesTemplateEngine 

Par défaut est une instance de GroovyPagesTemplateEngine. Donc, vous pouvez utiliser le code comme celui-ci dans votre contrôleur ou service:

class MyService/MyController { 
    def groovyPagesTemplateEngine 

    String renderGSPToString(String uri, Map model) { 
     groovyPagesTemplateEngine.createTemplate(uri).make(model).toString() 
    } 
} 

NB: cet extrait est pas vraiment pris à partir du code en cours d'exécution, il devrait simplement clarifier l'idée.

+0

En fait, je veux le « createTemplate » qui prend le texte GSP lui-même comme entrée, au lieu de l'uri d'un fichier. Mais c'est le chemin. Merci. – tuler

+1

si est dans une chaîne de code du modèle, pensez à utiliser la SimpleTemplateEngine http://groovy.codehaus.org/api/groovy/text/SimpleTemplateEngine.html –

0

J'ai trouvé un DIRTY (mais travailler) façon de rendre complexes hors ligne en utilisant GSP groovyPageRenderer avec scriptsource substitué. Dans ce cas, vous avez accès à toutes les syntaxes gsp y compris g:if etc ..

d'abord définir deux classes fictives:

class StringPageLocator extends GrailsConventionGroovyPageLocator { 
    GroovyPageScriptSource findViewByPath(String content) { 
     return new StringScriptSource(content) 
    } 
} 

class StringScriptSource implements GroovyPageScriptSource{ 

    String content 

    public StringScriptSource(String content) { 
     this.content=content 
    } 

    @Override String suggestedClassName() { "DummyName" } 
    @Override boolean isPublic() { true } 
    @Override String getScriptAsString() { return content } 
    @Override boolean isModified() { true } 
    @Override String getURI() { "DummyURI" } 
} 

Et vous pouvez alors l'utiliser comme tel:

def groovyPageLocator // Injected automaticaly to service/controller etc... 

groovyPageRenderer.groovyPageLocator=new StringPageLocator() 
String output=groovyPageRenderer.render(
    view:'Hello2 ${user} <g:if test="${test}">TRUE!!!</g:if>', 
    model:[user:'test user2',test:true] 

)

0

vous pouvez faire une méthode du contrôleur qui fait ce que vous voulez. Ensuite, vous aurez une API HTTP pour accomplir ce que vous voulez. Le modèle de la méthode du contrôleur aura une étiquette <g:render>, correctement paramétrée.