In a previous post I created a CFC to save simple variables into the session scope. In that CFC I had set up two functions, "SetSessionVar" and "GetSessionVar". However I ended up only needing the "SetSessionVar" function for my example so I never really tested the "GetSessionVar" function. Someone asked me today how to invoke it, and that is when I realized there were a couple little problems that I needed to fix.

Here is the updated Session.cfc code, I had to modify the output and returntype attributes in the "GetSessionVar" function:

<cfcomponent name="session" hint="Performs Session Functions">
<cffunction name="SetSessionVar" access="remote" output="false" returntype="Boolean">
<cfargument name="Name" type="string" required="true">
      <cfargument name="Value" type="string" required="true">
            <cfset session[arguments.Name] = arguments.Value>
            <cfreturn true>
</cffunction>
   <cffunction name="GetSessionVar" access="remote" output="true" returntype="String">
<cfargument name="Name" type="string" required="true">
            <cfreturn session[arguments.Name]>
</cffunction>
</cfcomponent>

In my previous post using this CFC, I demonstrated how to execute the SetSessionVar function, but since that function did not return anything it was a tad bit simpler to do. If you are using cfajaxproxy to connect to a CFC function that returns a string or JSON object or something, you will need to set up a callback handler function that will get excecuted if the function is invoked successfully. Then you specify it using the setCallbackHandler function in the CFC proxy object.

Here is my working Save Active Tab Example that now has a button that when clicked will call the GetSessionVar function and use a callback handler that just pops up an alert box with the value of the session variable.

<html>
<head>
<title>Save Active Tab Example</title>

<cfajaxproxy cfc="session" jsclassname="CFCs.session">

<cfset AjaxOnLoad("addTabChangeListener")>

<script language="JavaScript">
addTabChangeListener = function(){
myTabs = ColdFusion.Layout.getTabLayout("MyTabLayout");
myTabs.on('tabchange',SaveActiveTab);
}

SaveActiveTab = function(){
myTabs = ColdFusion.Layout.getTabLayout("MyTabLayout");
actTab = myTabs.getActiveTab();
var SessionObj = new CFCs.session();
      SessionObj.setErrorHandler(errorHandler);
      SessionObj.SetSessionVar("ActiveTab", actTab.id);
}

errorHandler = function(statusCode,statusMsg) {
   alert(statusCode+': '+statusMsg)
}
//Here is the Callback Handler that puts the response into an alert
AlertResponse = function(res){
      alert(res);
}
//Here's how to call the GetSessionVar function
CheckActiveTab = function(){
   var SessionObj = new CFCs.session();
      SessionObj.setErrorHandler(errorHandler);
      SessionObj.setCallbackHandler(AlertResponse);
      SessionObj.GetSessionVar("ActiveTab");
}
</script>

</head>
<body>
<table width="95%" align="center"><tr><td>
<cflayout type="tab" name="MyTabLayout">
   <cfif session.activetab eq "tab1"><cfset isSelected="true"><cfelse><cfset isSelected="false"></cfif>
<cflayoutarea name="tab1" selected="#isSelected#" title="Tab 1" style="height:100%">
   This is Tab 1
</cflayoutarea>
<cfif session.activetab eq "tab2"><cfset isSelected="true"><cfelse><cfset isSelected="false"></cfif>
<cflayoutarea name="tab2" selected="#isSelected#" title="Tab 2" style="height:100%">
   This is Tab 2
</cflayoutarea>
<cfif session.activetab eq "tab3"><cfset isSelected="true"><cfelse><cfset isSelected="false"></cfif>
<cflayoutarea name="tab3" selected="#isSelected#" title="Tab 3" style="height:100%">
   This is Tab 3
</cflayoutarea>
<cfif session.activetab eq "tab4"><cfset isSelected="true"><cfelse><cfset isSelected="false"></cfif>
<cflayoutarea name="tab4" selected="#isSelected#" title="Tab 4" style="height:100%">
   This is Tab 4
</cflayoutarea>
</cflayout>
</td></tr></table>
<input type="Button" value="alert active tab" name="alertactivetab" onclick="CheckActiveTab();">
</body>
</html>

Comments (Comment Moderation is enabled. Your comment will not appear until approved.)
Todd Rafferty's Gravatar There must be something I'm doing wrong. I attempted to do something similar, only it was a very basic javascript detection script. User would have a session var, by default, session.user.jsenabled = false is set. Use CFAjaxproxy, if it triggered, then set session.user.jsenabled = true. Otherwise, if it remained false, then I could in theory, display a "Hey, you have javascript turned off... you're going to miss out on some features."

I need to re-look over my code and figure it out what I'm doing wrong.
# Posted By Todd Rafferty | 1/23/08 7:23 PM
Cutter's Gravatar @Todd - Just a thought, but if someone has javascript turned off then chances are they don't have cookies enabled either, which then negates the 'session' experience.
# Posted By Cutter | 1/24/08 12:28 AM
Todd Rafferty's Gravatar @Cutter - In a new world with Firefox + NoScript + AdBlock? I'll take my chances. I'm more concerned about the user not having javascript enabled.
# Posted By Todd Rafferty | 1/24/08 1:13 PM
Scott Bennett's Gravatar People with JavaScript disabled are in a pretty extreme minority these days. In the analytics for the fairly popular e-commerce site I work on, over 99% of users have JavaScript enabled and the less than 1% that have it disabled are mostly people browsing from thier blackberries or other phones. So I seldom bother to do much to cater to them, snd if I were you I would probably just go with simple <noscript> tag.

That being said, if I were to build what you are describing, then in application.cfc I would set up a variable in the onSessionStart function called "session.jsenabled", with a defaul value of "NO". Then I would use my session.cfc above to set the variable to be "YES", by including the following snippet of code in any request where the session:

<cfajaxproxy cfc="session" jsclassname="CFCs.session">

<cfset AjaxOnLoad("checkJSEnabled")>

<script language="JavaScript">
checkJSEnabled = function(){
var SessionObj = new CFCs.session();
SessionObj.setErrorHandler(errorHandler);
SessionObj.SetSessionVar("JSEnabled", "YES");
}

errorHandler = function(statusCode,statusMsg) {
alert(statusCode+': '+statusMsg)
}
</script>

Then I could put some conditional logic on the necessary pages to check the session variable and let the user know if they are missing out on my cool AJAX features.

Although after writing that out I'm not sure how practical it is. If the very first page they view is an AJAX enabled page and you haven't set the value in their session to "Yes" yet, then your message telling them that javascript is needed for this page would be displayed until they refreshed. so you would have to add some more logic to that checkJSEnabled function that will hide your message if javascipt is actually enabled.

I would just use the noscript tag if I were you.
# Posted By Scott Bennett | 1/24/08 1:42 PM
Todd Rafferty's Gravatar I disagree that people with javascript are disabled are in the minorities tho, especially with FireFox + NoScript. You can enable/disable javascript easily enough. I'm using it right now, except I had to enable it to post a comment.

I didn't finish explaining my logic above. :) After I had attempted to check at least once, the code wouldn't ever run again. Easy enough to do, only need to check once and keep the "message" in their face or perhaps give them the option to dismiss the message.

I need to give this code another stab still, but I'm buried on a project at work still. When I last attempted, everything was running properly, but when the script part ended, it was retaining it's old value instead of the new one that I assigned it inside.
# Posted By Todd Rafferty | 1/24/08 1:50 PM
Scott Bennett's Gravatar Different sites attract different audiences. On all the sites I have worked on for the last 3 years or so, I have had analytics in place and my audiences have been pretty good about always having javascript enabled. If your user base has a significant population of javascript disablers in FireFox, then you definitely want to give them some consideration.
# Posted By Scott Bennett | 1/24/08 2:05 PM
Penny's Gravatar I'm wondering in your cfc, you don't need cflock when you accessing session variables? Is it safe?
# Posted By Penny | 6/18/08 12:06 PM
Scott Bennett's Gravatar @Penny,

There are two conditions that must be met in order to require the use of CFLock:

1. A shared resource is being accessed or updated.
2. There must be the possibility of a race condition resulting in a NEGATIVE outcome.

This particular sample code was developed as part of an article that demonstrated how to interact with the session scope via the new cfajaxproxy tag.

http://www.coldfusionguy.com/ColdFusion/blog/index...

Since in that example I did not feel that a race condition would cause a negative outcome, I did not need to worry about locking the session scope. If you feel that a race condition in your application would cause a negative outcome, then by all means you should use cflock.

I wrote a fairly detailed article on CFlock several months ago that you may want to read through, and I would recommend reading through the comments and checking out all the links to other resources and information that was brought up in the discussion as well.

http://www.coldfusionguy.com/ColdFusion/blog/index...
# Posted By Scott Bennett | 6/19/08 2:19 PM
Marty's Gravatar Scott,
Thanks for this. I was chasing my tail all morning trying to figure this out. Once I made sure that the ajax calls resided within the head tags, everything lit up as described. Thanks again!
# Posted By Marty | 7/17/08 10:39 AM
Tim's Gravatar hi,

I used your example but I'm getting a 404:not found, is this because a mapping issue with Ajax? can you help? thanks
# Posted By Tim | 8/12/11 1:51 PM
Coldfusion Development's Gravatar HI ! i am learner. i try to create Function but i have one query can place a hidden field control in the ASPX page(<input type="hidden" id="MyID" runat="server">). Assign value to this hidden field in the code-behind file. Access this value in your javascript like a normal HTML control.
# Posted By Coldfusion Development | 11/3/12 6:19 AM