From fd17f87a57ea5a949adb188a22b865b690f02932 Mon Sep 17 00:00:00 2001 From: Benjamin Renard Date: Mon, 17 Oct 2022 17:29:36 +0200 Subject: [PATCH] LSformElement::jsonCompositeAttribute: fix handling empty value & $onlyIfPresent parameter --- ...s.LSformElement_jsonCompositeAttribute.php | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/includes/class/class.LSformElement_jsonCompositeAttribute.php b/src/includes/class/class.LSformElement_jsonCompositeAttribute.php index 523413f9..71d40ace 100644 --- a/src/includes/class/class.LSformElement_jsonCompositeAttribute.php +++ b/src/includes/class/class.LSformElement_jsonCompositeAttribute.php @@ -242,18 +242,24 @@ class LSformElement_jsonCompositeAttribute extends LSformElement { // Extract value form POST data $parseValues = array(); + $present = false; // API mode if ($this -> form -> api_mode) { + $present = isset($_POST[$this -> name]); $json_values = $this -> getData($_POST, $this -> name); - if (!is_array($json_values) || empty($json_values)) { - self :: log_trace($this." -> getPostData(): not in POST data"); - return true; - } + self :: log_trace( + $this." -> getPostData(onlyIfPresent=".($onlyIfPresent?1:0)."): ". + "raw JSON values = ".varDump($json_values) + ); $json_value_count = 0; - foreach($json_values as $json_value) { + foreach((is_array($json_values)?$json_values:array()) as $json_value) { $json_value_count += 1; $input_value = json_decode($json_value, true); + self :: log_trace( + $this." -> getPostData(onlyIfPresent=".($onlyIfPresent?1:0)."): ". + "raw JSON value #$json_value_count = ".varDump($input_value) + ); if (!is_array($input_value)) { $this -> form -> setElementError( $this -> attr_html, @@ -290,13 +296,19 @@ class LSformElement_jsonCompositeAttribute extends LSformElement { } // Ignore empty value from form - if (empty($unemptyComponents)) + if (empty($unemptyComponents)) { + $this -> form -> setElementError( + $this -> attr_html, + getFData(_('JSON value #%{idx} is invalid (or empty).'), $json_value_count) + ); continue; + } $parseValues[] = $parseValue; } } elseif (is_array($_POST[$this -> name.'__values_uuid'])) { + $present = true; // HTML form mode foreach ($_POST[$this -> name.'__values_uuid'] as $uuid) { $parseValue = array(); @@ -330,6 +342,7 @@ class LSformElement_jsonCompositeAttribute extends LSformElement { } } + $return[$this -> name] = array(); // Check extracted values foreach ($parseValues as $parseValue) { // Check component value @@ -351,6 +364,14 @@ class LSformElement_jsonCompositeAttribute extends LSformElement { $return[$this -> name][] = json_encode($parseValue); } + if (!$present && $onlyIfPresent) { + self :: log_trace( + $this." -> getPostData(onlyIfPresent=".($onlyIfPresent?1:0)."): ". + "not present in POST data, ignore it." + ); + unset($return[$this -> name]); + } + return true; }