From fb30430cc9fb10cdef0d8b3811fbb4e5d470d381 Mon Sep 17 00:00:00 2001
From: Carsten  Rose <carsten.rose@math.uzh.ch>
Date: Tue, 10 May 2016 13:30:07 +0200
Subject: [PATCH] DynamicUpdate for checkBoxMulti: not possible at the moment -
 a persistant store per browser tab is necessary. Some work already done.
 FillStoreForm.php: clientValues will be copied to STORE_FORM if
 mode=show|requiered or flag 'dynamicUpdate' is set. Fixed bug with additional
 ',' in collectMultiValues().

---
 extension/qfq/qfq/Constants.php           |  4 +-
 extension/qfq/qfq/store/FillStoreForm.php | 45 +++++++++++------------
 2 files changed, 24 insertions(+), 25 deletions(-)

diff --git a/extension/qfq/qfq/Constants.php b/extension/qfq/qfq/Constants.php
index 4a03414a0..c1a3c6661 100644
--- a/extension/qfq/qfq/Constants.php
+++ b/extension/qfq/qfq/Constants.php
@@ -45,7 +45,7 @@ const RETURN_ARRAY = 'return_array';
 
 const SQL_FORM_ELEMENT_SPECIFIC_CONTAINER = "SELECT *, ? AS 'nestedInFieldSet' FROM FormElement AS fe WHERE fe.formId = ? AND fe.deleted = 'no' AND FIND_IN_SET(fe.class, ? ) AND fe.feIdContainer = ? AND fe.enabled='yes' ORDER BY fe.ord, fe.id";
 const SQL_FORM_ELEMENT_ALL_CONTAINER = "SELECT *, ? AS 'nestedInFieldSet' FROM FormElement AS fe WHERE fe.formId = ? AND fe.deleted = 'no' AND FIND_IN_SET(fe.class, ? ) AND fe.enabled='yes' ORDER BY fe.ord, fe.id";
-const SQL_FORM_ELEMENT_SIMPLE_ALL_CONTAINER = "SELECT fe.id, fe.name, fe.label, fe.type, fe.checkType, fe.checkPattern, fe.mode, fe.modeSql, fe.parameter FROM FormElement AS fe, Form AS f WHERE f.name = ? AND f.id = fe.formId AND fe.deleted = 'no' AND fe.class = 'native' AND fe.enabled='yes' ORDER BY fe.ord, fe.id";
+const SQL_FORM_ELEMENT_SIMPLE_ALL_CONTAINER = "SELECT fe.id, fe.name, fe.label, fe.type, fe.checkType, fe.checkPattern, fe.mode, fe.modeSql, fe.parameter, fe.dynamicUpdate FROM FormElement AS fe, Form AS f WHERE f.name = ? AND f.id = fe.formId AND fe.deleted = 'no' AND fe.class = 'native' AND fe.enabled='yes' ORDER BY fe.ord, fe.id";
 
 // SANITIZE Classifier
 const SANITIZE_ALLOW_ALNUMX = "alnumx";
@@ -385,6 +385,8 @@ const FE_SUBRECORD_ROW_TITLE = '_rowTitle';
 const FE_TYPE = 'type';
 const FE_MODE = 'mode';
 const FE_MODE_SQL = 'modeSql';
+// TODO: Konstante FE_DYNAMIC_UPDATE ueberall einsetzen
+const FE_DYNAMIC_UPDATE = 'dynamicUpdate';
 
 // FormElement columns: via parameter field
 const FE_DATE_FORMAT = 'dateFormat';  // value: FORMAT_DATE_INTERNATIONAL | FORMAT_DATE_GERMAN
diff --git a/extension/qfq/qfq/store/FillStoreForm.php b/extension/qfq/qfq/store/FillStoreForm.php
index 8f6308b38..f86198c12 100644
--- a/extension/qfq/qfq/store/FillStoreForm.php
+++ b/extension/qfq/qfq/store/FillStoreForm.php
@@ -144,31 +144,22 @@ class FillStoreForm {
                 }
             }
 
-            switch ($formElement[FE_MODE]) {
-                case FE_MODE_REQUIRED:
-                case FE_MODE_SHOW:
-                    if (isset($clientValues[$clientFieldName])) {
-
-                        switch ($formElement[FE_TYPE]) {
-                            case 'date':
-                            case 'datetime':
-                            case 'time':
-                                if ($clientValues[$clientFieldName] !== '') // do not check empty values
-                                    $newValues[$formElement['name']] = $this->doDateTime($formElement, $clientValues[$clientFieldName]);
-                                break;
-                            default:
-                                $newValues[$formElement['name']] = Sanitize::sanitize($clientValues[$clientFieldName],
-                                    $formElement['checkType'], $formElement['checkPattern'], SANATIZE_EXCEPTION);
-                                break;
-                        }
+            // copy value to $newValues
+            if (isset($clientValues[$clientFieldName])) {
+                if ($formElement[FE_DYNAMIC_UPDATE] === 'yes' || $formElement[FE_MODE] === FE_MODE_REQUIRED || $formElement[FE_MODE] === FE_MODE_SHOW) {
+                    switch ($formElement[FE_TYPE]) {
+                        case 'date':
+                        case 'datetime':
+                        case 'time':
+                            if ($clientValues[$clientFieldName] !== '') // do not check empty values
+                                $newValues[$formElement['name']] = $this->doDateTime($formElement, $clientValues[$clientFieldName]);
+                            break;
+                        default:
+                            $newValues[$formElement['name']] = Sanitize::sanitize($clientValues[$clientFieldName],
+                                $formElement['checkType'], $formElement['checkPattern'], SANATIZE_EXCEPTION);
+                            break;
                     }
-                    break;
-
-                case FE_MODE_READONLY:
-                case FE_MODE_HIDDEN:
-                    continue;
-                default:
-                    throw new CodeException("Unknown mode: " . $formElement[FE_MODE], ERROR_UNKNOWN_MODE);
+                }
             }
         }
 
@@ -186,9 +177,11 @@ class FillStoreForm {
     private function collectMultiValues($clientFieldName, array $clientValues) {
 
         $checkboxKey = HelperFormElement::prependFormElementIdCheckBoxMulti($clientFieldName, 'h');
+
         // Check there is a hidden value with naming in checkbox multi syntax
         if (isset($clientValues[$checkboxKey])) {
             $checkboxValue = $clientValues[$checkboxKey];
+
             $pattern = '/' . HelperFormElement::prependFormElementIdCheckBoxMulti($clientFieldName, '\d+') . '/';
             foreach ($clientValues as $key => $value) {
                 if (1 === preg_match($pattern, $key)) {
@@ -196,6 +189,10 @@ class FillStoreForm {
                 }
             }
 
+            if (isset($checkboxValue[0]) && $checkboxValue[0] === ',') {
+                $checkboxValue = substr($checkboxValue, 1);
+            }
+
             $clientValues[$clientFieldName] = $checkboxValue;
         }
 
-- 
GitLab