2016-04-27 62 views
3

首先,我不僅是全新的SO,但我也是全新的任何一種網絡編程,所以總newb,感謝你的幫助和耐心!因此,以前零HTML,ColdFusion,SQL,SQL Server等的經驗,所以我在過去的兩週內學到的東西。動態依賴/三重相關在ColdFusion中選擇,第三不選擇第一個選擇

我想在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 =「映射文件」沿),因此,在過去的查詢,我可以做到以下幾點:

<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.

下面是第三個下拉列表的截圖,顯示雖然選擇了「返回河」,但它將拉動2個支流的File_html,同樣的日期: screenshot of 3rd dropdown not holding 1st dropdown select

我也開始研究javascript版本,但我也被困在這個,因爲這是如此接近我繼續工作在這種方法。但是,如果用這種方法做三重相關選擇是不可能的,我將不得不繼續前進!

任何幫助都會非常棒,謝謝! -B (抱歉,很長的文章,只是想徹底)

+1

沒事就好的東西很難開始。你說'我遇到的問題是,第三個下拉菜單似乎沒有依賴於第一個下拉選擇。如果你有3個選擇,不應該第3個取決於第2個而不是第2個? –

+0

我知道,對吧?是和不是,我想我希望第三個選擇依賴於第一個和第二個。所以你選擇了一個'支流',然後你選擇了'CruiseDate',第三個下拉框應該填入與'Tributary和CruiseDate'相關的數據的'File_html'鏈接,但是現在它填充了任何支流的鏈接在那天取樣。 – Becalecca

+0

這是我看到使用2個參數的地方,但我無法使它工作: https://forums.adobe.com/thread/886531?start=0&tstart=0 – Becalecca

回答

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

(編輯)幹得好。你的意思是隻過濾CruiseDate ='#ARGUMENTS.mapfile#''上的第三個查詢嗎?注意,不要忘記在所有*查詢參數上使用cfqueryparam(sql注入保護),並在有機會時給jQuery一個外觀。它比*中的CF UI功能*更脆弱* – Leigh

+0

因爲我不知道你的意思是過濾查詢,可能不是!到目前爲止,我對這一切都非常瞭解。我確實對jQuery有所暗示,我必須回去努力嘗試,因爲這聽起來像是一個更好的方法。感謝cfqueryparam的提醒,我會在最終決定之前將它們添加到其他地方。 – Becalecca

+1

過濾,即'限制哪些記錄查詢返回的'WHERE'子句條件:)由於該函數接受兩個參數,我想(可能是錯誤的),您希望查詢僅*返回匹配提供的CruiseDate和Tributary值。在這種情況下,兩個參數都需要包含在WHERE子句中。忽略cfqueryparam和psuedo-sql,類似於WHERE CruiseDate ='#arguments.nameOfFirstArgument#'和Tributary ='#arguments.nameOfOtherArgument#'。 – Leigh

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 

您的第三個選擇綁定將類似於此:

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' 

注意使用查詢變量的參數。

+0

感謝您的幫助。首先,我意識到我在代碼中引用了錯誤的CFC,所以我糾正了這種錯誤(所以上面的代碼粘貼應該說'GettingData'而不是'UsingBook')。是的,你是對的,有一個叫做「身份證」的PK,所以我在你有「身份證」的地方使用「身份證」來跟蹤你的指示。我得到了2個綁定錯誤:錯誤:綁定:綁定選擇框CruiseDate失敗,匹配在cfselect標籤上指定的值或顯示屬性的列在查詢中不存在,並且 錯誤:bind:綁定失敗,找不到元素:ID' – Becalecca

+0

通過向第二個查詢添加*(幸運的是表很小),第二個下拉菜單正在工作,我擺脫了第一個錯誤。但我仍然得到'錯誤:綁定:綁定失敗,未找到元素:ID'和第三個下拉列表不填充。 – Becalecca

+0

那麼你現在有正確的做法。你只需要通過細節。爲了幫助,您可能只想在使用javascript嘗試之前使用coldfusion代碼來測試您的cfc函數。這樣,如果出現問題,您至少知道該功能是否正常。 –