2
votes

I'm new to the newer versions of ColdFusion and I'm having issues with a simple databind to a cfselect. I've done my best to thoroughly research it and I've even gone back to a textbook and essentially duplicated the code example in a test file and I still get the same error.

I'm trying to build the common situation where there are 2 cfselects and the second is dependent on the first, but at this point, I can't even get the first to work. The error returned is:

"Bind failed for select box Species_id, bind value is not a 2D array or valid serialized query"

Thanks in advance for any help. Here is the code:

<cfcomponent>
    <cffunction name="getSpecies" access="remote" returnType="array">
    <cfset var rsData = "">
    <cfset var myReturn=ArrayNew(2)>
    <cfset var i=0>
      <cfstoredproc datasource="#application.dsn#" procedure="up_get_Species">
            <cfprocresult name="DataResults">
        </cfstoredproc>
    <cfloop query="DataResults">
        <cfset myReturn[rsData.currentRow][1]=rsData.Species_id>
        <cfset myReturn[rsData.currentRow][2]=rsData.Species>
    </cfloop>
    <cfreturn myReturn>
    </cffunction>
</cfcomponent>

<html>
<head>
    <title>CFSelect Example</title>
</head> 
<body>
<h1>Sandbox for getting cfselect bind working</h1>
<cfform name="form1">
Wood Type
<br>
<cfselect name="Species_id" bind="office.cfc:data.getspecies()"
    bindOnLoad = "true" />
</cfform>
</body>
</html>
1
Couple of points. First you should var the DataResults variable in your cfc. Second, if you haven't done so already, make sure your cfc method returns the expected result by calling it from coldfusion before you try to use it in a bind. It makes troubleshooting easier.Dan Bracuk

1 Answers

2
votes

It looks like your bind syntax is off. The bind expression should start with the type: of bind (cfc, url, javascript). Since you are binding to a component, you must preface it with "cfc:", ie

     bind="cfc:path.to.yourComponentName.yourFunctionName()"

That said, later versions of CF support binding to a query, which simplifies binding. Just change the function returnType to query.

<cffunction name="getSpecies" access="remote" returnType="query">
     <!--- Be sure to Local scope all variables, including query names --->
     <cfstoredproc datasource="#application.dsn#" procedure="up_get_Species">
          <cfprocresult name="Local.DataResults">
     </cfstoredproc>

     <cfreturn Local.DataResults >
</cffunction>

Then specify the display and value attributes in your select list.

<cfselect name="service" 
          bind="cfc:office.cfc:data.getSpecies()"
          display="Species"
          value="Species_id" ...>