Patrick asks:
Quick question (i think). I have this CFDIV with a form on it. When I submit this form I want it to go to another page (within the cfdiv) that has a cf tab layout on it, and based on whatever they select on the form I would like that tab to be selected when hitting the cf tab layout on the new page after they submit the form. Any ideas on how I could accomplish this, my attempts have failed. Thanks.
Let's break this down a bit.
First off, when inside a cfdiv (or pod, window, layoutarea), you can automatically keep the form post inside the container by using cfform. So consider these two simple files. First, my root test file:
<cfajaximport tags="cfform,cflayout-tab">
<h2>Headers for the Win</h2>
<cfdiv bind="url:test3.cfm" />
<h2>Footers for the Win</h2>
And then test3.cfm:
<cfform action="test2.cfm" method="post">
<cfinput type="submit" name="doit1" value="Do One">
<cfinput type="submit" name="doit2" value="Do Two">
<cfinput type="submit" name="doit3" value="Do Three">
</cfform>
Nothing too complex here. (I'll explain the button names in a sec.) This will load a page with a div where CF's Ajax code will automatically load in test2.cfm. Because I used cfform, the post will stay within the div context. Now I need to build a page that creates tabs and automatically selects the right one. This too is rather trivial.
<cfset t1Selected = false>
<cfset t2Selected = false>
<cfset t3Selected = false>
<cfif structKeyExists(form, "doit1")>
<cfset t1Selected = true>
<cfelseif structKeyExists(form, "doit2")>
<cfset t2Selected = true>
<cfelse>
<cfset t3Selected = true>
</cfif>
<cflayout type="tab">
<cflayoutarea title="Tab1" selected="#t1Selected#" />
<cflayoutarea title="Tab2" selected="#t2Selected#" />
<cflayoutarea title="Tab3" selected="#t3Selected#" />
</cflayout>
As you can see, I simply set state values for each tab to false and then check my form scope to see which value was passed. I say trivial, but when working on this I ran into two odd bugs.
First off, my form initially had buttons with a name of action. When I did that, the form post failed due to some odd JavaScript error. It seems as if you cannot use a form field named ACTION within a form that will be 'ajax posted' within cfform. So I changed all 3 buttons to "doit". Since the value was different, I should get form.doit equal to whatever button you push, right? Wrong. No matter what I pushed, the value was equal to all three values appended together in a list. Hence the switch to doit1, doit2, doit3. I assume again that this is just a quirk of CF's automatic "keep it inside" logic for cfform within containers.