From d7fafc10b8621c583061094919d147a4ea4be5ae Mon Sep 17 00:00:00 2001
From: Elmar Ludwig <elmar.ludwig@uni-osnabrueck.de>
Date: Fri, 24 May 2024 15:34:23 +0200
Subject: [PATCH] fix warnings on PHP 8, fixes #160

---
 exercises/cloze_exercise.php            |  2 +-
 exercises/lt_exercise.php               |  2 +-
 exercises/me_exercise.php               |  2 +-
 exercises/seq_exercise.php              |  2 +-
 exercises/tb_exercise.php               |  8 ++++++++
 lib/DummyExercise.php                   | 10 ++++++++--
 views/exercises/cloze_exercise/edit.php | 10 +++-------
 views/exercises/lt_exercise/edit.php    | 12 ++++--------
 views/exercises/seq_exercise/edit.php   |  8 ++------
 views/exercises/tb_exercise/edit.php    | 12 ++++++------
 views/exercises/tb_exercise/print.php   | 10 +++++-----
 views/sheets/print_assignment.php       |  5 +++++
 12 files changed, 45 insertions(+), 38 deletions(-)

diff --git a/exercises/cloze_exercise.php b/exercises/cloze_exercise.php
index 7ba11ca..3c6c9f3 100644
--- a/exercises/cloze_exercise.php
+++ b/exercises/cloze_exercise.php
@@ -194,7 +194,7 @@ class cloze_exercise extends Exercise
     {
         $template = parent::getViewTemplate($view, $solution, $assignment, $user_id);
 
-        if ($solution) {
+        if ($solution && $solution->id) {
             $template->results = $this->evaluateItems($solution);
         }
 
diff --git a/exercises/lt_exercise.php b/exercises/lt_exercise.php
index 1064612..746f272 100644
--- a/exercises/lt_exercise.php
+++ b/exercises/lt_exercise.php
@@ -235,7 +235,7 @@ class lt_exercise extends Exercise
     {
         $template = parent::getViewTemplate($view, $solution, $assignment, $user_id);
 
-        if ($solution) {
+        if ($solution && $solution->id) {
             $template->results = $this->evaluateItems($solution);
         }
 
diff --git a/exercises/me_exercise.php b/exercises/me_exercise.php
index 29c8c6e..9aa2c70 100644
--- a/exercises/me_exercise.php
+++ b/exercises/me_exercise.php
@@ -195,7 +195,7 @@ class me_exercise extends Exercise
     {
         $template = parent::getViewTemplate($view, $solution, $assignment, $user_id);
 
-        if ($solution) {
+        if ($solution && $solution->id) {
             $template->results = $this->evaluateItems($solution);
         }
 
diff --git a/exercises/seq_exercise.php b/exercises/seq_exercise.php
index 2373dc0..c4c478f 100644
--- a/exercises/seq_exercise.php
+++ b/exercises/seq_exercise.php
@@ -193,7 +193,7 @@ class seq_exercise extends Exercise
     {
         $template = parent::getViewTemplate($view, $solution, $assignment, $user_id);
 
-        if ($solution) {
+        if ($solution && $solution->id) {
             $template->results = $this->evaluateItems($solution);
         }
 
diff --git a/exercises/tb_exercise.php b/exercises/tb_exercise.php
index 950c21d..67a22c8 100644
--- a/exercises/tb_exercise.php
+++ b/exercises/tb_exercise.php
@@ -79,6 +79,14 @@ class tb_exercise extends Exercise
         }
     }
 
+    /**
+     * Return the layout of this task (text, markup, code or none).
+     */
+    public function getLayout()
+    {
+        return isset($this->task['layout']) ? $this->task['layout'] : 'text';
+    }
+
     /**
      * Evaluates a student's solution for the individual items in this
      * exercise. Returns an array of ('points' => float, 'safe' => boolean).
diff --git a/lib/DummyExercise.php b/lib/DummyExercise.php
index 8868f8a..b0e9f9c 100644
--- a/lib/DummyExercise.php
+++ b/lib/DummyExercise.php
@@ -42,7 +42,10 @@ class DummyExercise extends Exercise
      */
     public function getEditTemplate($assignment)
     {
-        return $GLOBALS['template_factory']->open('shared/string');
+        $template = $GLOBALS['template_factory']->open('shared/string');
+        $template->content = '';
+
+        return $template;
     }
 
     /**
@@ -50,6 +53,9 @@ class DummyExercise extends Exercise
      */
     public function getViewTemplate($view, $solution, $assignment, $user_id)
     {
-        return $GLOBALS['template_factory']->open('shared/string');
+        $template = $GLOBALS['template_factory']->open('shared/string');
+        $template->content = '';
+
+        return $template;
     }
 }
diff --git a/views/exercises/cloze_exercise/edit.php b/views/exercises/cloze_exercise/edit.php
index 485cf97..000302a 100644
--- a/views/exercises/cloze_exercise/edit.php
+++ b/views/exercises/cloze_exercise/edit.php
@@ -42,24 +42,20 @@
     <label>
         <?= _vips('Art des Textvergleichs') ?>
 
-        <? if ($exercise->task['compare']): ?>
-            <? $checked[$exercise->task['compare']] = 'selected' ?>
-        <? endif ?>
-
         <select name="compare" onchange="$(this).parent().next('label').toggle($(this).val() === 'numeric')">
             <option value="">
                 <?= _vips('Groß-/Kleinschreibung unterscheiden') ?>
             </option>
-            <option value="ignorecase" <?= $checked['ignorecase'] ?>>
+            <option value="ignorecase" <?= isset($exercise->task['compare']) && $exercise->task['compare'] === 'ignorecase' ? 'selected' : '' ?>>
                 <?= _vips('Groß-/Kleinschreibung ignorieren') ?>
             </option>
-            <option value="numeric" <?= $checked['numeric'] ?>>
+            <option value="numeric" <?= isset($exercise->task['compare']) && $exercise->task['compare'] === 'numeric' ? 'selected' : '' ?>>
                 <?= _vips('Numerischer Wertevergleich (ggf. mit Einheit)') ?>
             </option>
         </select>
     </label>
 
-    <label style="<?= $checked['numeric'] ? '' : 'display: none;' ?>">
+    <label style="<?= isset($exercise->task['compare']) && $exercise->task['compare'] === 'numeric' ? '' : 'display: none;' ?>">
         <?= _vips('Erlaubte relative Abweichung vom korrekten Wert') ?>
         <br>
         <input type="text" class="size-s" style="display: inline; text-align: right;"
diff --git a/views/exercises/lt_exercise/edit.php b/views/exercises/lt_exercise/edit.php
index f6beb31..10deffa 100644
--- a/views/exercises/lt_exercise/edit.php
+++ b/views/exercises/lt_exercise/edit.php
@@ -70,27 +70,23 @@
 <label>
     <?= _vips('Art des Textvergleichs') ?>
 
-    <? if ($exercise->task['compare']): ?>
-        <? $checked[$exercise->task['compare']] = 'selected' ?>
-    <? endif ?>
-
     <select name="compare" onchange="$(this).parent().next('label').toggle($(this).val() === 'numeric')">
         <option value="">
             <?= _vips('Groß-/Kleinschreibung ignorieren') ?>
         </option>
-        <option value="levenshtein" <?= $checked['levenshtein'] ?>>
+        <option value="levenshtein" <?= isset($exercise->task['compare']) && $exercise->task['compare'] === 'levenshtein' ? 'selected' : '' ?>>
             <?= _vips('Textähnlichkeit (Levenshtein-Distanz)') ?>
         </option>
-        <option value="soundex" <?= $checked['soundex'] ?>>
+        <option value="soundex" <?= isset($exercise->task['compare']) && $exercise->task['compare'] === 'soundex' ? 'selected' : '' ?>>
             <?= _vips('Ähnlichkeit der Aussprache (Soundex)') ?>
         </option>
-        <option value="numeric" <?= $checked['numeric'] ?>>
+        <option value="numeric" <?= isset($exercise->task['compare']) && $exercise->task['compare'] === 'numeric' ? 'selected' : '' ?>>
             <?= _vips('Numerischer Wertevergleich (ggf. mit Einheit)') ?>
         </option>
     </select>
 </label>
 
-<label style="<?= $checked['numeric'] ? '' : 'display: none;' ?>">
+<label style="<?= isset($exercise->task['compare']) && $exercise->task['compare'] === 'numeric' ? '' : 'display: none;' ?>">
     <?= _vips('Erlaubte relative Abweichung vom korrekten Wert') ?>
     <br>
     <input type="text" class="size-s" style="display: inline; text-align: right;"
diff --git a/views/exercises/seq_exercise/edit.php b/views/exercises/seq_exercise/edit.php
index 08d27cb..9f08d7f 100644
--- a/views/exercises/seq_exercise/edit.php
+++ b/views/exercises/seq_exercise/edit.php
@@ -35,18 +35,14 @@
 <label>
     <?= _vips('Verfahren zur Punktevergabe') ?>
 
-    <? if ($exercise->task['compare']): ?>
-        <? $checked[$exercise->task['compare']] = 'selected' ?>
-    <? endif ?>
-
     <select name="compare">
         <option value="">
             <?= _vips('Punkte nur bei vollständig korrekter Lösung') ?>
         </option>
-        <option value="position" <?= $checked['position'] ?>>
+        <option value="position" <?= isset($exercise->task['compare']) && $exercise->task['compare'] === 'position' ? 'selected' : '' ?>>
             <?= _vips('Punkte für Antworten an den korrekten Positionen') ?>
         </option>
-        <option value="sequence" <?= $checked['sequence'] ?>>
+        <option value="sequence" <?= isset($exercise->task['compare']) && $exercise->task['compare'] === 'sequence' ? 'selected' : '' ?>>
             <?= _vips('Punkte für Paare von Antworten in korrekter Reihenfolge') ?>
         </option>
     </select>
diff --git a/views/exercises/tb_exercise/edit.php b/views/exercises/tb_exercise/edit.php
index c2ab8cb..1071dcb 100644
--- a/views/exercises/tb_exercise/edit.php
+++ b/views/exercises/tb_exercise/edit.php
@@ -5,22 +5,22 @@
         <option value="">
             <?= _vips('Texteingabe - einfacher Text ohne Formatierungen') ?>
         </option>
-        <option value="markup" <? if ($exercise->task['layout'] === 'markup'): ?>selected<? endif ?>>
+        <option value="markup" <? if ($exercise->getLayout() === 'markup'): ?>selected<? endif ?>>
             <?= _vips('Texteingabe - Textformatierungen bei Eingabe der Lösung anbieten') ?>
         </option>
-        <option value="code" <? if ($exercise->task['layout'] === 'code'): ?>selected<? endif ?>>
+        <option value="code" <? if ($exercise->getLayout() === 'code'): ?>selected<? endif ?>>
             <?= _vips('Texteingabe - Programmcode (nichtproportionale Schriftart)') ?>
         </option>
-        <option value="none" <? if ($exercise->task['layout'] === 'none'): ?>selected<? endif ?>>
+        <option value="none" <? if ($exercise->getLayout() === 'none'): ?>selected<? endif ?>>
             <?= _vips('keine Texteingabe - nur Hochladen von Dateien erlauben') ?>
         </option>
     </select>
 </label>
 
-<label class="none-hidden" style="<?= $exercise->task['layout'] === 'none' ? 'display: none;' : '' ?>">
+<label class="none-hidden" style="<?= $exercise->getLayout() === 'none' ? 'display: none;' : '' ?>">
     <?= _vips('Vorgegebener Text im Antwortfeld') ?>
     <?= $this->render_partial('exercises/flexible_textarea',
-        ['name' => 'answer_default', 'value' => $exercise->task['template'], 'monospace' => $exercise->task['layout'] === 'code', 'wysiwyg' => $exercise->task['layout'] === 'markup']) ?>
+        ['name' => 'answer_default', 'value' => $exercise->task['template'], 'monospace' => $exercise->getLayout() === 'code', 'wysiwyg' => $exercise->getLayout() === 'markup']) ?>
 </label>
 
 <label>
@@ -28,7 +28,7 @@
     <textarea class="character_input size-l wysiwyg" name="answer_0" rows="<?= vips_textarea_size($exercise->task['answers'][0]['text']) ?>"><?= wysiwygReady($exercise->task['answers'][0]['text']) ?></textarea>
 </label>
 
-<div class="none-hidden" style="<?= $exercise->task['layout'] === 'none' ? 'display: none;' : '' ?>">
+<div class="none-hidden" style="<?= $exercise->getLayout() === 'none' ? 'display: none;' : '' ?>">
     <label>
         <?= _vips('Zeichenwähler') ?>
 
diff --git a/views/exercises/tb_exercise/print.php b/views/exercises/tb_exercise/print.php
index cf82852..391c411 100644
--- a/views/exercises/tb_exercise/print.php
+++ b/views/exercises/tb_exercise/print.php
@@ -1,4 +1,4 @@
-<? if ($exercise->task['layout'] !== 'none'): ?>
+<? if ($exercise->getLayout() !== 'none'): ?>
     <? if ($print_correction && $solution->commented_solution != '') : ?>
         <div class="label-text">
             <?= _vips('Kommentierte Lösung:') ?>
@@ -11,9 +11,9 @@
         </div>
 
         <div class="vips_output">
-            <? if ($exercise->task['layout'] === 'markup'): ?>
+            <? if ($exercise->getLayout() === 'markup'): ?>
                 <?= formatReady($response[0]) ?>
-            <? elseif ($exercise->task['layout'] === 'code'): ?>
+            <? elseif ($exercise->getLayout() === 'code'): ?>
                 <pre><?= htmlReady($response[0]) ?></pre>
             <? else: ?>
                 <?= htmlReady($response[0], true, true) ?>
@@ -25,9 +25,9 @@
         </div>
     <? else : ?>
         <div class="vips_output" style="min-height: 30em;">
-            <? if ($exercise->task['layout'] === 'markup'): ?>
+            <? if ($exercise->getLayout() === 'markup'): ?>
                 <?= formatReady($exercise->task['template']) ?>
-            <? elseif ($exercise->task['layout'] === 'code'): ?>
+            <? elseif ($exercise->getLayout() === 'code'): ?>
                 <pre><?= htmlReady($exercise->task['template']) ?></pre>
             <? else: ?>
                 <?= htmlReady($exercise->task['template'], true, true) ?>
diff --git a/views/sheets/print_assignment.php b/views/sheets/print_assignment.php
index 684230f..4fa307a 100644
--- a/views/sheets/print_assignment.php
+++ b/views/sheets/print_assignment.php
@@ -50,6 +50,11 @@
             <? $solution = $assignment->getSolution($user_id, $exercise->id); ?>
         <? endif ?>
 
+        <? if (!$solution): ?>
+            <? $solution = new VipsSolution(); ?>
+            <? $solution->assignment = $assignment; ?>
+        <? endif ?>
+
         <?= $this->render_partial('exercises/print_exercise', [
             'exercise'          => $exercise,
             'exercise_position' => $i + 1,
-- 
GitLab