Rob asks:
Is there a <cfhtmlfoot> tag? One that would write at the end of html file, before </body> tag...
In case folks don't get why he is asking, ColdFusion comes with a cfhtmlhead tag that lets you dynamically add stuff to the HEAD portion of an HTML document. There is not a corresponding tag like what Rob wants, but there is no reason we can't hack one up in a custom tag. My solution will make use of both the Request scope and the oft-maligned (by me) onRequest function. First, a sample page:
<cf_htmlfoot text="<p>© Raymond Camden #year(now())#"> <html><head> <title>Test</title> </head>
<body>
<p> Woohoo,web design kicks butt. </p>
</body> </html>
This is a trivial page with simple text on it. Note the call to the custom tag, htmlfoot, on top. The custom tag just does this:
<!--- the text to add ---> <cfparam name="attributes.text" default=""><!--- where we store it ---> <cfparam name="request.footertext" default="">
<!--- add it ---> <cfset request.footertext &= attributes.text>
As you can see, we simply take your text, and append it to the text we want to add to the foot. This actually makes my tag better as I don't think you can have multiple cfhtmlhead tags. If I weren't so lazy, I'd also make the custom tag support this syntax:
<cf_htmlfoot> Foo Foo </cf_htmlfoot>
Anyway, the last step is to enable onRequest to notice the Request scope variable we created:
<cffunction name="onRequest" returnType="void"> <cfargument name="thePage" type="string" required="true"> <cfset var content = ""><cfsavecontent variable="content"> <cfinclude template="#arguments.thePage#"> </cfsavecontent>
<cfif structKeyExists(request, "footertext")> <cfset content = replacenocase(content, "</body>", "#request.footertext#</body>")> </cfif>
<cfoutput>#content#</cfoutput> </cffunction>
There isn't much to talk about here. All I did was look for the Request variable, and if it existed, I insert it into the result HTML before outputting it to the browser. Again, I'm not a big fan of onRequest, but this is an interesting example of how one could use it.