From a10d553b4e785e762fb6cc733ddb9645be56750b Mon Sep 17 00:00:00 2001 From: SharkyKZ Date: Fri, 21 Feb 2020 08:19:11 +0200 Subject: [PATCH 1/2] Fix submitting forms with empty repeatable subforms --- libraries/src/Form/Form.php | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/libraries/src/Form/Form.php b/libraries/src/Form/Form.php index a92c866172478..6edebd91d8832 100644 --- a/libraries/src/Form/Form.php +++ b/libraries/src/Form/Form.php @@ -1564,13 +1564,16 @@ protected function filterField($element, $value) $field = $this->loadField($element); $subForm = $field->loadSubForm(); - if ($field->multiple && !empty($value)) + if ($field->multiple) { $return = array(); - foreach ($value as $key => $val) + if ($value) { - $return[$key] = $subForm->filter($val); + foreach ($value as $key => $val) + { + $return[$key] = $subForm->filter($val); + } } } else @@ -2155,17 +2158,20 @@ protected function validateField(\SimpleXMLElement $element, $group = null, $val $field = $this->loadField($element); $subForm = $field->loadSubForm(); - if ($field->multiple && $value) + if ($field->multiple) { - foreach ($value as $key => $val) + if ($value) { - $val = (array) $val; + foreach ($value as $key => $val) + { + $val = (array) $val; - $valid = $subForm->validate($val); + $valid = $subForm->validate($val); - if ($valid === false) - { - break; + if ($valid === false) + { + break; + } } } } From 59fed21c5e633cbe72729ff6a4687ae83fee73d0 Mon Sep 17 00:00:00 2001 From: SharkyKZ Date: Fri, 21 Feb 2020 09:12:25 +0200 Subject: [PATCH 2/2] Use the validation rule --- libraries/src/Form/Form.php | 41 ++++++++----------------------------- 1 file changed, 9 insertions(+), 32 deletions(-) diff --git a/libraries/src/Form/Form.php b/libraries/src/Form/Form.php index 6edebd91d8832..f71995bcf3f43 100644 --- a/libraries/src/Form/Form.php +++ b/libraries/src/Form/Form.php @@ -1559,7 +1559,7 @@ protected function filterField($element, $value) $return = call_user_func($filter, $value); } - elseif ($element['type'] == 'subform') + elseif ((string) $element['type'] === 'subform') { $field = $this->loadField($element); $subForm = $field->loadSubForm(); @@ -2153,41 +2153,18 @@ protected function validateField(\SimpleXMLElement $element, $group = null, $val } } - if ($valid !== false && $element['type'] == 'subform') + if ($valid !== false && (string) $element['type'] === 'subform') { - $field = $this->loadField($element); - $subForm = $field->loadSubForm(); + // Load the subform validation rule. + $rule = $this->loadRuleType('SubForm'); - if ($field->multiple) - { - if ($value) - { - foreach ($value as $key => $val) - { - $val = (array) $val; - - $valid = $subForm->validate($val); - - if ($valid === false) - { - break; - } - } - } - } - else - { - $valid = $subForm->validate($value); - } + // Run the field validation rule test. + $valid = $rule->test($element, $value, $group, $input, $this); - if ($valid === false) + // Check for an error in the validation test. + if ($valid instanceof \Exception) { - $errors = $subForm->getErrors(); - - foreach ($errors as $error) - { - return $error; - } + return $valid; } }