Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I pass a variable into grails template from a Layout file?

So I have a navigation template (/common/_navigation.gsp) that is getting rendered in the Grails projects main Layout file (/layouts/main.gsp). How do I pass some kind of variable/parameter/arg from the individual view files to layout and eventually into the navigation template? I just want the right tab to be highlighted when I'm on a page.

(We've already tried using the Grails Navigation Plugin. Since we have different tabs that point to the same controllers (same view, different filter) it breaks down.)

like image 623
Mikey Donuts Avatar asked Dec 01 '09 22:12

Mikey Donuts


5 Answers

I do this pattern all the time. In my view, I can attach a property to the page either manually or by using the parameter tag in the view that I'm rendering. Its not documented in the Grails user guide, but its super handy.

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

Then I would access the page property by using the pageProperty tag.

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

The layout doesn't need to handle this variable at all :-)

like image 65
Colin Harrington Avatar answered Nov 17 '22 03:11

Colin Harrington


just use the model parameter for Example: view:

<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>
like image 19
Umit Avatar answered Nov 17 '22 02:11

Umit


I use an arguably simpler method. Just define a variable at request scope in the individual view before you call your layout. It will be available in all templates used in the request, including the layout and any called via <g:render>

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

Then just reference the variable as you would any other in your layout or other templates pulled in by your view

${SOMEVARIABLE}  or <g:if test="${SOMEVARIABLE}">, etc., etc
like image 15
Peter Avatar answered Nov 17 '22 01:11

Peter


You'd need to use a page property: http://grails.org/doc/1.1.1/ref/Tags/pageProperty.html

Then pass it into the render tag using the model param.

cheers

Lee

like image 2
leebutts Avatar answered Nov 17 '22 02:11

leebutts


The pattern I like, uses the pageProperty as follows. In the layout, I reference the pageProperty like so:

The layout gsp

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

... and within the <head> section of the specific gsp page (I found that it did NOT work outside the head section), I declare the value like so:

The page gsp

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

Resulting HTML

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

In addition, I can inject a value from the controller model into pageProperty like so:

Controller

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

The layout gsp (using the same layout as above)

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

The page gsp

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

Resulting HTML

<body id="adminPg">
    ... header, body and footer ...
</body>
like image 1
TriumphST Avatar answered Nov 17 '22 03:11

TriumphST