ColdFusion的(使用CFFORM更新阵列 - 更改值后提交)(Coldfusion (Upd

2019-10-18 13:38发布

我有一个简单的表格。 值是从数据库加载到一个数组,然后使用cfinput和cfselect标签来使字段编辑显示的整个表。 所以,我希望能够改变任何领域的向上和向下显示,然后点击提交,并显示改变字段,但没有什么是永远改变了表。 该表只是恢复到原来的和更改标签dissappear。 我不想让用户使用seperately一个单独的形式更新每个字段。 我想有整个页面更新在一次提交。

有什么建议么:

<!--- **** LOAD ARRAY FROM DATABASE  ********************************** --->

    <cfset AssignArray = ArrayNew(2)>

    <cfset i=1>
    <cfoutput query="getAssignments">
        <cfset AssignArray[i][1]="#getAssignments.Assignment#">
        <cfset AssignArray[i][2]="#getAssignments.Baylor#">
        <cfset i = i + 1>
    </cfoutput>

<!--- **** FORM WITH TABLE OF VALUES TO CHANGE  ********************************** --->

    <table border="0" cellspacing="0">
        <caption>Update Assignments</caption>

    <cfform name="formData">
    <table>
      <tr><th>#</th><th>Assignment</th><th>Name</th></tr>
      <cfloop from="1" to= "#getAssignments.RecordCount#" index="i">
         <tr>
            <td class="centercell"><cfoutput>#i#</cfoutput></td>
            <td><cfinput class="assignSize" type="text" name="Assignment"
                    maxlength="70" 
                   value="#AssignArray[i][1]#"></td>
            <td><cfselect class="assignFont" name="Name" query="getNames" 
                    display="Name" value="Baylor" selected="#TRIM(AssignArray[i][2])#">
                     <cfif AssignArray[i][2] neq "">
                         <option value="">Not Assigned</option>
                     <cfelse>
                         <option value="" selected="selected" >Not Assigned</option>
                     </cfif>
                 </cfselect>
            </td>
        </tr>
      </cfloop>
    </table>    

      <cfinput class="btnStyle" type="submit" name="submit" value="Update">
    </cfform>

    <!--- ****DUMP FORM WITH CHANGED VALUES  ************************************ --->

    <cfif IsDefined ("form.Assignment")>
        <cfif IsDefined ("form.submit")>

          <table>
          <tr><th>#</th><th>Assignment</th><th>Name</th></tr>
          <cfloop from="1" to= "#getAssignments.RecordCount#" index="i">
             <tr>
                 <td class="centercell"><cfoutput>#i#</cfoutput></td>
                 <td><cfoutput>#AssignArray[i][1]#</cfoutput></td>
                 <td><cfoutput>#AssignArray[i][2]#</cfoutput></td>
              </tr>
          </cfloop>
          </table>    
        </cfif>
    </cfif>

Answer 1:

当我想要做你正在尝试什么,我组织它是这样的。

第1步 - 运行查询。 确保你选择的记录标识符。

<cfquery name="MyQuery">
select id, field1, field2, etc
</cfquery>

第2步 - 打造您的形式。 使用id字段来跟踪什么是什么。

<cfform>
<cfoutput query="MyQuery">
<input type="hidden" name="ExistingField1#id#" Value="#Field1#">
<input name = Field1#id# Value="#Field1#>
etc
</cfform>

现在,让我们假设表单已经提交。 寻找变化,如果你发现任何更新。

<cfloop list="#form.fieldnames#" index = "ThisField">
<cfif left(ThisField, 6) is "Field1">
<!--- The next line will get the record identifier --->
<cfset ThisId = Right(ThisField, Len(ThisField) - 6)>
<cfif form["Field1#ThisId#"] is not form["ExistingField1#ThisId#"]
or form["Field2#ThisId#"] is not form["ExistingField2#ThisId#"]
etc>
update query goes here
three closing tags go here.

还有其他一些细节,如确认提交的数据,但这应该让你开始。



Answer 2:

你不必查询复制到一个数组中? 只要使用

<cfloop query="getAssignments">

or 

<cfoutput query="getAssignments">

然后你就可以在直接比较<cfif len(trim(getAssignments.assignment)) GT 0>或任何你需要做的,使之对你有意义。

我还要避免使用<CFFORM>...我们大多数人的CF乡亲它一般和普遍鄙视。 表单将工作的伟大。 如果你想要额外的特殊效果使用jquery。

如果您希望看到的是选择什么将设在形式上面范围的情况。 换一种说法

<cfif structKeyExists(form, 'assignment')>

<cfoutput>
#form.assignsize#
#form.name# 
</cfoutput>

</cfif>

您的选择框的名称是“名”,这是令人困惑的。 把它的东西更容易获得在诸如“schoolName”。


华莱士 - 确定我明白你正在尝试做的,但你需要一些东西。 首先,你需要一些JavaScript(可能)来跟踪更改。 其次,你需要“名”的形式与一些独特的元素。 您提交的表单中包含“assignment_#schoolid#”的名字。

这就是你想与你的#currentrow#变量做 - 而是因为它是从数据库中断开,并最终会搞砸了你的数据这是站不住脚的。 您的示例很可能将需要报废和重新开始。 此链接可能的帮助。

http://www.coldfusionmuse.com/index.cfm/2011/1/5/form.loop.update.dataset



Answer 3:

......而这就是为什么我用数组,因为我料想他会要求和更新(SQL更新)的每一行的数据是不同的/独特。 我希望通过使用cfselect等数组击败系统..使这一切在发生一次,然后把数组中的更改回数据库

它不工作的方式。 在CF阵列重建每次页面加载,并请求之间不存在。 它们只存在,而你正在生成<form> 一旦<form>被发送回客户端/浏览器,要从服务器断开连接和阵列都消失了。 要访问用户输入新的价值观,你必须处理提交的表单字段(不是数组)。

在你的情况,你应该使用唯一的字段名。 所以,你可以跟踪每个“行”或领域的“设置”。 要做到这一点的方法之一是一个计数器变量追加到字段名。 行存放在一个隐藏字段数(主查询循环外)。

<form name="formData" method="post" action="debug.cfm">
     <cfoutput query="getAssignments">
        row = #currentRow#

        Assignment 
        <input type="text" name="UniqueRecordID_#currentRow#" value="#getAssignments.UniqueRecordID#">
        <input type="text" name="Assignment_#currentRow#" value="#getAssignments.Assignment#">
        <!--- note: this field should have a more descriptive name --->
        <select name="Name_#currentRow#">
            <option value="">Not Assigned</option>
            <cfloop query="getNames">
                <option value="#TheValueCol#" <cfif getNames.TheValueCol eq getAssignments.Baylor>selected="true"</cfif>>
                    #TheDisplayCol#
                </option>
            </cfloop>
        </select>
        <br>
    </cfoutput>

    <!--- store total number of rows --->
    <cfoutput>
       <input type="hidden" name="totalRows" value="#getAssignments.recordCount#">
    </cfoutput>
    <input type="submit" name="submit" value="Update">
</form> 

提交表单后,使用form.totalRows循环,并提取值。 在循环中,做任何你需要的价值观做(存储在数据库中,显示器,等...)

<cfif structKeyExists(FORM, "submit")>
    <cfparam name="form.totalRows" default="0">

    <cfloop from="1" to="#form.totalRows#" index="variables.row">
        <!--- get each set of values --->
            <cfset variables.ID = FORM["UniqueRecordID_"& variables.row]>
        <cfset variables.assignment = FORM["assignment_"& variables.row]>
        <cfset variables.name = FORM["Name_"& variables.row]>

        <!--- display changed values (insert them into a db, etc..) --->
        <cfoutput>
           row [#variables.row#] 
               id = #variables.id# 
               assignment = #variables.assignment# 
               name = #variables.name#<br>
        </cfoutput>
    </cfloop>
</cfif>


文章来源: Coldfusion (Update Array using CFForm - Change values after Submit)