# applyLayout

## Purpose

Applies the specified layout to either the body, a given template and an arbitrary URL allowing the development of "portlet" style applications and mashups

## Examples

    <g:applyLayout name="myLayout" template="displaybook" collection="${books}" />

or

    <g:applyLayout name="myLayout" url="http://www.google.com" />

or

    <g:applyLayout name="myLayout">
    The content to apply a layout to
    </g:applyLayout>

## Description

Attributes

- `name` - The name of the layout to apply
- `url` - The URL of the content to apply, could be an external URL
- `template` (optional) - The name of the template to apply
- `bean` (optional) - The bean to apply the template against
- `model` (optional) - The model to apply the template against as a java.util.Map
- `collection` (optional) - A collection of model objects to apply the template to

## Source

Show Source

    def applyLayout = { attrs, body ->
            if(!groovyPagesTemplateEngine) throw new IllegalStateException("Property [groovyPagesTemplateEngine] must be set!")
            def oldPage = getPage()
            def contentType = attrs.contentType ? attrs.contentType : "text/html"        def content = ""
            GSPSitemeshPage gspSiteMeshPage = null
            if(attrs.url) {
            	content = new URL(attrs.url).text
            } else {
            	def oldGspSiteMeshPage=request.getAttribute(GrailsPageFilter.GSP_SITEMESH_PAGE)
            	try {
            		gspSiteMeshPage = new GSPSitemeshPage()
            		request.setAttribute(GrailsPageFilter.GSP_SITEMESH_PAGE, gspSiteMeshPage)
    		        if(attrs.view || attrs.template) {
    		            content = render(attrs)
    		        }
    		        else {
    		        	def bodyClosure = GroovyPage.createOutputCapturingClosure(this, body, webRequest, true)
    		            content = bodyClosure()
    		        }
            		if(content instanceof StreamCharBuffer) {
            			gspSiteMeshPage.setPageBuffer(content)
            		} else if (content != null) {
            			def buf=new StreamCharBuffer()
            			buf.writer.write(content)
            			gspSiteMeshPage.setPageBuffer(buf)
            		}
            	} finally {
           			 request.setAttribute(GrailsPageFilter.GSP_SITEMESH_PAGE, oldGspSiteMeshPage)
            	}
            }        def page = null
            if(gspSiteMeshPage != null && gspSiteMeshPage.isUsed()) {
            	page = gspSiteMeshPage
            } else {
                def parser = getFactory().getPageParser(contentType)
            	page = parser.parse(content.toCharArray())
            }        attrs.params?.each { k,v->
                page.addProperty(k,v?.toString())
            }
            def decoratorMapper = getFactory().getDecoratorMapper()        if(decoratorMapper) {
                def d = decoratorMapper.getNamedDecorator(request, attrs.name)
                if(d && d.page) {
                    try {
                        request[PAGE] = page
                      	def t = groovyPagesTemplateEngine.createTemplate(d.getPage())
                        def w = t.make()
                        w.writeTo(out)                } finally {
                        request[PAGE] = oldPage
                    }
                }
            }
        }    private Factory getFactory() {
            return FactoryHolder.getFactory()
        }