Shaun Mccran

My digital playground

18
A
U
G
2009

Connecting Select form fields based on data selections Pt 2

I want to be able to dynamically change a second select field based on the value of the first select field.

Following on from the cfajaxproxy example I wrote last week, where I discovered I could not use ColdFusion 8 functionality on my live server, I have arrived at a variant solution.

In this example I am using a similar JQuery url request to process the output from a CFC. The first template is the form itself. This includes references to the JQuery libraries and the binding of the response to the form elements. It also builds the url request to the 'request_processor.cfm' file, which handles the CFC.

view plain print about
1<scr/ipt src="jquery-1.2.3.js" type="text/javascript"></script>
2<scr/ipt src="select-chain.js" type="text/javascript" charset="utf-8"></script>
3<scr/ipt type="text/javascript">
4 jQuery.noConflict();
5 jQuery(function () {
6 var type = jQuery('#series');
7 var sp = jQuery('#issueno');
8
9 type.selectChain({
10 target: sp,
11 url: 'request_processor.cfm',
12 type: 'post',
13 data: { ajax: true }
14 }).trigger('change');
15
16 });
17</script>

Next build a simple form, and populate the first select field with data from a method.

view plain print about
1<cfif not structisempty(form)>
2 <cfdump var="#form#">
3<cfelse>
4 <cfset variables.series = createObject("component","jquerySeries"). getSeries()>
5 <form action="" method="post">
6 <select name="series" id="series">
7 <cfoutput query="variables.series">
8 <option value="#variables.series.intId#">#variables.series.varName#</option>
9 </cfoutput>
10 </select>
11 <select name="issueno" id="issueno">
12 <option></option>
13 </select>
14 <button type="submit">Submit</button>
15 </form>
16</cfif>

Next is the intermediately file that handles the data manipulation, this is triggered when the user chooses an option from the first select field. It passes through the selected value, and returns the query object. This is then serialised using the cfJson object, to return the data in Json. If you do anything like this remember to watch your debug output, it was destroying my Json response for a good ten minutes before I remembered to turn it off. Doh!

view plain print about
1<cfsetting showdebugoutput="false">
2<cfsetting enablecfoutputonly="true">
3<cfparam name="form.series" default="8">
4<cfset variables.issues = createObject("component","jquerySeries").getIssueNos(series=form.series)>
5<cfset ojson = createObject("component","cfjson")>
6<cfset theresults = ojson.encode(listToArray(valuelist(variables.issues.intIssueNo)))>
7<cfoutput>#theresults#</cfoutput>

Finally a CFC that performs the database functions. This is a pretty straight forward CFC that performs two database queries, the second based on an id passed in from the first.

view plain print about
1<cfcomponent>
2
3    <cffunction name="getSeries" output="false" hint="Returns publication series">
4        <cfset var result = "">
5
6    <cfquery name="result" datasource="#application.ds#">
7        SELECT [intId],[varName]
8        FROM [dbo].[table]
9        Where intActive = '1'
10        Order by varName
11    </cfquery>
12
13    <cfreturn result>
14    </cffunction>
15
16    <cffunction name="getIssueNos" output="false" hint="returns related series issue numbers">
17        <cfargument name="series" type="numeric" required="false" hint="Id of the publication">
18        <cfset var result = "">
19
20        <cfquery name="result" datasource="#application.ds#">
21            SELECT [intIssueNo]
22            FROM [dbo].[table]
23            where intSeriesId = <cfqueryparam value="#arguments.series#" cfsqltype="cf_sql_integer">
24        </cfquery>
25
26    <cfreturn result>
27    </cffunction>
28</cfcomponent>

Once you have these elements hooked up you'll see that the response from the first select field changes the values in the second field. You can download a rar'd version of the code base here.

This works well, but I'm not massively happy about the 'remote_processor' file. I think I'll see if there is a way of directly calling the CFC, and moving the JSON serialisation into the functions.

TweetBacks
Comments (Comment Moderation is enabled. Your comment will not appear until approved.)
Back to top