ColdFusion Form Array с запятой в переменной - PullRequest
3 голосов
/ 03 февраля 2011

В настоящее время в форме имеются флажки, а значения выбранных флажков хранятся в БД при отправке формы.

<td><input type="Checkbox" name="valueList" value="Some value, with comma"   >Some value, with comma</td> 
<td><input type="Checkbox" name="valueList" value="Another Value, with comma"   >Another value, with comma</td> 
<td><input type="Checkbox" name="valueList" value="Yet another value"   >Yet another value</td>

Однако проблема заключается в запятых, поскольку текущая логика использует список для хранения этих значений. Таким образом, Some value, with comma вставляется как Some value и with comma. Текущий список создается со следующим:

<cfif isDefined("valueList")>
<cfset a=listlen(valueList)>

И код продолжается, просматривая список. Это единственная ссылка на valueList, которую я смог найти в коде. Есть ли способ преобразовать это в массив без запятых, становящихся проблемой?

Ответы [ 3 ]

9 голосов
/ 21 марта 2011

На самом деле - это способ извлечения данных в виде массива. Если ваш enctype является application / x-www-form-urlencoded (enctype по умолчанию), тогда вам нужна только одна строка:

<cfset myArray = getPageContext().getRequest().getParameterValues('my_form_or_url_field_name')>

Если ваш enctype является multipart / form-data (это тип, который вы используете при загрузке файлов), то все немного сложнее. Вот функция, которую я написал, которая будет возвращать значения формы и URL с заданным именем в виде массива для любого энктипа:

<cffunction name="FormFieldAsArray" returntype="array" output="false" hint="Returns a Form/URL variable as an array.">
    <cfargument name="fieldName" required="true" type="string" hint="Name of the Form or URL field" />

    <cfset var tmpPartsArray = Form.getPartsArray() />
    <cfset var returnArray = arrayNew(1) /> 
    <cfset var tmpPart = 0 />
    <cfset var tmpValueArray = "" >

    <!--- if the getPartsArray method did not return NULL, then this is a multipart/form-data request, which must be handled as such. --->
    <cfif IsDefined("tmpPartsArray")>
        <cfloop array="#tmpPartsArray#" index="tmpPart">
            <cfif tmpPart.isParam() AND tmpPart.getName() EQ arguments.fieldName>
                <cfset arrayAppend(returnArray, tmpPart.getStringValue()) />
            </cfif>
        </cfloop>
    </cfif>

    <!--- Add the values that maybe on the URL with the same name, also if this *wasn't* a multipart/form-data request then
    the above code did not get any of the data, and the method below will return all of it. --->
    <cfset tmpValueArray = getPageContext().getRequest().getParameterValues(arguments.fieldName) />

    <!--- that may have returned null, so need to test for it. --->
    <cfif IsDefined("tmpValueArray")>
        <cfloop array="#tmpValueArray#" index="tmpPart">
            <cfset arrayAppend(returnArray, tmpPart) />
        </cfloop>
    </cfif>

    <cfreturn returnArray />
</cffunction>
1 голос
/ 04 февраля 2011

Разделитель (в данном случае запятая) должен не присутствовать в данных, потому что тогда почти невозможно определить, где один элемент начинается, а другой заканчивается.Лучшее решение - использовать для флажка value что-то еще.Например, если описания взяты из таблицы базы данных, используйте числовой идентификатор записи вместо длинного текстового описания.Тогда это будет не проблема.

1 голос
/ 04 февраля 2011

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

<td><input type="Checkbox" name="valueList" value="Some value~ with comma"   >Some value, with comma</td> 
<td><input type="Checkbox" name="valueList" value="Another Value~ with comma"   >Another value, with comma</td> 
<td><input type="Checkbox" name="valueList" value="Yet another value"   >Yet another value</td>

Итак, когда форма придет, она будет выглядеть следующим образом:

form.valueList = "Some value~ with comma, Another Value~ with comma, Yet another value";

Это код для получения нужного массива:

<cfscript>
  variables.myArrayList = ListToArray(form.valueList);
  for(i=1; i LTE ArrayLen(variables.myArrayList); i=i+1)
  {
    variables.myArrayList[i] = ReplaceNoCase(variables.myArrayList[i],"~",",","all");
  } 
</cfscript>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...