I still have some CustomTags that we've used in production for years and, now that I'm writing more cfscript, I thought I'd continue using some of them (for now) using the following syntax that I learned about on StackOverflow:
CFML tag-based approach: <cf_customTagName param1=param1Value> CFScript approach: cf_customTagName(param1=param1Value);
I immediately discovered that the cfscript method was executing the tag twice. In order to execute the tag-based version twice using CFML tag-based syntax, you need to explicitly use a starting and closing tag and then check for
thisTag.executionMode with a value of either
<cf_customTagName param1=param1Value> <!--- this runs the tag twice w/different executionModes ---> </cf_customTagName>
The "nuance" (that CFM-based custom tags are always executed twice twice via cfscript) isn't documented on the only Adobe documentation that discusses this: "Script support for custom tags". (NOTE: I'm not sure if this behavior is the same in Lucee CFML.)
The solution for this is check whether the CFM file is being executed as a CustomTag (ie, if
thisTag.executionMode exists and is
start) and then exit.
<cfif isDefined("thisTag.executionMode") and thisTag.executionMode is "start"> <cfexit> </cfif>
If you don't explicitly do it this way, you'll risk having the customtag's functions unknowingly performed twice which can cause data problems or negatively impact performance.
Here's the files I set up to reproduce and test this: