From 25f3127886f0a787970c08a2b3ff9eabfc23d3f3 Mon Sep 17 00:00:00 2001
From: Elmar Ludwig <elmar.ludwig@uni-osnabrueck.de>
Date: Thu, 28 Mar 2024 08:47:25 +0000
Subject: [PATCH] pass questions_data as JSON string and fix invalid values,
 fixes #3526, #3691, #3460

Closes #3526, #3691, and #3460

Merge request studip/studip!2771
---
 app/controllers/questionnaire.php              |  2 +-
 .../5.3.23_fix_questionnaire_questiondata.php  | 18 ++++++++++++++++++
 .../assets/javascripts/lib/questionnaire.js    |  2 +-
 3 files changed, 20 insertions(+), 2 deletions(-)
 create mode 100644 db/migrations/5.3.23_fix_questionnaire_questiondata.php

diff --git a/app/controllers/questionnaire.php b/app/controllers/questionnaire.php
index 66a4e0b6ad5..d0766ed132d 100644
--- a/app/controllers/questionnaire.php
+++ b/app/controllers/questionnaire.php
@@ -148,7 +148,7 @@ class QuestionnaireController extends AuthenticatedController
             : null;
 
         $this->questionnaire['user_id'] = User::findCurrent()->id;
-        $questions_data = Request::getArray('questions_data');
+        $questions_data = json_decode(Request::get('questions_data'), true);
         $questions = [];
         foreach ($questions_data as $index => $question_data) {
             $class = $question_data['questiontype'];
diff --git a/db/migrations/5.3.23_fix_questionnaire_questiondata.php b/db/migrations/5.3.23_fix_questionnaire_questiondata.php
new file mode 100644
index 00000000000..be115fc0a92
--- /dev/null
+++ b/db/migrations/5.3.23_fix_questionnaire_questiondata.php
@@ -0,0 +1,18 @@
+<?php
+
+class FixQuestionnaireQuestiondata extends Migration
+{
+    public function description()
+    {
+        return 'fix invalid boolean values in questionnaire_questions';
+    }
+
+    public function up()
+    {
+        DBManager::get()->exec("
+            UPDATE questionnaire_questions
+            SET questiondata = REPLACE(questiondata, ':\"false\"', ':false')
+            WHERE questiondata LIKE '%:\"false\"%'
+        ");
+    }
+}
diff --git a/resources/assets/javascripts/lib/questionnaire.js b/resources/assets/javascripts/lib/questionnaire.js
index 2bca8c628aa..08d3a7565d7 100644
--- a/resources/assets/javascripts/lib/questionnaire.js
+++ b/resources/assets/javascripts/lib/questionnaire.js
@@ -86,7 +86,7 @@ const Questionnaire = {
                             }
                             $.post(STUDIP.URLHelper.getURL('dispatch.php/questionnaire/store/' + (this.data.id || '')), {
                                 questionnaire: data,
-                                questions_data: questions,
+                                questions_data: JSON.stringify(questions),
                                 range_type: this.range_type,
                                 range_id: this.range_id
                             }).done(() => {
-- 
GitLab