2010-04-07 6 views
5

Ich baue ein CMS als Lernübung in Grails und möchte den Inhaltsmanagern die Möglichkeit geben, zwischen verschiedenen HTML-Seitenstrukturen zu wählen (z.B. 2 Spalten, 3 Spalten usw.).Können Layouts von Grails Controllern ausgewählt werden?

Grails Layouts scheinen eine logische Wahl zu sein, aber ist es möglich, dass ein Grails-Controller explizit angibt, welches Layout für das Rendering verwendet wird? Idealerweise würde es eine layout Option für die Methode render per Ruby on Rails geben, aber ich sehe nichts dergleichen.

Es scheint so, als wäre es möglich, die Methode applyLayout zu verwenden, indem der Name des Layouts übergeben wird. Dies erfordert jedoch, dass jede GSP-Seite explizit das Layout (lästiger Overhead pro Seite) anfordert, anstatt Layout by Convention zu verwenden.

Irgendwelche Ideen?

Antwort

3

Ich kenne keine Möglichkeit, es pro Aktion zu tun, aber Sie können es auf der Controller-Ebene, z.

class FooController { 

    static layout = 'cms' 

    def index = {} 
    def foo = { ... } 
    def bar = { ... } 
} 
+0

Ich sah, dass man auch, aber ich brauche es per-Aktion, da das Layout Benutzerkonto sein wird Spezifisch. – maerics

5

Warum nicht einfach im Modell übergeben und im Meta-Tag gerendert werden, das das Layout bestimmt?

Ich habe es nicht versucht, aber ich denke, es würde funktionieren.

+0

Diese Lösung würde funktionieren, aber ich möchte vermeiden, die " ..." Wrapper für jede Ansicht einzugeben. – maerics

2

Hey, ich glaube, ich habe eine Lösung für Sie: Nur Ted verwenden Naleids Idee in Kombination mit dem afterInterceptor des Controllers:

foo.gsp:

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

FooController.groovy:

Das einzige, was Sie jetzt tun müssen, ist die Benennung Ihrer Layouts wie Ihre Aktionen oder die Erstellung einer anderen Benennungslogik.

+2

Grails macht etwas ähnliches aus der Box. Wenn Sie nur ein Layout verwenden möchten, das auf dem aktuellen Controller und Aktionsnamen basiert, können Sie einfach kein Meta-Layout-Tag haben und Grails sucht nach Ansichten/Layouts/$ {controller}/$ {action} .gsp. Ihr Vorschlag würde funktionieren, wenn Sie das gleiche Layout für jede Aktion mit demselben Namen teilen möchten (z. B. ein Listenlayout). –

+0

Wow, wusste das nicht - danke! – codeporn

2

Vielleicht vermisse ich etwas, aber könnte das nicht leicht mit einer kleinen taglib Liebe gelöst werden ...?

z.

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

Ich verwende etwas ähnliches, um zu bestimmen, auf welche Registerkarte eine "ausgewählte" Klasse in meinen Layouts angewendet werden soll. Dies erlaubt mir, alle meine Navigations-HTML im Layout zu behalten, während immer noch Hervorhebung. Ein bisschen anders als das, was Sie verlangen, aber es scheint, wie es könnte (möglicherweise?) immer noch arbeiten ...

Verwandte Themen