<!---
depend_list.cfm
written by Megan Garrison
megan@aracnet.com
Try
Example or download files
===================================================
TAG INFO
dynamically populates
a second drop-down list from database
tables based on a selection in a first drop-down list.
So far I know it works on CF5 and CF 4.5 with IE 5.5 and NS 4.6
Required Attributes:
DataSource: Your
Datasource
tblCat: Name of your "Category" table
CategoryID: Column which will be your Category Id
Category: Column which will be your Category name
tblItem: Name of your "List Items" table
ListItemID: Column which will be your List Item Id
ListItem: Column which will be your List Item name
Non-Required attributes:
FormSubmit: Value
of Submit Button, e.g. Submit, or GO!
FormAction: The name of your form's action page, e.g. myactionpage.cfm
IMPORTANT! Must include these attributes if you are using the tag by
itself and not calling from inside another form tag. If you are calling
this tag from inside another form tag, DO NOT INCLUDE THESE ATTRIBUTES.
Attributes for
multiple instances
(using the tag more than once in the same form)
starting with the 2nd instance you will need
to include the following attributes:
qryName: Name of
Query, default="getList"
InstanceName: Unique name for each addition instance of this tag, default="whichList"
selectName1: Name of first select form element, default="selectCat"
selectName2: Name of second select form element, default="selectItem"
EXAMPLES OF USE: Categories being Countries and ListItems being States/Provinces
2 tables
tblCountries with
2 fields country_id and country
tblLocations with 3 fields location_id, state, country_id
not inside a form call like this:
<cf_depend_list
DataSource="myDSN"
tblCat="tblCountries"
CategoryID="country_id"
Category="country"
tblItem="tblLocations"
ListItemID="location_id"
ListItem="state"
FormAction="myactionpage.cfm"
FormSubmit="Submit">
inside a form call like this:
<form name="myform" action="myactionpage.cfm" method="post">
<cf_depend_list
DataSource="myDSN"
tblCat="tblCountries"
CategoryID="country_id"
Category="country"
tblItem="tblLocations"
ListItemID="location_id"
ListItem="state">
</form>
Note for the purposes of passing info to an action
for single or first instance of use where SelectName1
and/or SelectName2 attributes are not included:
the first select form element name="selectCat"
the second select form element name="selectItem"
MULTIPLE INSTANCES
EXAMPLE
(Calling from inside a form)
<form name="myform"
action="myactionpage.cfm" method="post">
<table cellpadding="5" border="1"><tr><td>
Where Do You live?<br>
<cf_depend_list
DataSource="myDSN"
tblCat="tblCountries"
CategoryID="country_id"
Category="Country"
tblItem="tblLocations"
ListItemID="location_id"
ListItem="State">
</td></tr><tr><td>
Where kind of pet do you have?<br>
<cf_depend_list
DataSource="myDSN"
qryName="getPet"
tblCat="tblSpecies"
CategoryID="species_id"
Category="Species"
tblItem="tblBreeds"
ListItemID="breed_id"
ListItem="Breed"
InstanceName="whichPet"
selectName1="selectSpecies"
selectName2="selectBreed">
</td></tr><tr><td>
<input type="submit" name="Submit" value="Submit">
</td></tr></table>
</form>
===================================================
--->
<cfsetting enablecfoutputonly="Yes">
<cfif not isDefined("attributes.DataSource")>
<CFOUTPUT>
Please designate a DataSource name!<BR>
</CFOUTPUT>
<cfexit method="EXITTAG">
</cfif>
<cfif not isDefined("attributes.tblCat")>
<CFOUTPUT>
Please designate a Category Table!<BR>
</CFOUTPUT>
<cfexit method="EXITTAG">
</cfif>
<cfif not isDefined("attributes.categoryID")>
<CFOUTPUT>
Please designate a Category ID column!<BR>
</CFOUTPUT>
<cfexit method="EXITTAG">
</cfif>
<cfif not isDefined("attributes.category")>
<CFOUTPUT>
Please designate a Category Name column!<BR>
</CFOUTPUT>
<cfexit method="EXITTAG">
</cfif>
<cfif not isDefined("attributes.tblItem")>
<CFOUTPUT>
Please designate a ListItem Table!<BR>
</CFOUTPUT>
<cfexit method="EXITTAG">
</cfif>
<cfif not isDefined("attributes.listItemID")>
<CFOUTPUT>
Please designate a ListItem ID column!<BR>
</CFOUTPUT>
<cfexit method="EXITTAG">
</cfif>
<cfif not isDefined("attributes.listitem")>
<CFOUTPUT>
Please designate a ListItem name column!<BR>
</CFOUTPUT>
<cfexit method="EXITTAG">
</cfif>
<cfif not isDefined("attributes.qryName")>
<cfset attributes.qryName="getList">
</cfif>
<cfif not isDefined("attributes.InstanceName")>
<cfset attributes.InstanceName="whichList">
</cfif>
<cfif not isDefined("attributes.selectName1")>
<cfset attributes.selectName1="selectCat">
</cfif>
<cfif not isDefined("attributes.selectName2")>
<cfset attributes.selectName2="selectItem">
</cfif>
<cfquery name="#attributes.qryName#" datasource="#attributes.datasource#">
SELECT l.#attributes.listitemID# as mylistitemID, l.#attributes.listitem# as
mylistitem, c.#attributes.category# as mycategory, c.#attributes.categoryID#
as mycategoryID
FROM #attributes.tblItem# l
INNER JOIN
#attributes.tblCat# c
ON l.#attributes.categoryID# = c.#attributes.categoryID#
ORDER BY #attributes.category#, #attributes.listitem#
</cfquery>
<cfsetting enablecfoutputonly="no">
<cfset idx = -1>
<cfset mycase = 0>
<!---
The JavaScript is adapted from Mike Corbridge's Multiple dynamic drop-down selection
boxes example http://tutorial11.easycfm.com/
--->
<script language="JavaScript1.2">
function <cfoutput>#attributes.InstanceName#(obj)</cfoutput>{
switch (obj.<cfoutput>#attributes.SelectName1#</cfoutput>.selectedIndex){
<cfoutput query="#attributes.qryName#" group="mycategory">
<cfset mycase = mycase + 1>case #mycase#:
<cfset myList = Evaluate("ValueList(#attributes.qryName#.mycategoryid)")>
<cfset numberInCategory = ListValueCount(myList, mycategoryid)>
obj.#attributes.SelectName2#.length=#numberInCategory#<cfoutput>
<cfset idx = idx + 1>
obj.#attributes.SelectName2#.options[#idx#].value="#mylistitemid#"
obj.#attributes.SelectName2#.options[#idx#].text="#mylistitem#"</cfoutput>
break;
<cfset idx = -1>
</cfoutput>
}
}
</script>
<cfif isDefined("attributes.FormAction")>
<CFOUTPUT>
<form action="#attributes.FormAction#" method="post"><BR>
</CFOUTPUT>
</cfif>
<select name="<cfoutput>#attributes.SelectName1#</cfoutput>"
onchange="<cfoutput>#attributes.InstanceName#</cfoutput>(this.form)">
<option value=""> Select <cfoutput>#attributes.category#</cfoutput>
</option>
<cfoutput query="#attributes.qryName#" group="mycategory">
<option value="#mycategoryid#">#mycategory#</option>
</cfoutput>
</select>
<select name="<cfoutput>#attributes.SelectName2#</cfoutput>"
onchange="<cfoutput>#attributes.InstanceName#</cfoutput>(this.form)">
<option value=""> <cfoutput>#attributes.listitem#</cfoutput>
will appear here </option>
<option></option>
<option></option>
<option></option>
<option></option>
<option></option>
<option> --------------------------------- </option>
</select>
<cfif isDefined("attributes.FormSubmit")>
<CFOUTPUT>
<input type="submit" name="Submit" value="#attributes.FormSubmit#">
</form>
</CFOUTPUT>
</cfif>
<cfif isDefined("attributes.FormAction")>
<CFOUTPUT>
</form>
</CFOUTPUT>
</cfif>