I am reposting this from my blog ("ColdFusion 11: ... how does normal CFML code and code interact?") at the suggestion of Adobe support:
I have edited this in places to remove language that will be deemed inappropriate by the censors here. Changes I have made are in [square brackets]. The forums software here has broken some of the styling, but so be it.
Another quick one. I'm raising these quick-fire questions here because Adobe have declined to suggest a better place to raise them, other than as comments on one of their blog entries. Well that was Ram's suggestion (which I don't think is terribly-well thought out). He declined to react to my suggestion that the Adobe ColdFusion forums might be a good place. Anit suggested Twitter or just emailing him, but I think there'd be public interest in this stuff, so don't want to resort to email.
As I'm the master of what goes on on this blog: I'll clutter this thing up.
Say I want to have a mix of "normal" CFML and
<cfclient>-based CFML in the same file. I can only presume the intent is to allow this, otherwise having
<cfclient> as a tag rather than just a file extension seems like a poor approach. Obviously if one can have a start tag and an end tag, then code can come before (and I guess after) the
<cfclient> tags themselves.
So I'd expect this to work:
<cfset message = "G'day World"> <cfclient> <cfoutput>#message#</cfoutput> </cfclient>
However all I get is an error in JS:
And, indeed, the only mention of
message in the JS source is the one that's erroring (as it's on the right-hand side of an assignment).
So I thought perhaps
<cfclient> worked like
<cfthread> and I needed to pass attributes into it:
<cfset message = "G'day World"> <cfclient message="#message#"> <cfoutput>#message#</cfoutput> </cfclient>
This doesn't compile:
Attribute validation error for the client tag.
|The tag does not have an attribute called message. The valid attribute(s) are ''.|
|ColdFusion cannot determine the line of the template that caused this error.This is often caused by an error in the exception handling subsystem.|
Note also there's an error in the error message itself. It's not the
<client> tag, it's the
Rightio then, so I tried just using the request scope instead (the code's the same as the variables-scoped example, except using the request scope). No dice: same JS error.
As a last ditch effort, I just tried to see if
<cfclient> was aware of anything going on around it, by passing a value on the URL, and seeing if
<cfclient> saw that, eg:
<cfclient> <cfoutput>#URL.message#</cfoutput> </cfclient>
This behaved differently from the variables- / request- scoped examples, in that I didn't get a JS error, I just got this on the screen:
And no JS error. It pains me to have to do this, but let's look at the generated JS to see why the behaviour is different:
Variables scope example:
The only significant difference (other than function names, based on the file names) between this and the URL-scoped example is the indicated line above is replaced by this in the URL example:
So it's like it's trying to do the right thing, but just failing. I thought it might be because CF does stupid thinks with scope-key casing, and changed the
<cfclient> code to expect
URL.message, but this didn't work either.
So I'm flummoxed. I can't find anything in any documentation which might point me in the right direction, so anyone know what the story is here?
Update:At Joel's suggestion I tried this:
<script> message = "G'day World"; </script> <cfclient> <cfoutput>#message#</cfoutput> </cfclient>
Thisworked. Which elicits from me a mixture of "heh: cute" and "this is an abomination".