我正在构建一个CMS作为Grails的学习练习,并希望内容管理员能够在不同的HTML页面结构之间进行选择(例如,2列,3列等)。
Grails Layouts似乎是一个合理的选择,但Grails控制器是否可以明确指出将用于渲染的布局?理想情况下,根据Ruby on Rails,layout
方法会有一个render
选项,但我看不到类似的东西。
似乎可以通过传递布局名称来使用applyLayout
方法,但是这需要每个GSP页面显式请求布局(令人讨厌的每页开销),而不是使用Layout by Convention
有什么想法吗?
答案 0 :(得分:5)
为什么不在模型中传递它并将其呈现在确定布局的元标记中?
<meta name="layout" content="${myValueFromController}"/>
我没有尝试过,但我认为它有效。
答案 1 :(得分:3)
我不知道如何按行动执行此操作,但您可以在控制器级别指定它,例如
class FooController {
static layout = 'cms'
def index = {}
def foo = { ... }
def bar = { ... }
}
答案 2 :(得分:2)
foo.gsp:
<meta name="layout" content="${actionLayout}" />
FooController.groovy:
class FooController {
def index = {
// do awesome stuff
}
def afterInterceptor = { model ->
model.actionLayout = actionName}
}
}
您现在唯一需要做的就是命名您的布局,例如您的操作或创建其他命名逻辑。
答案 3 :(得分:2)
也许我错过了一些东西,但是用一点taglib爱可以轻易解决这个问题吗?
E.g。
<g:if test="${controllerName == 'xyzController'}">
<meta name="layout" content="xyzLayout"/>
</g:if>
<g:else>
<meta name="layout" content="abcLayout"/>
</g:else>
我使用与此类似的东西来确定哪个选项卡应该在我的布局中应用了“选定”类。这允许我将所有导航html保留在布局中,同时仍然可以突出显示。有点不同于你所要求的,但似乎它可能(可能?)仍然有用......