2013-08-29 2 views
1

У меня простая форма. Значения загружаются из базы данных в массив, а затем вся таблица отображается с использованием cfinput и cfselect тегов, чтобы разрешить редактирование полей. Таким образом, я надеялся, что смогу изменить любые поля вверх и вниз по отображаемой таблице, а затем нажать «SUBMIT» и отобразить измененные поля, но ничего не изменилось. Таблица просто возвращается к оригиналу, и изменения в тегах исчезают. Я не хочу, чтобы пользователь обновлял каждое поле отдельно, используя отдельную форму. Я хотел бы иметь полное обновление страницы в одном представлении.Coldfusion (обновление массива с использованием CFForm - изменение значений после отправки)

Любые предложения:

<!--- **** 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> 
+0

Что вы подразумеваете под «изменением»? Вы хотите сохранить выбор пользователя при перезагрузке страницы? – Leigh

+0

Ваш тэг cfform не имеет атрибута действия. –

+0

Если вы опустите «действие», cfform по умолчанию присваивает значение текущей странице. – Leigh

ответ

0

Вам не нужно скопировать запрос в массив? Просто используйте

<cfloop query="getAssignments"> 

or 

<cfoutput query="getAssignments"> 

Тогда вы можете сравнить непосредственно, как в <cfif len(trim(getAssignments.assignment)) GT 0> или все, что вы должны сделать, чтобы иметь смысл для вас.

Я бы также избегал использования <CFFORM>..., что в целом и повсеместно презирают большинство из нас. Форма будет работать отлично. используйте jquery, если вы хотите получить дополнительные специальные эффекты.

В вышеуказанном случае, если вы хотите увидеть, что выбрано, оно будет находиться в области формы. Другими словами

<cfif structKeyExists(form, 'assignment')> 

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

</cfif> 

Имя вашего поля выбора - это «имя», которое сбивает с толку. Назовите это чем-то более легким, чтобы получить как "schoolName".


Уоллес - хорошо Я понимаю, что вы пытаетесь сделать, но вам нужно несколько вещей. Сначала вам нужен javascript (возможно), чтобы отслеживать ваши изменения. Во-вторых, вам нужно «называть» ваши элементы формы чем-то уникальным. Вы отправите форму с именами типа «assign_ # schoolid #».

Это то, что вы пытаетесь сделать со своей переменной # currentrow #, но это невозможно, потому что она отключена от БД и в конечном итоге испортит ваши данные. Ваш пример, вероятно, придется отменить и начать. Эта ссылка может помочь.

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

+0

Я ценю ярлыки. Итак, для меня нет возможности выполнить изменение нескольких полей с использованием вышеописанного метода кода? –

+1

Уоллес - Я не уверен, что вы пытаетесь сделать именно так. Если вы имеете в виду, что вы ожидаете изменить свой выпадающий выбор, чтобы изменить что-то еще в форме (текстовое поле или innerHTML), для этого вам понадобится код JS. Но я думаю, что я НЕ ОТНОСИТЕЛЬНО твоей конечной цели. –

+0

Prev, у меня может быть обновление buttn для каждой строки, которая приведет меня на другую страницу, чтобы обновлять эту запись, делая многократные обновления времени. Так, например, я надеялся отобразить целую таблицу, такую ​​как 25 строк/4 столбца на одной странице. Затем пользователь выбирает строку 5 и изменяет только два столбца для записи 5. Он изменяет два текстовых поля и, возможно, одно выпадающее меню или что-то еще, а затем переходит к строке 15 и случайным образом изменяет два поля из этой строки. Он делает это взад и вперед по странице, а затем нажимает кнопку «Отправить», и вся информация обновляется сразу, а затем вся таблица отображается после отправки –

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. 

Есть некоторые другие данные, такие как подтверждение представленных значений, но это должно вас начать.

+0

* три закрывающих тега идут сюда. * Это заняло больше символов, чем просто набрав закрытие тегов ;-) – Leigh

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> 

После того, как форма отправлена, используйте форму. 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> 
Смежные вопросы