ColdFusion中的Dynamic Dependent / Triple Related选择,第三次不选择

时间:2016-04-27 15:05:40

标签: drop-down-menu coldfusion

首先,我不仅仅是SO的新手,但我对任何类型的网络编程都是全新的,所以全新的,感谢您的帮助和耐心!所以,之前没有使用过HTML,ColdFusion,SQL,SQL Server等的经验,所以我在过去两周内学到了很多东西。

我正在尝试在ColdFusion中创建3个动态相关下拉菜单(三个相关选择),最终最终在另一个.CFM页面中打开一个地图。下拉列表从SQL Server中的一个表填充。 我已经做了很多研究(这里有SO和其他地方),我有一个主要工作的方法,但它有一个问题,我很乐意帮助弄清楚为什么有一件事不起作用。我正在使用.CFC查询数据库中每个下拉菜单的信息,我正在尝试使每个依赖于前一个,然后在.CFM我使用“绑定”。这是我的CFC和CFM代码:

CFC(名为GettingData):

<cfcomponent displayname="GetStuff" hint="Getting data on cruises from database">
   <!---GET ARRAY OF TRIBUTARIES--->
   <cffunction name="getData" access="remote"  returntype="query" hint="Get data for first select">
      <!---define variables--->
      <cfset var data="tributary">
      <!---Run the query for tributaries--->
      <cfquery name="data" datasource="mydatasource">
         SELECT distinct Tributary
         FROM df_cruises
         ORDER BY Tributary
      </cfquery>
      <!---and return it--->
      <cfreturn data>
   </cffunction>
   <!---Get DATES by tributary--->
   <cffunction name="getDates" access="remote" returntype="query" 
      hint="Get cruise dates by tributary for select dropdown">
      <cfargument name="Tributary" type="any" required="no">
      <!---Define variables--->
      <cfset var data="CruiseDate">
      <!---Run query to get Date Data--->
      <cfquery name="data" datasource="mydatasource">
         SELECT *, CruiseDate AS date <!---this gets date to display correctly in dropdown--->
         FROM df_cruises
         WHERE Tributary='#ARGUMENTS.Tributary#'<!---single quotes for SQL Server--->
         ORDER BY CruiseDate desc
      </cfquery>
      <!---And return it--->
      <cfreturn data>
   </cffunction>
   <!---getting the html file based on the cruisedate selection--->
   <cffunction name="getmapname" access="remote" returntype="query" 
      hint="Get html file by tributary and cruisedate for dropdown select">
      <cfargument name="Tributary" type="any" required="no">
      <cfargument name="mapfile" type="any" required="no">
      <!---Define variables--->
      <cfset var data="">
      <cfset var data="">
      <!---Get file html Data--->
      <cfquery name="data" datasource="mydatasource">
         SELECT CruiseDate, Tributary, File_html
         FROM df_cruises
         WHERE CruiseDate='#ARGUMENTS.mapfile#'AND Tributary='#ARGUMENTS.Tributary#'AND File_html<>'notsampled'
      </cfquery>
      <!---And return it--->
      <cfreturn data>
   </cffunction>
</cfcomponent>

CFM(名为DropdownDisplay):

<cfparam name="url.File_html" default = '2'>
<cfform name="CruiseChoose" action="mapdisplayv3.cfm" method="post">
   <table align="center" bgcolor="orange">
      <tr>
         <th colspan="2">
            <font size="+1">First Select a Water Body, Then Choose Cruise Date</font>
         </th>
      </tr>
      <tr>
         <td>
            <br/>
            Tributary/Water Body:<br />
            <cfselect name="Tributary" 
               bind="cfc:GettingData.getData()"
               display="Tributary"
               value="Tributary"
               bindonload="true"
               multiple="no"
               size="6" />
         </td>
         <td>
            <br />
            Cruise Dates:<br />
            <cfselect name="CruiseDate"
               bind="cfc:GettingData.getDates({Tributary})"
               bindonload="false"
               type="link"
               display="date"
               value="CruiseDate"
               multiple="no"
               size="6"/>
         </td>
         <td>
            <br>
            Map Links:<br />
            <cfselect name="link"
               bind="cfc:GettingData.getmapname({CruiseDate},{Tributary})"
               bindonload="false"
               type="any"
               display="File_html"
               value="File_html"
               multiple="no"
               size="3"/>
         </td>
      </tr>
      <tr>
         <td colspan="2" align="center">
            <br />
            </form>
            <!--- submit button ---> 
            <cfoutput>  <input type="submit" name="submit" value="View Selected Maps" alt="View Map Selection Button"><br></cfoutput>
            <!--- Reset button. ---> 
            <input name="reset" type="reset" value="Clear Selections" alt="Clear Selections Button">
         </td>
      </tr>
   </table>
</cfform>
</html>

第一个下拉列表是提取支流列表,当选择“支流”时,第二个下拉列表会在采样时正确填充“CruiseDates”列表。第三个下拉列表应该填充表格中的“File_html”,这将成为在另一个CFM上打开数据图像映射的链接。 (这不是我的最终目标,这就是我的宝贝 - 踩到我的路上。)

我遇到的问题是,第三个下拉列表似乎没有依赖于第一个下拉选择(支流),因此当选择CruiseDate时,其中两个支流恰好在同一天被采样File_html名称显示在第三个下拉列表中(屏幕截图): 在CFC中,在“getmapname”函数中,我尝试使用2个参数(我在网上某处看到过),以便我可以重用参数(以及cfargument name =&#34; mapfile&#34;)以便在上一个查询中,我可以执行以下操作:

<cfquery name="data" datasource="mydatasource">
    SELECT CruiseDate, Tributary, File_html
    FROM df_cruises
    WHERE CruiseDate='#ARGUMENTS.mapfile#' AND Tributary='#ARGUMENTS.Tributary#'
    AND File_html<>'notsampled'
</cfquery>

这不起作用。当我有2个参数时,我得到错误,它似乎只允许1.

这是第三个下拉列表的屏幕截图,显示尽管&#39; Back River&#39;如果被选中,它会为同一日期采样的2条支流拉取File_html: screenshot of 3rd dropdown not holding 1st dropdown select

我也开始研究javascript版本,但我也坚持这一点,因为这是如此接近我继续研究这个方法。但是,如果使用这种方法不可能做三重相关的选择,我将不得不继续前进!

任何帮助都会非常精彩,谢谢! -B (对不起,很长的帖子,只是想彻底)

2 个答案:

答案 0 :(得分:2)

感谢大家的帮助和耐心,我得到了2个参数,第3个下拉列表现在只返回它应该的数据(即它正确地绑定到第一个和第二次下拉)。谢谢! 以下是有效的新代码:

CFC:

<cfcomponent displayname="GetStuff" hint="Getting data on cruises from database">
   <!---GET ARRAY OF TRIBUTARIES--->
   <cffunction name="getData" access="remote"  returntype="query" hint="Get data for first select">
      <!---define variables--->
      <cfset var data="tributary">
      <!---Run the query for tributaries--->
      <cfquery name="data" datasource="mydatasource">
         SELECT distinct Tributary
         FROM df_cruises
         ORDER BY Tributary
      </cfquery>
      <!---and return it--->
      <cfreturn data>
   </cffunction>
   <!---Get DATES by tributary--->
   <cffunction name="getDates" access="remote" returntype="query" >
      <cfargument name="Tributary" type="any" required="no">
      <!---Define variables--->
      <cfset var data="CruiseDate">
      <!---Run query to get Date Data--->
      <cfquery name="data" datasource="mydatasource">
         SELECT *, CruiseDate AS date 
         FROM df_cruises
         WHERE Tributary=
         <cfqueryparam cfsqltype='cf_sql_varchar' value='#ARGUMENTS.Tributary#'>
         ORDER BY CruiseDate desc
      </cfquery>
      <!---And return it--->
      <cfreturn data>
   </cffunction>
   <!---getting the html file based on the CruiseDate selection--->
   <cffunction name="getmapname" access="remote" returntype="query" >
      <cfargument name="mapfile" type="any" required="no" default="">
      <cfargument name="Tributary" type="any" required="no" default="">
      <!---Define variables--->
      <cfset var data="">
      <!---Get file html Data--->
      <cfquery name="data" datasource="mydatasource">
         SELECT CruiseDate, Tributary, File_html
         FROM df_cruises
         WHERE CruiseDate=<cfqueryparam cfsqltype='cf_sql_date' value='#ARGUMENTS.mapfile#'> AND Tributary=<cfqueryparam cfsqltype='cf_sql_varchar' value='#ARGUMENTS.Tributary#'> AND File_html<><cfqueryparam cfsqltype="cf_sql_varchar" value='notsampled'>
      </cfquery>
      <!---And return it--->
      <cfreturn data>
   </cffunction>
</cfcomponent>

CFM:

<cfparam name="url.File_html" default = '2'>
<cfform name="CruiseChoose" action="mapdisplayv3.cfm" method="post">
   <table align="center" bgcolor="orange">
      <tr>
         <th colspan="2">
            <font size="+1">First Select a Water Body, Then Choose Cruise Date</font>
         </th>
      </tr>
      <tr>
         <td>
            <br />
            Tributary/Water Body:<br />
            <cfselect name="Tributary" 
               bind="cfc:GettingData.getData()"
               display="Tributary"
               value="Tributary"
               bindonload="true"
               multiple="no"
               size="6" />
         </td>
         <td>
            <br />
            Cruise Dates:<br />
            <cfselect name="CruiseDate"
               bind="cfc:GettingData.getDates({Tributary})"
               bindonload="false"
               type="link"
               display="date"
               value="CruiseDate"
               multiple="no"
               size="6"/>
         </td>
         <td>
            <br>
            Map Links:<br />
            <cfselect name="link"
               bind="cfc:GettingData.getmapname({CruiseDate}, {Tributary})"
               bindonload="false"
               type="any"
               display="File_html"
               value="File_html"
               multiple="no"
               size="3"/>
         </td>
      </tr>
      <tr>
         <td colspan="2" align="center">
            <br />
            </form>
            <!--- submit button ---> 
            <cfoutput>  <input type="submit" name="submit" value="View Selected Maps" alt="View Map Selection Button"><br></cfoutput>
            <!--- Reset button. ---> 
            <input name="reset" type="reset" value="Clear Selections" alt="Clear Selections Button">
         </td>
      </tr>
   </table>
</cfform>
</html>

答案 1 :(得分:1)

从第二次选择的查询开始。

 SELECT *, CruiseDate AS date <!---this gets date to display correctly in dropdown--->
         FROM df_cruises
         WHERE Tributary='#ARGUMENTS.Tributary#'<!---single quotes for SQL Server--->
         ORDER BY CruiseDate desc

我将假设表df_cruises有一个名为cruiseID的数字PK。将查询更改为:

 SELECT cruiseId
, CruiseDate AS date <!---this gets date to display correctly in dropdown--->
 FROM df_cruises
 WHERE Tributary= cfqueryparam cfsqltype="cf_sql_varchar" value="#ARGUMENTS.Tributary#">
ORDER BY CruiseDate desc

第3次选择的绑定将类似于:

bind="cfc:UsingBook.getmapname({cruiseId})"

您的最终查询是:

SELECT CruiseDate, Tributary, File_html
FROM df_cruises
WHERE cruiseID = cfqueryparam cfsqltype="cf_sql_integer"
value="#ARGUMENTS.cruiseID#>
AND File_html<>'notsampled'

请注意对变量使用查询参数。