Работаете с массивами форм в ColdFusion? - PullRequest
8 голосов
/ 27 мая 2010

Я понятия не имею, как с этим справиться в ColdFusion 9, у меня есть отправляемая форма (POST) с флажками элементов, которые называются items [].

Когда я делаю <cfdump var="#form#" /> без проблем, я получаю все предметы, показанные с именами, такими как items[] например:

struct 
ITEMS[] 13,14  
FIELDNAMES ITEMS[] 

однако выполнение <cfdump var="#form.items[]#" /> приводит к ошибке. Как получить доступ к значениям поля CF9? Каким-то образом пройти через это?

Кажется, я ничего не могу сделать с массивом, чтобы получить из него идентификатор? Мысли? Я немного озадачен, и ColdFusion не самый простой язык для поиска примеров / ссылок в сети. ;)

Есть ли правильный способ справиться с этим? Мне нужно получить оттуда идентификаторы, чтобы я мог ссылаться на строки, которые были проверены в форме, чтобы я мог выполнить действие.

Спасибо!

Ответы [ 7 ]

23 голосов
/ 27 мая 2010

В ColdFusion нет массивов форм. Наличие '[]' в конце не делает его массивом. Вы можете получить доступ к значениям флажков из области видимости, например так:

FORM["ITEMS[]"]

Точечная запись не работает, потому что '[]'. Смотри: http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec22c24-7fb2.html

Значения из флажков являются просто значениями, разделенными запятыми, то есть списком в ColdFusion

Чтобы пройти через него, используйте cfloop list =:

<cfoutput>
  <cfloop index="i" list="#FORM['ITEMS[]']#">    
    #i#
  </cfloop>
</cfoutput>

Чтобы преобразовать список в массив, используйте ListToArray () . Есть функции списка, такие как listGetAt(), но если вы делаете много произвольного доступа, было бы разумнее сначала преобразовать список в массив.

Мысли, я немного озадачен и Coldfusion не самый простой язык найти примеры / ссылки на нетто;)

3 голосов
/ 12 марта 2012

Я настоятельно рекомендую «Form Utils» Брайана Котека для таких случаев, как: http://www.briankotek.com/blog/index.cfm/2007/9/4/Implicit-Creation-of-Arrays-and-Structures-from-Form-Fields

Я использую это в каждом создаваемом приложении, потому что работа с массивами и структурами на стороне отправки формы намного предпочтительнее работы со списками, imo.

2 голосов
/ 08 марта 2016

Если у вас есть список идентификаторов, он работает нормально, но если у вас есть массив с запятыми, вы застряли.

В этом случае вы можете использовать метод Java getParameterValues.

<cfdump var="#getPageContext().getRequest().getParameterValues('ITEMS')#">

Это даст вам стандартный массив CF, который вы можете использовать.

2 голосов
/ 19 марта 2012

Также обратите внимание, что в мире ajax, если вы json кодируете все тело почтового запроса, а не отдельные поля формы, это может быть любая произвольная структура данных, которую можно легко получить на сервере. Фрагмент ниже показывает, как добраться до него из ColdFusion. Я не уверен насчет других языков, но это почти наверняка возможно.

Чтобы отправить подобное сообщение с помощью jQuery, JSON.stringify ваших данных, прежде чем передавать его в jQuery, как отмечено здесь и здесь .

Если вы создаете свой собственный запрос AJAX, изюминка будет:

xhr.send(JSON.stringify(data));

Чтобы получить доступ к этим данным на стороне сервера, в этом примере ColdFusion сначала ищется такое тело сообщения, закодированное в json, затем сообщение с данными json в поле формы «input», затем в поле url с тем же именем. Во всех случаях результирующие данные десериализуются и присваиваются локальному переменному 'input', который вы затем можете поместить в область запроса, 'rc' или в любое другое место, ожидаемое вашим кодом.

if (Find('application/json', cgi.content_type))
{
    input = ToString(GetHttpRequestData().content);
    if (IsJSON(input))
        input = DeserializeJSON(input);
}
else if (StructKeyExists(form, 'input') and IsJSON(form.input))
    input = DeserializeJSON(form.input);
else if (StructKeyExists(url, 'input') and IsJSON(url.input))
    input = DeserializeJSON(url.input);
2 голосов
/ 12 марта 2012

См. Также второй ответ здесь . Он описывает, как получить значения из поля с несколькими экземплярами в форме в виде массива. Я должен сказать, что я работаю в CFML уже много лет, и мне еще предстоит сделать это самому или увидеть, как это делается в любом приложении, над которым я работал. Я думаю, что это просто потому, что избегать запятых намного проще, но если вы не можете или не хотите обойти это таким образом, это возможно.

0 голосов
/ 09 сентября 2017

Я предлагаю удалить «[]» из имени, поскольку оно запрещает точечную нотацию, как указано в другом ответе. Если несколько элементов формы содержат один и тот же атрибут name, браузер объединит все значения в строке с разделителями-запятыми при отправке формы. К счастью, в ColdFusion есть много функций, которые обрабатывают строку с разделителями как список. Вы можете использовать <cfloop> вместе с этими функциями, чтобы использовать список.

0 голосов
/ 14 июня 2016

Для ColdFusion 10+, если вы используете настройку sameformfieldsasarray в вашем Application.cfc, например:

component {
    this.name = "testingzone2c";
    this.sameformfieldsasarray=true;
}

Вы получите фактический массив полей формы с тем же именем.

Отсутствует функция ColdFusion 10 - поля и массивы форм

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...