Массивы ColdFusion, сохранение значений

У меня есть одна форма с таблицей и кнопкой «ДОБАВИТЬ ЭЛЕМЕНТЫ». При нажатии «ДОБАВИТЬ ЭЛЕМЕНТЫ» открывается вторая форма, в которой пользователь может добавить детали. При нажатии «Отправить» на 2-й странице детали должны быть добавлены в виде новой строки в таблицу на первом экране. Я использую массив и структуру для добавления/добавления в массив.

Каждый раз, когда пользователь пытается добавить новую строку, я создаю новую структуру в существующем массиве (на странице 1) и пытаюсь отобразить массив на первой странице.

<cfset arrayRequisition[k] = StructNew() />     
<cfset arrayRequisition[k].Part_Nbr = #Variables.ReqDescription# />     
<cfset arrayRequisition[k].Description = #Variables.EQT_DESCRIPTION# />     
<cfset arrayRequisition[k].Quantity = #Variables.RQT_QUANTITY# />   
<cfset arrayRequisition[k].Status = "pending" />    
<cfset arrayRequisition[k].Line_No = #i# /> 

Здесь K — количество строк, добавляемых и увеличивающихся каждый раз. Однако я получаю сообщение об ошибке, когда делаю это:

"Поле массива 1 не найдено".

Когда я исправляю это, в таблице отображается только последняя строка.

<cfoutput>
 <table border="1">
  <tr>
    <td style="font-weight:bold;">Part_Nbr&nbsp;&nbsp;</td>
    <td style="font-weight:bold;">Description&nbsp;&nbsp;</td>
    <td style="font-weight:bold;">Quantity&nbsp;&nbsp;</td>
    <td style="font-weight:bold;">Status&nbsp;&nbsp;</td>
    <td style="font-weight:bold;">Line_No</td>
  </tr> 
  <cfdump var="#i#">
  <cfloop from="1" to="#arrayLen(arrayRequisition)#" index="j">
  <cfdump var="#arrayLen(arrayRequisition)#">
  <tr>
   <td>#arrayRequisition[j].Part_Nbr#</td>
   <td>#arrayRequisition[j].Description#</td>
   <td>#arrayRequisition[j].Quantity#</td>
   <td>#arrayRequisition[j].Status#</td>
   <td style="text-align:right;">#arrayRequisition[j].Line_No#</td>
 </tr>
 </cfloop>
 </table>
 </cfoutput> 

Насколько я понимаю, при переходе между двумя страницами мои предыдущие данные структуры/массива теряются. Как я могу сохранить значения моего массива в этом случае?


person user2286338    schedule 04.06.2013    source источник


Ответы (2)


Похоже, у вас есть два разных шаблона ColdFusion (файлы .cfm). Если это так, вам нужно понимать, что переменные, которые вы используете в своих шаблонах ColdFusion, доступны только во время этого запроса браузера. После запуска шаблонов ColdFusion и отправки ответа пользователю эти переменные «теряются». На этой странице представлен обзор жизненного цикла приложений ColdFusion: Элементы приложения ColdFusion.

Чтобы сохранить значения для последующих запросов, вы можете (это не полный список):

  • Передайте ВСЕ значения при каждой отправке формы
  • Храните ваши переменные в постоянной области, например session
  • Используйте базу данных для хранения значений

Затем, в зависимости от того, какой вариант вы выберете, ваши шаблоны ColdFusion необходимо будет изменить, чтобы сохранить значения в постоянном месте (ваш второй шаблон) и прочитать существующие значения из постоянного места (ваш первый шаблон).

Также можно было бы переписать весь процесс, чтобы использовать вызовы AJAX из одного шаблона ColdFusion. Где функции AJAX будут вызывать новую CFC ColdFusion, которую необходимо будет написать для управления обновлением и получением значений переменных. Однако я считаю, что этот вариант будет более обширным для вас.

person Miguel-F    schedule 04.06.2013

Убедитесь, что arrayRequisition действительно является массивом. Используя синтаксис, показанный в первом примере, CF создаст структуру, а не массив. Выполнение varName[x] = someVar фактически даст вам структуру с ключом значения переменной x

Чтобы создать массив, вам нужно создать структуру, содержащую ключи Part_nbr, Description и т. д., а затем вызвать arrayAppend( arrayRequisition, newStruct).

person Scott Stroz    schedule 04.06.2013