From 5248be92268e343dc0bacafd4c15de0c79d1f592 Mon Sep 17 00:00:00 2001 From: Daniel Hensby Date: Thu, 8 Dec 2016 16:46:15 +0000 Subject: [PATCH] FIX Handle fields with square brackets --- forms/Form.php | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/forms/Form.php b/forms/Form.php index 403195fe5..cb9d62785 100644 --- a/forms/Form.php +++ b/forms/Form.php @@ -1418,6 +1418,7 @@ class Form extends RequestHandler { if(is_object($data)) $this->record = $data; // dont include fields without data + /** @var FormField[] $dataFields */ $dataFields = $this->Fields()->dataFields(); if($dataFields) foreach($dataFields as $field) { $name = $field->getName(); @@ -1450,15 +1451,31 @@ class Form extends RequestHandler { $val = $data[$name]; } // If field is in array-notation we need to access nested data - else if(strpos($name,'[')) { - // First encode data using PHP's method of converting nested arrays to form data - $flatData = urldecode(http_build_query($data)); - // Then pull the value out from that flattened string - preg_match('/' . addcslashes($name,'[]') . '=([^&]*)/', $flatData, $matches); + else if(preg_match_all('/(.*)\[(.*)\]/U', $name, $matches)) { + //discard first match which is just the whole string + array_shift($matches); - if (isset($matches[1])) { - $exists = true; - $val = $matches[1]; + $keys = array_pop($matches); + $name = array_shift($matches); + $name = array_shift($name); + + if (array_key_exists($name, $data)) { + $tmpData = &$data[$name]; + // drill down into the data array looking for the corresponding value + foreach ($keys as $arrayKey) { + if ($arrayKey !== '') { + $tmpData = &$tmpData[$arrayKey]; + } else { + //empty square brackets means new array + if (is_array($tmpData)) { + $tmpData = array_shift($tmpData); + } + } + } + if ($tmpData) { + $val = $tmpData; + $exists = true; + } } } }