Must confess I’ve been struggling with this one today, even with the great documentation at cfwheels.org.
Thanks to the cfwheels list, I’ve cracked it though (blogging the solution for posterity!).
I wanted to created a truly nested layout, i.e a master layout with <html> & <body> tags, and then a sub layout in my /views/main/ (with main being the controller name in this instance) which then included the default content on /views/main/index/. The problem was that when you add a layout file in /views/main/layout.cfm it overrides the default layout in /views/layout.cfm.
Turns out you need to call the parent template in the sub template and inject the content using contentFor() before you make the call.
So in my /views/layout.cfm
<html> <body> <div id="master-wrapper"> <cfoutput>#includeContent("mainbody")#</cfoutput> </div> </body> </html>
and in my /views/main/layout.cfm
<cfoutput> <cfsavecontent variable="mainbody"> <div id="controller-layout"> #includeContent()# </div> </cfsavecontent> <!--- Inject the above variable into the parent layout ---> <cfset contentFor(mainbody=mainbody)> <!--- Include the parent layout ---> #includeLayout("/layout.cfm")# </cfoutput>
and in my standard view of /views/main/index.cfm
<div id="main-view"> <p>I am the content in the main index file</p> </div>
<!-- Master Layout Start --> <html> <body> <div id="master-wrapper"> <!-- Sub Layout Start --> <div id="controller-layout"> <!-- Standard View Start --> <div id="main-view"> <p>I am the content in the main index file</p> </div> <!-- Standard View End --> </div> <!-- Sub Layout End --> </div> </body> </html> <!-- Master Layout End -->
Notes: this means you’d need a layout.cfm in every views folder just to set the mainbody variable, otherwise your content never gets called by the top level layout. I’ve tried getting this working with the default body variable but haven’t had much success yet.