Макет Sitemesh не работает с тегом g.include в Grails - PullRequest
2 голосов
/ 08 сентября 2011

Я отображаю представление, которое сочетает в себе вызов g.include и макет сайта. Вид будет примерно таким: myview.gsp

<html>
    <head>
        <meta name="layout" content="checkout" />
    </head>
    <body>...

внутри тела есть вызов:

g.include(controller:"mycontroller", action:"myaction")

Проблема заключается в том, что макет sitemesh применяется никогда . Если я уберу вызов включения, все будет работать нормально.

Я еще не нашел ссылок на эту проблему на сайте. Кто-нибудь нашел решение этой проблемы или совет, будет высоко ценится!

Спасибо

-Пабло Дуранти

1 Ответ

1 голос
/ 08 сентября 2011

Мой индексный файл похож на базовый:

<html>
<head>
    <title>App Store For Publish, Download Android Apps</title>
    <meta name="layout" content="main" />
    <parameter name="sideBarSetting" value="main"/>
</head>
<body>
    <g:if test="${flash.message}">
        <div class="message">${flash.message}</div>
    </g:if>
    <g:announcements/>
    <g:include controller="cache" action="showFeatured"/>
    <g:include controller="cache" action="latestProducts"/>
    <div class="push"></div>
    <g:include controller="cache" action="mostPopular"/>
    <div class="push"></div>        
    <g:include controller="cache" action="allCategories"/>
</body>

Он работает в Grails 1.0, 1.2.2 и теперь 1.3.7.

В каждом из действийвы пытаетесь включить, вы не можете отобразить представление, но вместо этого сделать шаблон.Файл шаблона может содержать ТОЛЬКО фрагменты HTML, он НЕ может включать заголовок, мету для макета и т. Д.

В моем контроллере кэша

def latestProducts = {
    cache shared:true, validFor: 300
    def htmlCacheManager = HtmlCacheManager.getInstance()
    def key = 'latestProducts'
    def content = htmlCacheManager.getHtmlContent(key)
    if (!content) {
        def products = productService.get5LatestProducts(params)
        if (products){
            content = g.render(template:'/common/product/productLatestListTemplate', model:['productInstanceList' : products, 'type':'latest'])
            htmlCacheManager.store(key, content, Boolean.TRUE)
        } else {
            log.debug('No latest product found')
        }
    }
    render content ?: ''
}

Файл шаблона:

    <div class="list">
<fieldset>
<legend><g:message code="product.latest"/>  <g:link action="feed" controller="product" params="['type':type]" target="_blank"><img src="${resource(dir:'images', file:'feed-icon.gif')}"  height='16' width='16' alt="Feeds"/></g:link></legend>
    <g:each in="${productInstanceList}" var="product">
    <div class="product">
        <g:render template="/common/product/productSingleListTemplate" model="['product':product]" />
    </div>
    </g:each>
</fieldset>
</div>
...