Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 967
  • Last Modified:

CF Bind for cascading select boxes - experts only!

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
roger v
Asked:
roger v
  • 2
1 Solution
 
docnicaCommented:

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
 
docnicaCommented:
sorry i posted everithing as code, but for some reason the site gave me errors the normal way
0
 
roger vAuthor Commented:
Although this didn't address my exact issue, it did give me some pointers
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now