【问题标题】:Coldfusion (Update Array using CFForm - Change values after Submit)Coldfusion(使用 CFForm 更新数组 - 提交后更改值)
【发布时间】:2013-08-29 18:46:40
【问题描述】:

我有一个简单的表格。值从数据库加载到数组中,然后使用 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>

【问题讨论】:

  • 你所说的“改变”是什么意思?您的意思是在页面重新加载时保留用户的选择吗?
  • 您的 cfform 标签没有 action 属性。
  • 如果省略“action”,cfform 会将值默认为当前页面。

标签: arrays coldfusion cfform


【解决方案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.

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

【讨论】:

  • 三个结束标签放在这里。这比仅仅输入结束标签要花更多的字符;-)
【解决方案2】:

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

<cfloop query="getAssignments">

or 

<cfoutput query="getAssignments">

然后您可以直接比较 &lt;cfif len(trim(getAssignments.assignment)) GT 0&gt; 或您需要做的任何事情以使其对您有意义。

我也会避免使用&lt;CFFORM&gt;...,我们大多数 CF 人员普遍普遍鄙视它。表格会很好用。如果您想要额外的特殊效果,请使用 jquery。

在上述情况下,如果您想查看选择的内容,它将位于表单范围内。换句话说

<cfif structKeyExists(form, 'assignment')>

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

</cfif>

您的选择框的名称是“名称”,这令人困惑。将其称为“schoolName”之类的更容易理解的名称。


Wallace - 好的,我了解您想要做什么,但您需要做一些事情。首先,您需要一些 javascript(可能)来跟踪您的更改。其次,您需要用独特的东西“命名”您的表单元素。您将提交一个名称如“assignment_#schoolid#”的表单。

这是您尝试对 #currentrow# 变量执行的操作 - 但这不成立,因为它与数据库断开连接,最终会破坏您的数据。您的示例可能需要废弃并重新开始。此链接可能会有所帮助。

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

【讨论】:

  • 我很欣赏这些快捷方式。那么,我没有办法使用上面的代码方法完成更改多个字段吗?
  • 华莱士 - 我不确定你到底想做什么。如果您的意思是您希望更改下拉选择以更改表单中的其他内容(文本字段或 innerHTML),那么您将需要一些 JS 代码来完成此操作。但我想我不清楚你的最终目标。
  • 上一页,我可能对每一行都有一个更新按钮,这会将我带到另一个页面以仅更新该记录,从而使多次更新非常耗时。因此,例如,我希望在一页上显示整个表格,例如 25 行/4 列。然后,用户选择第 5 行并仅更改记录 5 的两列。他更改了两个文本字段,可能还有一个下拉菜单或其他任何内容,然后转到第 15 行并从该行随机更改两个字段。他在页面上来回执行此操作,然后单击提交,整个内容立即更新,然后在提交后显示整个表格
  • ...这就是我使用数组的原因,因为我认为 需要为每一行更新(sql update)以获取不同/唯一的数据。我希望通过使用带有 cfselect 等的数组来击败系统。让它一次发生,然后将数组中的更改发送回数据库
  • Wallace 我在我的答案中添加了一个附录,您可能会觉得它有用。
【解决方案3】:

...这就是我使用数组的原因,因为我认为每行数据都需要和更新(sql 更新) 那是不同的/独特的。我希望通过使用 带有 cfselect 等的数组。使其立即发生,然后发送 将数组中的更改返回数据库

这种方式是行不通的。每次页面加载时都会重建 CF 数组,并且不会在请求之间持续存在。它们仅在您生成&lt;form&gt; 时存在。一旦&lt;form&gt; 被发送回客户端/浏览器,您将与服务器断开连接并且阵列消失。要访问用户输入的值,您必须处理提交的 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    相关资源
    最近更新 更多