Hi,
I have a query string with multiple values https://example.com?field1=value1&field1=value2&field1=value3
Just wondering how to grab the values (of field1) from the Request object. I have tried Request.GetFormMultiple and Request.GetFormMultipleCollection with no success. It seems Request.Params returns only the first value.
Thanks.
Those are query string values not form values, so that's why GetFormMultiple()
and GetFormMultipleCollection()
aren't working. There's no support for retrieving multiple QueryString Values.
Where are those values coming from? If you're generating them from the a <form>
use method="POST"
:
<form action="" method="post" class="form-horizontal" id="form1">
Well actually... here's a hack you can make this work even with Query String. You can cheat by assigning the QueryString to the Form buffer and then you can use the Form methods:
lcFirstField1 = Request.QueryString("field1") && can only get first value
*** add query string values to Form buffer so we can use Form Methods
Request.cFormVars = "&" + Request.QueryString()
*** Now you can use Form values
loVars = loRequest.GetFormMultipleCollection("field1")
*** 3
lnCount = loVars.Count
+++ Rick ---
Ok, I'm adding a wwRequest
method that handles this with a dedicated method:
************************************************************************
* QueryStringMultipleCollection
****************************************
*** Function: Retrieves multiple query string values that have the
*** same key name as a collection.
*** Assume:
*** Pass: lcKey - The key with multiple values to retrieve
*** Return: Collection (0 items if no items)
************************************************************************
FUNCTION QueryStringMultipleCollection(lcKey)
LOCAL loValues, lcPoint, lcFind, lnAt, lcValue, lnX
loValues = CREATEOBJECT("Collection")
lcPointer = "&" + THIS.cQueryString
lcFind = "&"+STRTRAN(lcKey," ","+")+"="
lnAt = ATC(lcFind,lcPointer)
IF lnAt = 0
RETURN 0
ENDIF
DO WHILE lnAt > 0
lcValue = GetUrlEncodedKey(lcPointer,lcKey)
loValues.Add(lcValue)
lcPointer = SUBSTR(lcPointer,lnAt + LEN(lcFind))
lnAt = ATC(lcFind,lcPointer)
ENDDO
RETURN loValues
ENDFUNC
* QueryStringMultipleCollection
Here's the documentation (for next update):
+++ Rick ---
It worked. Thanks so much.
Hi Rick, A quick follow up question. The function returns a **Collection ** object. Is it possible to get the list of items like **ToArray ** method on the **wwCollection ** object or do I have to loop through to get values i.e. any helper method to get the values as an array?
Thanks
Uh, you have to loop through an Array too, no? What is it that you need about an array that you can't get a from collection?
No there won't be an array version - the GetFormMultiple()
array version is really there only because it was the original legacy. I wouldn't return arrays for anything these days.
+++ Rick ---
I was calling a library that required a string array. Have got it working with the Collection object. Thanks
FWIW, I added a CollectionToArray()
function to wwutils that will automate that - I thought that was already there, but turned out it wasn't.
Then again manual looping isn't too complicated 😄 You can add this to your wwutils.prg
if you like until the next update provides it:
************************************************************************
* CollectionToArray
****************************************
*** Function: Turns a collection into a 1 dimensional array
*** Assume:
*** Pass: @laArray - an array var that will be created
*** loCollection - a collection to read from
*** Return: count of records
************************************************************************
FUNCTION CollectionToArray(laArray, loCollection)
LOCAL lnCount, lnX
IF VARTYPE(loCollection) != "O"
DIMENSION laArray[1] && empty array
RETURN 0
ENDIF
lnCount = loCollection.Count
DIMENSION laArray[lnCount]
FOR lnX = 1 TO lnCount
laArray[lnX] = loCollection[lnX]
ENDFOR
RETURN lnCount
ENDFUNC
* CollectionToArray
+++ Rick ---