arrays - Coldfusion(Actualizar Matriz usando CFForm-Cambiar los valores después de Enviar)
(3)
Tengo una forma simple. Los valores se cargan de una base de datos en una matriz y luego toda la tabla se muestra usando las etiquetas cfinput y cfselect para permitir la edición de campo. Por lo tanto, esperaba poder cambiar cualquier campo arriba y abajo de la tabla que se muestra y luego hacer clic en ENVIAR y visualizar los campos modificados, pero nunca se cambia nada. La tabla simplemente vuelve al original y los cambios en las etiquetas desaparecen. No quiero que el usuario actualice cada campo por separado con una forma separada. Me gustaría tener toda la actualización de la página en una sola presentación.
Alguna sugerencia:
<!--- **** 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>
... y por eso utilicé la matriz porque pensé que requeriría y actualizaría (actualización SQL) para cada fila los datos que son diferentes / únicos. Tenía la esperanza de vencer al sistema mediante el uso de una matriz con cfselect, etc. para que ocurra todo de una vez y luego enviar los cambios en la matriz a la base de datos
No funciona de esa manera. Los arreglos CF se reconstruyen cada vez que se carga la página, y no persisten entre las solicitudes. Solo existen mientras estás generando la <form>
. Una vez que la <form>
se envía de vuelta al cliente / navegador, usted se desconecta del servidor y las matrices se han ido. Para acceder a los nuevos valores ingresados por el usuario, debe procesar los campos de formulario enviados (no la matriz).
En su caso, debe usar nombres de campo únicos. Para que pueda realizar un seguimiento de cada "fila" o "conjunto" de campos. Una forma de hacerlo es agregar una variable de contador a los nombres de campo. Almacene el número de filas en un campo oculto (fuera del bucle de consulta principal).
<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>
Después de enviar el formulario, use form.totalRows para repetir y extraer los valores. Dentro del ciclo, haga lo que tenga que hacer con los valores (almacenar en la base de datos, mostrar, etc.)
<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>
Cuando quiero hacer lo que estás intentando, lo organizo de esta manera.
Paso 1: ejecuta una consulta. Asegúrese de seleccionar el identificador de registro.
<cfquery name="MyQuery">
select id, field1, field2, etc
</cfquery>
Paso 2: crea tu formulario. Use el campo de identificación para realizar un seguimiento de qué es qué.
<cfform>
<cfoutput query="MyQuery">
<input type="hidden" name="ExistingField1#id#" Value="#Field1#">
<input name = Field1#id# Value="#Field1#>
etc
</cfform>
Ahora, supongamos que el formulario ha sido enviado. Busque los cambios y actualice si encuentra alguno.
<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.
Hay otros detalles, como la validación de los valores enviados, pero esto debería ayudarlo a comenzar.
No necesita copiar su consulta en una matriz? Solo usa
<cfloop query="getAssignments">
or
<cfoutput query="getAssignments">
Luego puede comparar directamente como en <cfif len(trim(getAssignments.assignment)) GT 0>
o lo que sea necesario para que tenga sentido para usted.
También evitaría el uso de <CFFORM>...
la mayoría de nosotros, los CF, generalmente lo despreciamos universalmente. Una forma funcionará bien. usa jquery si quieres efectos especiales adicionales.
En el caso anterior si desea ver qué se selecciona, se ubicará en el alcance del formulario. En otras palabras
<cfif structKeyExists(form, ''assignment'')>
<cfoutput>
#form.assignsize#
#form.name#
</cfoutput>
</cfif>
El nombre de su cuadro de selección es "nombre", lo cual es confuso. Llámalo algo más fácil de obtener como "schoolName".
Wallace - vale, entiendo lo que intentas hacer, pero necesitas algunas cosas. Primero necesitas algo de javascript (probablemente) para rastrear tus cambios. En segundo lugar, debe "nombrar" los elementos de su formulario con algo único. Presentará un formulario con nombres como "assignment_ # schoolid #".
Es lo que estás tratando de hacer con tu variable # currentrow #, pero eso no es defendible porque está desconectado de la base de datos y eventualmente arruinará tus datos. Tu ejemplo probablemente tendrá que ser eliminado y comenzar de nuevo. Este enlace puede ayudar.
http://www.coldfusionmuse.com/index.cfm/2011/1/5/form.loop.update.dataset