2009-12-01 3 views
14

Grailsプロジェクトのメインレイアウトファイル(/layouts/main.gsp)でレンダリングされるナビゲーションテンプレート(/common/_navigation.gsp)があります。個々のビューファイルからある種の変数/パラメータ/ argをレイアウトに渡し、最終的にナビゲーションテンプレートに渡すにはどうしたらいいですか?私はちょうど私がページにいるときに、右のタブが強調表示されるようにしたい。レイアウトファイルから変数をgrailsテンプレートに渡すにはどうすればよいですか?

(我々はすでに我々が(同じコントローラに同じビューを指して別のタブ、異なるフィルタを持っているので。Grailsのナビゲーションプラグインを使用して試してみた)、それは分解します。)

+0

・リー、 私はここで見つけるソリューションを使用しようとしていた :http://blog.openmind.ws/2009/06/10/grails-layouts-with-sitemesh/ ここでは、パラメータタグを使用してページ名を宣言し、レイアウトのページプロパティでその名前を呼び出します。 しかし、そのページプロパティは私のために働いていませんでした。私はページプロパティがgrails 1.2m3ではうまく動作しないところを読んでいます。私はすでにm4に入っているので、頭痛の原因になるかもしれません。 –

答えて

20

私はこのパターンにすべての時間を行います。私の見解では、手動で、または私がレンダリングしているビューでパラメータタグを使用して、ページにプロパティをアタッチすることができます。 Grailsのユーザガイドには書かれていませんが、非常に便利です。

<parameter name="foo" value="bar" /> 

それから私は、pageProperty tagを使って、ページのプロパティにアクセスします。

<g:set var="activeNavItem" value="${pageProperty(name: 'page.foo')}"/> 

レイアウトは全く:-)

+0

私はすでにこのタグを使用していますが、私はそれがどこにも言及されていないことに驚きましたか?あなたは主題にいくつかの手がかりを持っていましたが、どうやってそれを見つけましたか? – PomCompot

+1

PomCompot:私は最初にそれについて長い時間前に知りました。私はソースコードを掘り起こして、実際にその作業がどこで行われているかを知る必要がありました。これは、より低いレベルのSitemeshマッピングです。 –

+1

パターンは次の場所にあります:SitemeshPreprocessor.java –

16

がちょうど例えばモデルパラメータ を使用して、この変数を処理する必要はありません: ビュー:

<g:render template="../path/template" model="[header:'test', headers:['a','b'], values:[['a':1,'b':2],['a':3,'b':4]] ]"/> 

_template:

<br/> 
    <h3>${header}</h3> 
    <table> 
     <thead> 
     <tr> 
      <g:each in ="${headers}" var="he"> 
      <th>${he}</th> 
      </g:each> 
     </tr> 
     </thead> 
     <tbody> 
     <g:each in ="${values}" var="v"> 
       <tr> 
       <g:each in ="${headers}" var="h"> 
        <td>${v[h]}</td> 
       </g:each> 
       </tr> 
      </g:each> 
     </tbody> 
    </table> 
+1

これは、レイアウトまでではなく、テンプレートに変数を渡す方法にのみ答えます。しかし、これはテンプレートに渡す最もクリーンな方法です。 – Wonko

+0

@Wonkoなぜ誰かがメインテンプレートに変数を渡したいのですか? –

-3

私の読書に基づいて、私はその良い練習ではないと思う変数をレイアウトに渡します。モデル変数は、ビューからアクセスできます。私は、ページの構造を指定するためだけにレイアウトを使用する必要があり、ビューはコンテンツを埋め込むために使用する必要があると思います。

+0

正確ではないとされています。問題は、それが良いか悪い習慣かどうかではなく、どのようにこれを行うかです。質問のコメントに答えよりもよくフィットします。 – PomCompot

13

私は間違いなく簡単な方法を使用します。レイアウトを呼び出す前に、個々のビューでリクエストスコープで変数を定義するだけです。それは、それからちょうど変数を参照するには<g:render>

<g:set var="SOMEVARIABLE" value="SOMEVALUE" scope="request"/> 
<meta name="layout" content="yourlayout"> 

経由で呼び出されたレイアウトを含め、要求の中で使用されるすべてのテンプレートで利用できるようになり、あなたのレイアウトや他のテンプレート内の他のは、あなたのビューで引き込まうとして

${SOMEVARIABLE} or <g:if test="${SOMEVARIABLE}">, etc., etc 
+0

これはより一般的な解決策であり、このように、あらゆる種類の変数(配列、マップなど)を渡すことができます。 pagePropertyパターンは文字列でしか動作しないようです。セットタグがメタタグより前である(またはメタタグが存在する)ことは必須ではないことに注意してください。 – Wonko

0

私が好きなパターンは、次のようにpagePropertyを使用します。レイアウトでは、私はそうのようなpagePropertyを参照:

レイアウトGSP

<body id="${pageProperty(name: 'page.pageType')}"> 
    <g:render template="/layouts/header" /> 
    <g:layoutBody/> 
    <g:render template="/layouts/copyright" /> 
</div> 

...HTMLの結果の

ページGSP

<head> 
    <meta name="layout" content="main"/> 
    <parameter name="pageType" value="homePg" /> 
</head> 

:特定のGSPページ(私はそれがヘッド部の外に動作しなかったことが判明)の<head>セクション内で、私はそうのような値を宣言する

<body id="homePg"> 
    ... header, body and footer ... 
</body> 

また、私は同様にpagePropertyにコントローラモデルから値を注入することができる。

コントローラ

def index() { 
    model: [modelPageType: 'adminPg'] 
} 

(上記と同じレイアウトを使用して)レイアウトGSP

<body id="${pageProperty(name: 'page.pageType')}"> 
    <g:render template="/layouts/header" /> 
    <g:layoutBody/> 
    <g:render template="/layouts/copyright" /> 
</div> 

ページGSP

<head> 
    <meta name="layout" content="main"/> 
    <parameter name="pageType" value="${modelPageType}" /> 
</head> 

結果のHTML

<body id="adminPg"> 
    ... header, body and footer ... 
</body> 
関連する問題