grails应用程序中的CMS

grails应用程序中的CMS,grails,content-management-system,Grails,Content Management System,我试图在grails应用程序中构建一个非常简单的CMS功能。 基本上,我在这里尝试的是在一个字符串中有一个gsp,我想从这个字符串构建gsp 它可以工作,但生成的页面没有使用主布局进行装饰。 此外,在其他一些尝试中,我注意到传递给make方法的模型被忽略 我正在使用Grails2.0.1 谢谢 class HomeController { def groovyPagesTemplateEngine def cms() { def page = """<h

我试图在grails应用程序中构建一个非常简单的CMS功能。 基本上,我在这里尝试的是在一个字符串中有一个gsp,我想从这个字符串构建gsp

它可以工作,但生成的页面没有使用主布局进行装饰。 此外,在其他一些尝试中,我注意到传递给make方法的模型被忽略

我正在使用Grails2.0.1

谢谢

class HomeController {

    def groovyPagesTemplateEngine

    def cms() {
        def page = """<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta name="layout" content="main"/>
<title>CMS page using your application's main layout</title>
</head>
<body>
CMS page using your application's "main" layout.
</body>
</html>"""

        StringWriter sw = new StringWriter()
        PrintWriter pw = new PrintWriter(sw)

        groovyPagesTemplateEngine.createTemplate(page, "somepage.gsp").make([nome: "ciao"]).writeTo(pw)
        render sw
    }
class家庭控制器{
def groovyPagesTemplateEngine
defcms(){
def page=“”
使用应用程序主布局的CMS页面
CMS页面使用应用程序的“主”布局。
"""
StringWriter sw=新的StringWriter()
PrintWriter pw=新的PrintWriter(软件)
groovyPagesTemplateEngine.createTemplate(第页,“somepage.gsp”).make([nome:“ciao”]).writeTo(pw)
渲染软件
}

这不起作用,因为您实际上只是用字符串调用render

当调用sitemesh筛选器时,将应用布局。为了使其正常工作,必须将sitemesh装饰器应用于字符串

在构建类似功能时,我们所做的只是发送相关页面片段:

i、 e

Mytemplate.gsp

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta name="layout" content="${layout}"/>
${head}
</head>
<body>
${body}
</body>
</html>

这与您正在尝试的操作具有相同的效果,但添加了sitemesh(以及可能正确集成的插件).

你确定要试试这个吗?你见过Weceem吗?它与Grails的集成非常好……你是对的。我检查了它,但我想在这里实现的是让这个实验开始工作。与此同时,我会试试Weceem,因为我听到了很多好消息,我明白你的意思。但是在你的示例中,你可以调用render,因为你的模板是是否有一种方法可以使用字符串中的模板(例如来自数据库)调用render(以及sitemesh过滤器)还有装饰它?为了更深入的解释:我想把gsp存储在数据库中,我想用布局装饰来呈现它。到目前为止,这似乎已经不可能了…你可能可以。看看applyLayout标记的代码--你会看到还有对装饰器的额外调用。但是,你的装饰器链没有设置在t中您可能需要将渲染沿过滤器链向下移动(通过拦截器或过滤器)或者复制sitemesh筛选器的功能。我的解决方案为此提供了一个简单的解决方法。您的意思是在文件系统上有一个模板,并通过模型传入主体变量,从数据库或其他任何地方获取?您的解决方案不允许将taglib调用包含到主体中,因为它们没有被解释
render( template: 'MyTemplate', model:[ layout: 'layout', head: '...', body: '...' ] )