Solved

CF Bind for cascading select boxes - experts only!

Posted on 2010-11-11
3
953 Views
Last Modified: 2012-06-27
Hi Experts,

I'm running CF9 and I figured instead of using an old custom tag to mimic ajax functionality, I wanna use cf bind, which makes life much easier for me (I don't have to deal with all the html nuisance with the old custom tag). On change of the first select box should trigger the bind in the lower two select boxes. The only thing is that I have several cascading select boxes that need to be bound using bind, but they are all in a block that can be refreshed using a check box that uses the old custom tag. Can I have that functionality remain the same but change the select boxes to use bind? Or would that create a conflict because the area in which the cascading select boxes are in a dynamically generated block? If so, could someone give me some leads on how to do the binds?Code is below, thanks in advance!
<!---my select boxes--->
<select name="HRType" id="optype">
  <option value="">All</option>
   <option value="Process">Process</option>
   <option value="Action">Action</option>
</select>

<!---this is the first cascading box that needs to be bound to the one above--->
<select name="ProcessType">
   <option value="">All</option>
  <cfoutput query="GetProcType" group="ProcType">
    <optgroup label="#oType#">
      <cfoutput>
        <option value="#dataid#">#text#</option>
      </cfoutput>
   </cfoutput>
</select>
<!---this select box is also bound to the first select box but with different values--->
<select name="subgroup" id="subgroup">
<option value="">All</option>
<cfoutput query="GetHop" group="aid">
<option value="#aid#">#group#</option>
</cfoutput>
</select>
<!---I know that select has to be changed to cfselect but this is what I have right now. Here is what I have in my cfc - myCFC.cfc --->

<cfcomponent>
  
<cffunction name="myFunc" access="remote" returnformat="plain">
	<cfargument name="ho" required="Yes" default="">
	<cfargument name="site" required="Yes" default="">
	<cfargument name="on" required="Yes" default="">
	<cfargument name="lc" required="Yes" default="">
	<cfargument name="org" required="Yes" default="">
	<cfargument name="ln" required="Yes" default="">
	
	<cfquery name="GetProcType" datasource="#odbc#">
	Select *
	FROM rTable WITH (NOLOCK) 
	where 
	<cfif arguments.ho neq "" or arguments.ho neq "all">
		rtable.id = #arguments.ho# and 
	</cfif>
	rTable.site = #arguments.site#

	</cfquery>
	
	<cfquery name="GetHop" datasource="#odbc#">
		Select * from pTable
		DO = '#arguments.on#'
		
	</cfquery>
	
	<cfset myStruct = StructNew()>
        <cfset myStruct.firstSelectBox = ValueList(GetProcType.name)>
        <cfset myStruct.secondSelectBox = ValueList(GetHop.text)>
          
<cfreturn myStruct>
</cffunction>
</cffunction>

Open in new window

0
Comment
Question by:roger_v
  • 2
3 Comments
 
LVL 4

Accepted Solution

by:
docnica earned 500 total points
ID: 34170728

ok a bind with cfselect looks like this:

<cfselect tabindex="6" name="IDModelo" bind="cfc:datos.getModelo({IDMarca})" class="ui-autocomplete-input ui-widget ui-widget-content ui-corner-all" style="width:200px;" />

datos is the name of the cfc

getModelo is the name of the function

IDMarca, is the ID you pass from the parent select box and must match the name of the selectbox. So in your case, the HRType select box

<select name="ProcessType"  bind="cfc:nameofcfc.myFunc({HRType})">

binded selectboxes are filled by the cfc, so as you see in mine, you do not need to use cfoutput and option tags.

the function would look like this

<!--- obtenemos los modelos de vehiculos --->
   <cffunction name="getModelo" access="remote" returnType="array">
      <cfargument name="IDMarca" type="numeric" required="true">

      <!--- Define variables --->
      <cfset var data="">
      <cfset var result=ArrayNew(2)>
      <cfset var i=0>

      <!--- Get data --->
      <cfquery name="data" datasource="#THIS.dsn#">
      SELECT IDModelo, Modelo
      FROM Modelo
      WHERE IDMarca = #ARGUMENTS.IDMarca#
      ORDER BY Modelo
      </cfquery>
   
      <!--- Convert results to array --->
      <cfloop index="i" from="1" to="#data.RecordCount#">
         <cfset result[i][1]=data.IDModelo[i]>
         <cfset result[i][2]=data.Modelo[i]>
      </cfloop>

you can bind whatever quantity of select boxes to the same parent, so if you need 2 or 3 select boxes to change based on one, just pass the ID

Open in new window

0
 
LVL 4

Expert Comment

by:docnica
ID: 34170730
sorry i posted everithing as code, but for some reason the site gave me errors the normal way
0
 
LVL 1

Author Closing Comment

by:roger_v
ID: 34278645
Although this didn't address my exact issue, it did give me some pointers
0

Featured Post

3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article  is about submitting  form through  ColdFusion.Ajax.submitForm to the action page and send a response back in JSON format which later can be decoded using ColdFusion.JSON.decode. By this way you can avoid the usual page refresh for subm…
This is an updated version of a post made on my blog over 3 years ago. It is unfortunately, still very relevant as we continue to see both SQLi (SQL injection) and XSS (cross site scripting) attacks hitting some of the most recognizable website and …
This Micro Tutorial will give you a basic overview how to record your screen with Microsoft Expression Encoder. This program is still free and open for the public to download. This will be demonstrated using Microsoft Expression Encoder 4.
Finds all prime numbers in a range requested and places them in a public primes() array. I've demostrated a template size of 30 (2 * 3 * 5) but larger templates can be built such 210  (2 * 3 * 5 * 7) or 2310  (2 * 3 * 5 * 7 * 11). The larger templa…

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question