驚艷於一個相容於ColdFusion,但是可免費商用的Railo,跌跌撞撞的研究過程,希望能有同好一起交流指教。

2011年6月27日 星期一

如何抓取動態產生的輸入欄位資料 input data to array

有時前端網頁<input 丟入後端程式時是動態產生的,這表示欄位名稱也是動態的,後端要怎樣判定欄位名稱與抓取資料呢?

之前好像某舊版ColdFusion可以直接前後端用矩陣做傳遞,但是年代久遠已經忘記作法了,試了幾次沒做出來就變通改用另一個方式來抓取資料。

test.cfm - 前端有待輸入的姓名跟成績若干個:欄位以 name_流水號 rank_流水號 命名



<CFOUTPUT>
<form action="test2.cfm" method="post">
   <CFSET sno =0>
   <CFLOOP from="1" to="5" index="iii">
      <CFSET sno = sno + 1 >
      姓名#sno#: <INPUT type="text" name="name_#sno#">
      成績#sno#: <INPUT type="text" name="rank_#sno#"><bR>
   </CFLOOP>
   <INPUT type="hidden" name="sno" value="#sno#">
   <INPUT type="submit">
</form>
</CFOUTPUT>



test2.cfm - 後端承接時用將欄位分別抓取下來丟到Array:



<CFOUTPUT>
<!--- 設定接收變數Array --->
<cfset getname=ArrayNew(1)>
<cfset getrank=ArrayNew(1)>
<CFLOOP from="1" to="#form.sno#" index="iii">
   <cfset getname[iii] = "">
   <cfset getrank[iii] = "">
</CFLOOP>

<!--- 如果有Form變數存在, 則進行分析, 將各資料放入對應的Array中 --->
<cfif isdefined('fieldnames') and fieldnames is not ''>
   <cfloop from="1" to="#listlen(fieldnames)#" index="ano">
      <!--- 利用底線_ 來區隔名稱與流水號 --->
      <CFSET wordFirst = ListFirst(listgetat(fieldnames,ano) , "_")>
      <CFSET wordNumber = ListLast(listgetat(fieldnames,ano) , "_")>

      <!--- 判定變數名, 也過濾掉非動態產生的Form變數 --->
      <CFIF wordFirst IS "name">
         <cfset getname[wordNumber] = #trim(evaluate(listgetat(fieldnames,ano)))#>
      <CFELSEIF wordFirst IS "rank">
         <cfset getrank[wordNumber] = #trim(evaluate(listgetat(fieldnames,ano)))#>
      </CFIF>
   </cfloop>
</cfif>

<!--- 結果輸出 --->
<TABLE border="1">
   <TR>
      <TD>姓名</TD>
      <TD>成績</TD>
   </TR>
   <CFLOOP from="1" to="#form.sno#" index="iii">
   <TR>
      <TD>#getname[iii]#</TD>
      <TD>#getrank[iii]#</TD>
   </TR>
   </CFLOOP>
</TABLE>

</CFOUTPUT>





輸出畫面:
test.cfm


test2.cfm



這樣前端的欄位不管怎麼長,用JavaScript產生也好、從資料庫撈出不同的資料筆數也好,只要是固定的欄位名稱加上流水號,後端都能抓到。



 

沒有留言:

張貼留言