2009-08-05 11 views
31

Ho letto il libro "The Definitive Guide to Grails" (Rocher/Brown) e nel Capitolo 04, questa cosa misteriosa chiamata "layout" è appena apparsa senza spiegazione. (E non c'è un "layout" nell'indice.) Per quanto ne so, non viene mai spiegato.)In che modo Grails sa applicare un "layout" alle pagine che rende?

Come fa il sistema a "ereditare" le pagine da layout/main.gsp? Non c'è niente riguardo ai "layout" nell'indice, e sembra che sia appena apparso.

Sul loro applicazione di esempio, un semplice sito di vendita, i mapping di URL per la/home page dicono

"/"(controller:"store") 

e vuota "indice di" chiusura del controller negozio

package com.g2one.gtunes 

class StoreController { 

    def index = { 
    } 
} 

semplicemente dice di rendere negozio /index.gsp

Il negozio/index.gsp ha solo poche righe di HTML; senza il layout viene incluso in qualsiasi direttiva

<html> 
    <head> 
     <meta http-equiv="Content-type" content="text/html; charset=utf-8"> 
     <meta name="layout" content="main"> 
     <title>gTunes Store</title> 
     <g:javascript library="prototype"></g:javascript> 
    </head> 
    <body id="body"> 
     <h1>Your online music store and storage service!</h1> 
     <p>Manage your own library, browse music and purchase new tracks as they become available</p> 
    </body> 
</html> 

Quando eseguo il campione pagina indicata per "/" non è solo questo semplice HTML, è il contenuto di "layout/main.gsp" con queste informazioni magicamente inserita dentro.

Non vedo come le informazioni nel layout/main.gsp vengano applicate alla pagina, come gli elementi vengono mescolati insieme. Ho seguito il libro pagina per pagina e questa funzionalità è semplicemente "apparso" senza spiegazione.

risposta

47

Il tag <meta name="layout" content="main"> include il layout nella pagina gsp.

È possibile visualizzare il grails-app/views/layouts/main.gsp per visualizzare e modificare il layout. È possibile copiare main.gsp in mymain.gsp, modificarlo, quindi modificare la voce di layout nella pagina gsp per fare riferimento a mymain.gsp anziché main.gsp e provare a personalizzare il layout mantenendo la possibilità di annullare facilmente le modifiche.

Grail utilizza il sitemesh sotto le copertine (come se utilizza ibernazione e molla) per eseguire la visualizzazione dei layout. C'è anche un file di configurazione web-app/WEB-INF/sitemesh.xml nella directory del progetto. Questo particolare file non è così utile, ma fa riferimento a una classe nel progetto groovy se volevi capire in profondità come Grails sta usando sitemesh (questo probabilmente non è necessario).

+2

Grazie! Mi stava fissando in faccia. Non pensavo di guardare in un tag "meta" quando tutte le altre direttive Grails assomigliavano a

13

Ecco la tua direttiva:

<meta name="layout" content="main"> 

main.gsp contiene <g:layoutHead> e <g:layoutBody>, in cui il contenuto <head> e <body> del index.gsp sono piegati nel layout per creare la pagina finale.

5

Un trucco recente che sembra funzionare, se si assegna un nome al layout in modo che corrisponda al controller, appare (almeno in Grails 2.3.4) per utilizzare automaticamente quel modello.

Per esempio, il mio controller:

// grails-app/controllers/myapp/HomeController.groovy 
package myapp 
class HomeController { 
    def index() { 
     [ myvar: "Test" ] 
    } 
} 

mio layout:

// grails-app/views/layouts/home.gsp 
<html> 
    <head></head> 
    <body> 
    <h1>Home</h1> 
    <g:layoutBody /> 
    </body> 
</html> 

mio punto di vista:

// grails-app/views/home/index.gsp 
<p>${ myvar }</p> 

rende utilizzando il layout di casa.

Inoltre, è possibile specificare un layout per tutte le vostre azioni in un controller come questo:

class HomeController { 
    static layout = "someotherlayout" 

    // actions will render using grails-app/views/layouts/someotherlayout.gsp 
} 
+0

Grazie per il suggerimento! Sono stato morso da questo quando una gsp caricata con AJAX è stata automaticamente avvolta. C'era un layout con il nome del controller. – EpicVoyage

Problemi correlati