【问题标题】:Can layouts be chosen by Grails controllers?Grails 控制器可以选择布局吗?
【发布时间】:2011-02-05 11:18:47
【问题描述】:

我正在构建一个 CMS 作为 Grails 中的学习练习,并希望让内容管理员能够在不同的 HTML 页面结构(例如 2 列、3 列等)之间进行选择。

Grails 布局似乎是一个合乎逻辑的选择,但 Grails 控制器是否可以明确命名将用于渲染的布局?理想情况下,根据 Ruby on Rails,render 方法应该有一个 layout 选项,但我没有看到类似的东西。

似乎可以通过传递布局名称来使用applyLayout 方法,但这需要每个 GSP 页面显式请求布局(每页的烦人开销)而不是使用Layout by Convention

有什么想法吗?

【问题讨论】:

    标签: grails layout


    【解决方案1】:

    为什么不直接在模型中传递它,然后在决定布局的元标记中渲染它呢?

    <meta name="layout" content="${myValueFromController}"/>
    

    我没有尝试过,但我认为它会起作用。

    【讨论】:

    • 此解决方案可行,但我想避免为每个视图键入样板文件 &lt;html&gt;&lt;head&gt;... 包装器。
    【解决方案2】:

    我不知道按操作执行此操作的方法,但您可以在控制器级别指定它,例如

    class FooController {
    
       static layout = 'cms'
    
       def index = {}
       def foo = { ... }
       def bar = { ... }
    }
    

    【讨论】:

    • 我也看到了,但我需要每次操作,因为布局将是特定于用户帐户的。
    【解决方案3】:

    嘿,我想我有一个解决方案给你: 只需将 Ted Naleids 的想法与控制器的 afterInterceptor 结合使用即可:

    foo.gsp:

    <meta name="layout" content="${actionLayout}" />
    

    FooController.groovy:

    class FooController {
    
      def index = { 
        // do awesome stuff
      }
    
      def afterInterceptor = { model ->
        model.actionLayout = actionName}
      }
    }
    

    您现在唯一需要做的就是像操作一样命名布局或创建一些其他命名逻辑。

    【讨论】:

    • Grails 开箱即用地做了类似的事情。如果你想要的只是基于当前控制器和动作名称的布局,你可以没有元布局标签,grails 将查找视图/布局/${controller}/${action}.gsp。如果希望为同名的每个操作共享相同的布局(例如:列表布局),您的建议将有效。
    【解决方案4】:

    也许我遗漏了一些东西,但这不能用一点 taglib 的爱来轻松解决吗...?

    例如

    <g:if test="${controllerName == 'xyzController'}">
        <meta name="layout" content="xyzLayout"/>
    </g:if>
    <g:else>
        <meta name="layout" content="abcLayout"/>
    </g:else>
    

    我使用与此类似的方法来确定在我的布局中哪个选项卡应具有“选定”类。这使我可以将所有导航 html 保留在布局中,同时仍然突出显示。与您要求的有点不同,但它似乎(可能?)仍然有效......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多