2010-04-07 13 views
5

Sto costruendo un CMS come un esercizio di apprendimento in Grails e vorrei dare content manager la possibilità di scegliere tra le diverse strutture di pagina HTML (per esempio 2 colonne, 3 colonne, ecc).I layout possono essere scelti dai controller Grails?

Grails Layout sembrare una scelta logica, ma è possibile che un controller Grails per citarne esplicitamente quale layout verrà utilizzato per il rendering? Idealmente ci sarebbe un layout opzione per il metodo render, per Ruby on Rails, ma non vedo nulla di simile.

Sembra che sia possibile utilizzare il metodo applyLayout passando il nome del layout ma questo richiede che ogni pagina GSP richieda esplicitamente il layout (fastidiosa overhead per pagina) anziché utilizzare Layout by Convention.

Qualche idea?

risposta

3

non so di un modo per farlo per-action, ma è possibile specificare che a livello di controller, per esempio

class FooController { 

    static layout = 'cms' 

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

L'ho visto anch'io ma ne ho bisogno per azione, dal momento che il layout sarà account utente specifica. – maerics

5

Perché non solo passarlo nel modello e renderlo visualizzato nel meta tag che determina il layout?

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

Non l'ho provato, ma penso che funzionerebbe.

+0

Questa soluzione funzionerebbe ma vorrei evitare di digitare il foglio di cucina ' ... wrapper' per ogni vista. – maerics

2

Ehi, io credo di avere una soluzione per voi: Basta usare Ted Naleids idea in combinazione con l'afterInterceptor del controller:

foo.gsp:

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

FooController.groovy:

class FooController { 

    def index = { 
    // do awesome stuff 
    } 

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

L'unica cosa che devi fare ora è nominare i tuoi layout come le tue azioni o creare qualche altra logica di denominazione.

+2

Grails fa qualcosa di simile fuori dalla scatola. Se tutto ciò che si desidera è un layout basato sul controller corrente e sul nome dell'azione, non si può avere un tag meta layout e Grails cercherà viste/layout/$ {controller}/$ {action} .gsp. Il tuo suggerimento avrebbe funzionato se il desiderio è stato quello di condividere lo stesso layout per ogni azione con lo stesso nome (es: un layout lista). –

+0

Wow, non lo sapevo - grazie! – codeporn

2

forse mi manca qualcosa, ma non poteva questo essere facilmente risolto con un po 'd'amore taglib ...?

E.g.

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

Io uso qualcosa di simile a questo per determinare a quale scheda deve essere applicata una classe "selezionata" all'interno dei miei layout. Ciò mi consente di mantenere tutto il mio html di navigazione all'interno del layout, pur continuando a evidenziare. Un po 'diverso da quello che stai chiedendo, ma sembra che potrebbe (forse?) ancora funzionare ...

Problemi correlati