2010-04-07 9 views
5

Estoy creando un CMS como un ejercicio de aprendizaje en Grails y me gustaría dar a los administradores de contenido la capacidad de elegir entre diferentes estructuras de página HTML (por ejemplo, 2 columnas, 3 columnas, etc.).¿Pueden los diseños ser elegidos por los controladores Grails?

Grails Los diseños parecen ser una opción lógica, pero ¿es posible que un controlador Grails indique explícitamente qué diseño se utilizará para la representación? Idealmente, habría una opción layout para el método render, por Ruby on Rails, pero no veo nada igual.

Parece que podría ser posible utilizando el método applyLayout pasando el nombre del diseño, pero esto requiere que cada página GSP solicite explícitamente el diseño (sobrecarga molesta por página) en lugar de usar Layout by Convention.

¿Alguna idea?

Respuesta

3

No conozco una manera de hacerlo por acción, pero puede especificarlo en el nivel del controlador, p.

class FooController { 

    static layout = 'cms' 

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

Lo vi también pero lo necesito por acción, ya que el diseño será una cuenta de usuario específico. – maerics

5

¿Por qué no simplemente lo pasa en el modelo y lo muestra en la metaetiqueta que determina el diseño?

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

No lo he probado, pero creo que funcionaría.

+0

Esta solución funcionaría, pero me gustaría evitar escribir las repetitivas ' ...' envoltorios para cada vista. – maerics

2

Hey, yo creo que tengo una solución para usted: sólo tiene que utilizar idea de Ted Naleids en combinación con el afterInterceptor de su controlador:

foo.gsp:

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

FooController.groovy:

class FooController { 

    def index = { 
    // do awesome stuff 
    } 

    def afterInterceptor = { model -> 
    model.actionLayout = actionName} 
    } 
} 

Lo único que tienes que hacer ahora es nombrar tus diseños como tus acciones o crear alguna otra lógica de nombres.

+2

Grails hace algo similar fuera de la caja. Si todo lo que desea es un diseño basado en el controlador y el nombre de acción actuales, simplemente no puede tener una etiqueta de diseño meta y Grails buscará vistas/diseños/$ {controlador}/$ {acción} .gsp. Su sugerencia funcionaría si desea compartir el mismo diseño para cada acción del mismo nombre (por ejemplo, un diseño de lista). –

+0

Guau, no lo sabía, ¡gracias! – codeporn

2

Tal vez me esté perdiendo algo, pero ¿no podría ser fácilmente resuelto con un poco de amor taglib ...?

E.g.

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

que usar algo similar a esto para determinar qué ficha debe tener una clase "seleccionado" que se le aplica dentro de mis diseños. Esto me permite mantener todo mi html de navegación dentro del diseño sin dejar de resaltar. Un poco diferente de lo que está pidiendo, pero parece que podría (posiblemente?) seguir funcionando ...

Cuestiones relacionadas