Over the past few days I've had multiple people ask me the same question - and that means one thing to me... blog post!
The question these people were asking was the same - I know how to write a UDF, but not sure how to actually use it on a page? By that they didn't mean the "function" syntax (x = foo()), but how to include the UDF so that it could be used on a page.
The answer is simple once you realize that a UDF is nothing more than another kind of ColdFusion variable. Consider this code:
<cfoutput>
#x#
</cfoutput>
What do you have to do to make this not throw an error? There are multiple ways to handle this. First, define it on the page:
<cfset x = "DJ Jazzy Jeff and the Fresh Prince">
<cfoutput>#x#</cfoutput>
Another way:
<cfinclude template="thisiswherexismade.cfm">
<cfoutput>#x#</cfoutput>
There are other ways of course, but you get the idea. So to use a UDF you follow the same rules. Here are two more examples using the same format as above:
<cfscript>
function cic() { return "monkey"; }
</cfscript>
<cfoutput>#cic()#</cfoutput>
And then the cfinclude version:
<cfinclude template="filewithcfcUDFinit.cfm">
<cfoutput>#cic()#</cfoutput>
Just like other variables, UDFs can be placed in the shared scopes. You can't do it directly though but rather must reassign:
<cfscript>
function dharma() { return "swan"; }
request.dharma = dharma;
</cfscript>
<cfoutput>#request.dharma()#</cfoutput>
Archived Comments
Also, one subtle issue with using functions: You cannot always treat the returned value of a function AS the value it actually is. This has nothing to do with type compatability, but rather with compile time parsing (I think).
Take for example the UDF Test:
<cffunction name="Test">
<cfreturn ListToArray( "ben,ray" ) />
</cffunction>
This function just returns a simple array with two items in it. However, even though it returns an array, you cannot call the method and reference the value in ONE line of code:
#Test()[1]#
... will throw the error:
"Invalid CFML construct found"
You have to create an interim variable to do this:
<cfset arrNames = Test() />
#arrNames[ 1 ]#
This works fine. So, you might never come across this, but if you are getting this error, the error is NOT with the UDF itself, but rather with ColdFusion's compile time parsing issues. Personally, I think this is a *bug*... but that's just me.
Ray, one method that you yourself mention at least in one other post. "What I typically do, and I have seen others doing this as well, is to create a CFC to store your UDFs. Normally I like to create a CFC called utils...."
Should/could not this be mentioned as well? :)
Trond - no, it should not have. :) In the post I said that what I was showing were _some_ of th ways. I didn't want to get too complex as I was writing for folks just getting into UDFs. So pretend you didn't say that. ;)
Ok - then I have a suggestion for another blog post for you:
"How do I actually use a CFC to store my UDFs" :)
Trond,
If I may step in for that one:
http://www.bennadel.com/ind...
Dang it Ben, stop that. ;)
Trond's another CFSkill'er ... gotta take care of my boys :)