Over the weekend, when I was working on my Dig Deep Fitness prototype, I thought of a neat little trick. I am sure that this has been done by many people, but it had never occurred to me. I was working with a ColdFusion custom tag in which I needed to replace the generated content of the tag. Normally, when I would do something of this nature, I would simply store the new content in a CFSaveContent tag buffer and then set that variable into the THISTAG.GeneratedContent variable:
<!--- We only want to execute this after the tag has executed. That way, we will know all the child tags and content that has been generated. ---> <cfif (THISTAG.ExecutionMode EQ "End")> <!--- Create the new tag content. ---> <cfsavecontent variable="VARIABLES.NewContent"> <cfoutput> <!--- Put the new content in here that you want the ColdFusion custom custom to actually produce. ---> </cfoutput> </cfsavecontent> <!--- Set the tag's new content. ---> <cfset THISTAG.GeneratedContent = VARIABLES.NewContent /> </cfif>
But this weekend, as I was writing a tag like that, it hit me! Why not just store the CFSaveContent buffer directly into the GeneratedContent of the tag? Why bother even going through an intermediary variable:
<!--- We only want to execute this after the tag has executed. That way, we will know all the child tags and content that has been generated. ---> <cfif (THISTAG.ExecutionMode EQ "End")> <!--- Reset the tag content. ---> <cfsavecontent variable="THISTAG.GeneratedContent"> <cfoutput> <!--- Put any content in here that you want the ColdFusion custom custom to actually produce. By storing the content diretly into the GeneratedContent, it will set the output that is displayed. ---> </cfoutput> </cfsavecontent> </cfif>
Notice that the CFSaveContent tag is now storing its buffer directly into the THISTAG.GeneratedContent variable, which will, thereby, replace the content of the ColdFusion tag.
So, like I said, this is a really minor tip, but I think it has a big logical and visual impact on the layout of the ColdFusion custom tag. Thought I would share this with anyone who hadn't realized this shortcut yet.
Want to use code from this post? Check out the license.
Another good tip Ben, thanks
It will come in handy. Go Ben go. :)
Apparently, you cannot change THISTAG.GeneratedContent when THISTAG.ExecutionMode EQ "start"
Correct - there is no generated content at that point since the body of the tag has not yet executed.
How come when I try to use ThisTag.generatedContent it does not seem to want to work?
I have a tag called <sample1>..
Here is a test using it:
<cf_sample1>This is a Test</cf_sample1>
Here is the contents of the tag file:
<cfif (thistag.executionMode eq "end")> <cfoutput><br>value=#thistag.generatedContent#</cfoutput> </cfif>
I get value=
but no value at all!
Found my own problem!
In my Application.cfm file I am using:
So, in order for my custom tag to work as I would expect, I have to call it like so:
<cf_sample1><cfoutput>This is a Test</cfoutput></cf_sample1>
Then it works just fine!