2011-02-03 5 views
3

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

<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, которую я мог найти в коде. Есть ли способ преобразовать это в массив без запятой, которые становятся проблемой?

ответ

1

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

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

Если вы не уверены в значениях или они определяются пользователем, то тильда так же плохо. Мой коллега придумал самые смешные разделители, такие как <(|)>, чтобы разобраться с глупыми списками ColdFusions. – scragz

1

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

+0

Вы правы, но это предполагает, что он исходит из базы данных в первую очередь. Есть еще много ситуаций, когда нужно вводить список вещей, содержащих запятые. – Teekin

+0

Да, но вы все равно можете обойти его, назначив временное числовое значение. Затем используйте числовое значение. Не совсем так же изящно, как с использованием идентификатора базы данных;) Но похожее понятие. – Leigh

9

Фактически там является способом получения данных в виде массива. Если ENCTYPE является применение/х-WWW-форм-urlencoded (ENCTYPE по умолчанию), то вам нужно всего лишь одну строку:

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

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

<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> 
Смежные вопросы