2009-08-05 7 views
31

私は「Grailsへの決定的なガイド」(Rocher/Brown)と第04章で、説明のない「レイアウト」と呼ばれるこの神秘的なことをやってきました。 (インデックスに「レイアウト」はありません。私が知る限り、決して説明されていません)Grailsはレンダリングするページに「レイアウト」を適用する方法をどのように知っていますか?

システムはレイアウト/ main.gspからページを「継承する」ことをどのように知っていますか?インデックスには「レイアウト」はありません。ちょうど現れたようです。そのサンプルアプリ、簡単な店舗サイトで

、/ホームページのURLマッピングが

"/"(controller:"store") 

を言うと、ストアコントローラの空の「インデックス」閉鎖

package com.g2one.gtunes 

class StoreController { 

    def index = { 
    } 
} 

は、単純に店をレンダリングするよう指示します/index.gsp

store/index.gspには数行のHTMLしかありません。私は「/」で示されるページが、それは魔法のように挿入され、この情報を「レイアウト/ main.gsp」の内容はちょうどこの簡単なHTMLですされていないサンプルを実行すると何のレイアウトは任意の指示

<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> 

に含まれていませんますその中。

layout/main.gspの情報がどのようにページに適用されるのか、どのように要素がどのように混ざり合っているのか分かりません。私はページごとに本のページをたどってきましたが、この機能は説明なしで「登場」しました。ここで

答えて

47

<meta name="layout" content="main">タグには、gspページのレイアウトが含まれています。

grails-app/views/layouts/main.gspを表示して、レイアウトを表示および変更することができます。 main.gspmymain.gspにコピーして変更し、gspページのレイアウトエントリをmymain.gspの代わりにmain.gspの代わりに変更し、レイアウトをカスタマイズして変更を簡単に取り消すことができます。

Grailsは、レイアウトの表示に、(ハイバネートとスプリングを使用するような)カバーの下にsitemeshを使用します。プロジェクトディレクトリにはweb-app/WEB-INF/sitemesh.xml設定ファイルもあります。この特定のファイルは役に立ちませんが、grailsがどのようにsitemeshを使用しているかを深く理解したい場合はgroovyプロジェクトのクラスを参照します(これはおそらく必要ではないでしょう)。

+2

感謝を!それは私の顔を真っすぐ見つめていた。他の全てのgrailsディレクティブが

13

はあなたのディレクティブです:

​​3210

main.gspはindex.gspの<head><body>コンテンツは最終ページを作成するために、レイアウトに折り畳まれ<g:layoutHead><g:layoutBody>が含まれています。

5

最近のトリックがうまくいくように見えますが、あなたのコントローラに合うようにレイアウトを命名すると、Grails 2.3.4でそのテンプレートが自動的に使用されます。例えば

、私のコントローラ:

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

私のレイアウト:

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

私の見解:

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

は、ホームのレイアウトを使用してレンダリングします。

また、あなたは、このようなコントローラのすべてのあなたの行動のためのレイアウトを指定することができます。

class HomeController { 
    static layout = "someotherlayout" 

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

チップをありがとう!私はAJAXをロードしたgspが自動的にラップされたときにこれに噛まれました。コントローラ名のレイアウトがありました。 – EpicVoyage

関連する問題