1

我有一个简单的表格。值从数据库加载到数组中,然后使用 cfinput 和 cfselect 标签显示整个表,以允许进行字段编辑。因此,我希望能够更改显示的表格上下的任何字段,然后单击提交并显示更改的字段,但没有任何更改。该表只是恢复到原始状态,并且对标签的更改消失了。我不想让用户使用单独的表单单独更新每个字段。我想在一次提交中更新整个页面。

有什么建议么:

<!--- **** 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>
4

3 回答 3

0

当我想做你正在尝试的事情时,我会像这样组织它。

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

还有一些其他细节,例如验证提交的值,但这应该可以帮助您入门。

于 2013-08-30T00:11:37.943 回答
0

您不需要将查询复制到数组中吗?只需使用

<cfloop query="getAssignments">

or 

<cfoutput query="getAssignments">

然后,您可以直接比较 in<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

于 2013-08-29T18:56:43.297 回答
0

...这就是我使用数组的原因,因为我认为对于不同/唯一的数据,每一行都需要和更新(sql 更新)。我希望通过使用带有 cfselect 等的数组来击败系统,使其一次全部发生,然后将数组中的更改发送回数据库

它不是那样工作的。每次页面加载时都会重建 CF 数组,并且不会在请求之间持续存在。它们仅在您生成<form>. 一旦<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>
于 2013-08-30T00:36:21.900 回答