2009-12-01 9 views
14

Tengo una plantilla de navegación (/common/_navigation.gsp) que se muestra en el archivo de diseño principal de proyectos de Grails (/layouts/main.gsp). ¿Cómo paso algún tipo de variable/parámetro/arg de los archivos de vista individuales al diseño y finalmente a la plantilla de navegación? Solo quiero que se resalte la pestaña correcta cuando estoy en una página.¿Cómo paso una variable a la plantilla de Grails desde un archivo de diseño?

(Ya hemos intentado usar el plugin Grails navegación. Ya que tenemos diferentes pestañas que apuntan a los mismos controladores (misma vista, filtro diferente) se rompe.)

+0

Lee, yo estaba tratando de utilizar una solución que he encontrado aquí: http://blog.openmind.ws/2009/06/10/grails-layouts-with-sitemesh/ Donde declaro un nombre de página usando una etiqueta de parámetro y luego lo llamo en una propiedad de página en el diseño. Pero esa página no me funcionaba. Leí en algún lado que la propiedad de la página no funciona bien en Grails 1.2m3. Ya estoy en m4, así que podría ser lo que está causando mis dolores de cabeza. –

Respuesta

20

hago este patrón todo el tiempo. En mi opinión, puedo adjuntar una propiedad a la página de forma manual o mediante el uso de la etiqueta de parámetro en la vista que estoy representando. No está documentado en la guía del usuario de Grails, pero es súper útil.

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

continuación, me gustaría tener acceso a la propiedad de la página utilizando el pageProperty tag.

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

La disposición no necesita para manejar esta variable en absoluto :-)

+0

Ya uso esta etiqueta pero estoy sorprendido de no encontrarla mencionada en ninguna parte? ¿Tienes algunas pistas sobre el tema y cómo lo has encontrado? – PomCompot

+1

PomCompot: me enteré hace un * largo * tiempo. Tuve que buscar el código fuente para descubrir dónde realmente funciona. Es un mapeo Sitemesh de nivel inferior. –

+1

El patrón se encuentra en: SitemeshPreprocessor.java –

16

sólo tiene que utilizar el parámetro de modelo Por ejemplo: vista:

<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

Esto solo responde cómo pasar variables a una plantilla, no a la disposición. IMO, esta es la forma más limpia de pasar a plantillas, sin embargo. – Wonko

+0

@Wonko ¿por qué alguien querría pasar una variable hasta la plantilla principal? –

-3

Según mis lecturas, creo que no es una buena práctica t o pase variables a su diseño. Las variables del modelo son accesibles en su vista. Creo que los diseños deberían usarse solo para especificar la estructura de la página, mientras que las vistas se pueden usar para completar el contenido.

+0

Votó como no precisa. La pregunta no es si es una buena o mala práctica, sino cómo hacerlo. Encajaría mejor en un comentario de pregunta que en una respuesta. – PomCompot

13

Utilizo un método posiblemente más simple. Simplemente defina una variable al alcance de la solicitud en la vista individual antes de llamar a su diseño. Estará disponible en todas las plantillas utilizadas en la solicitud, así como la disposición y cualquier llama a través de <g:render>

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

A continuación, sólo hacer referencia a la variable como lo haría con cualquier otra en su diseño o otras plantillas empujados por su punto de vista

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

Parece una solución más general, ya que de esta manera puede pasar cualquier tipo de variables (matrices, mapas, etc.). El patrón pageProperty parece funcionar solo con cadenas. Tenga en cuenta que no es necesario que set-tag sea _antes de la metaetiqueta (o incluso que la metaetiqueta esté presente). – Wonko

0

El patrón que me gusta utiliza la propiedad de la página de la siguiente manera. En el diseño, me refiero a la pageProperty así:

el SGP diseño

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

...y dentro de la sección <head> de la página gsp específica (me encontré con que no funcionó fuera de la sección de la cabeza), declaro el valor de este modo:

La página gsp

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

resultante HTML

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

Además, puedo inyectar un valor del modelo de controlador en pageProperty así:

Controller

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

El gsp diseño (utilizando el mismo diseño que el anterior)

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

La página gsp

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

Resultando HTML

<body id="adminPg"> 
    ... header, body and footer ... 
</body> 
Cuestiones relacionadas