From d0353afbc018457b4355038c397f441fa86a4aac Mon Sep 17 00:00:00 2001
From: Jan-Hendrik Willms <tleilax+studip@gmail.com>
Date: Mon, 8 Jan 2024 08:09:54 +0000
Subject: [PATCH] fixes #3611

Closes #3611

Merge request studip/studip!2504
---
 app/controllers/course/room_requests.php      | 31 +++++----
 .../course/room_requests/new_request.php      | 63 +++++++++---------
 .../request_find_available_properties.php     | 64 +++++++++----------
 .../request_find_matching_rooms.php           |  8 +--
 app/views/course/timesrooms/_roomRequest.php  |  2 +-
 lib/models/Folder.php                         | 22 ++++---
 .../resources/ResourceRequest.class.php       | 16 ++---
 templates/i18n/textarea.php                   |  2 +-
 8 files changed, 105 insertions(+), 103 deletions(-)

diff --git a/app/controllers/course/room_requests.php b/app/controllers/course/room_requests.php
index 1f06afef800..42628c8de53 100644
--- a/app/controllers/course/room_requests.php
+++ b/app/controllers/course/room_requests.php
@@ -265,9 +265,9 @@ class Course_RoomRequestsController extends AuthenticatedController
         // selected room and its category
         $this->selected_room = Resource::find($_SESSION[$request_id]['room_id'] ?: $this->request->resource_id);
 
-        $this->selected_room_category_id = $this->selected_room->category_id ?: $_SESSION[$request_id]['room_category_id'];
+        $this->selected_room_category_id = $this->selected_room->category_id ?? $_SESSION[$request_id]['room_category_id'] ?? null;
 
-        $_SESSION[$request_id]['room_category_id'] = $_SESSION[$request_id]['room_category_id'] ?: $this->selected_room->category_id;
+        $_SESSION[$request_id]['room_category_id'] = $_SESSION[$request_id]['room_category_id'] ?? $this->selected_room->category_id ?? null;
 
         // after selecting a room, go to next step or stay here if no room was selected at all
         if (Request::submitted('select_room')) {
@@ -367,9 +367,9 @@ class Course_RoomRequestsController extends AuthenticatedController
             $this->available_properties = $this->category->getRequestableProperties();
 
             // properties, like 'Sitzplätze', 'behindertengerecht' etc
-            $this->selected_properties = $_SESSION[$request_id]['selected_properties'];
-            $this->preparation_time = $_SESSION[$request_id]['preparation_time'];
-            $this->comment = $_SESSION[$request_id]['comment'];
+            $this->selected_properties = $_SESSION[$request_id]['selected_properties'] ?? null;
+            $this->preparation_time = $_SESSION[$request_id]['preparation_time'] ?? null;
+            $this->comment = $_SESSION[$request_id]['comment'] ?? null;
             $this->request->category_id = $_SESSION[$request_id]['room_category_id'];
 
             // finally we want to show a summary
@@ -412,11 +412,11 @@ class Course_RoomRequestsController extends AuthenticatedController
 
         $this->course = Course::find($this->course_id);
         $this->selected_properties['seats'] = $_SESSION[$request_id]['selected_properties']['seats']
-            ?: $this->course->admission_turnout
+            ?? $this->course->admission_turnout
             ?: Config::get()->RESOURCES_ROOM_REQUEST_DEFAULT_SEATS;
 
-        $this->preparation_time = $_SESSION[$request_id]['preparation_time'];
-        $this->comment = $_SESSION[$request_id]['comment'];
+        $this->preparation_time = $_SESSION[$request_id]['preparation_time'] ?? null;
+        $this->comment = $_SESSION[$request_id]['comment'] ?? null;
 
         // when searching for a room name, list found room
         if ($_SESSION[$request_id]['room_name'] !== '') {
@@ -562,20 +562,23 @@ class Course_RoomRequestsController extends AuthenticatedController
         }
 
         $this->request = new RoomRequest($this->request_id);
-        $this->request->setRangeFields($_SESSION[$this->request_id]['range'], $_SESSION[$this->request_id]['range_ids']);
+        $this->request->setRangeFields(
+            $_SESSION[$this->request_id]['range'] ?? '',
+            $_SESSION[$this->request_id]['range_ids'] ?? []
+        );
 
-        $this->selected_room_category = ResourceCategory::find($_SESSION[$request_id]['room_category_id'] ?: $this->request->category_id);
+        $this->selected_room_category = ResourceCategory::find($_SESSION[$request_id]['room_category_id'] ?? $this->request->category_id);
 
-        $this->selected_room = Resource::find($_SESSION[$request_id]['room_id'] ?: $this->request->resource_id);
+        $this->selected_room = Resource::find($_SESSION[$request_id]['room_id'] ?? $this->request->resource_id);
 
-        $this->room_id = $_SESSION[$request_id]['room_id'] ?: $this->request->resource_id;
+        $this->room_id = $_SESSION[$request_id]['room_id'] ?? $this->request->resource_id;
         $this->available_properties = $this->selected_room_category->getRequestableProperties();
 
-        $this->selected_properties = $_SESSION[$request_id]['selected_properties'] ?: [];
+        $this->selected_properties = $_SESSION[$request_id]['selected_properties'] ?? [];
         $this->request_properties = $this->request->properties;
 
         // either properties from stored request or those from session
-        if ($this->request_properties && !$_SESSION[$request_id]['selected_properties']) {
+        if ($this->request_properties && empty($_SESSION[$request_id]['selected_properties'])) {
             foreach ($this->request_properties as $property) {
                 $this->selected_properties[$property->name] = $property->state;
             }
diff --git a/app/views/course/room_requests/new_request.php b/app/views/course/room_requests/new_request.php
index 948db054208..87d338d4d41 100644
--- a/app/views/course/room_requests/new_request.php
+++ b/app/views/course/room_requests/new_request.php
@@ -15,18 +15,17 @@
                 <label>
                     <?= _('Raumkategorie') ?>
                     <span class="flex-row">
-                        <select name="category_id" <?= $category ? 'disabled' : '' ?>>
+                        <select name="category_id" <?= !empty($category) ? 'disabled' : '' ?>>
                         <option value=""><?= _('bitte auswählen') ?></option>
                         <? foreach ($available_room_categories as $rc): ?>
                             <option value="<?= htmlReady($rc->id) ?>"
-                                    <?= $_SESSION[$request_id]['room_category'] === $rc->id
-                                        ? 'selected'
-                                        : '' ?>>
+                                <? if (isset($_SESSION[$request_id]['room_category']) && $_SESSION[$request_id]['room_category'] === $rc->id) echo 'selected'; ?>
+                            >
                         <?= htmlReady($rc->name) ?>
                         </option>
                         <? endforeach ?>
                     </select>
-                    <? if ($category) : ?>
+                    <? if (!empty($category)) : ?>
                         <?= Icon::create('decline')->asInput(
                             [
                                 'title' => _('alle Angaben zurücksetzen'),
@@ -51,42 +50,40 @@
                     </span>
                 </label>
             <? endif ?>
-            <? if (!$embedded) : ?>
-        </fieldset>
-    </div>
+            </fieldset>
+        </div>
 
-    <div>
-        <fieldset>
-            <legend><?= _('Raumsuche') ?></legend>
-            <label>
-                <?= _('Raumname') ?>
-                <span class="flex-row">
-                    <input type="text" name="room_name" value="<?= htmlReady($_SESSION[$request_id]['room_name']) ?>">
-                    <?= Icon::create('search')->asInput(
-                        [
+<? if (empty($embedded)) : ?>
+        <div>
+            <fieldset>
+                <legend><?= _('Raumsuche') ?></legend>
+                <label>
+                    <?= _('Raumname') ?>
+                    <span class="flex-row">
+                        <input type="text" name="room_name" value="<?= htmlReady($_SESSION[$request_id]['room_name'] ?? '') ?>">
+                        <?= Icon::create('search')->asInput([
                             'title' => _('Räume suchen'),
                             'name'  => 'search_by_name',
                             'class' => 'text-bottom',
-                            'style' => 'margin-left: 0.2em; margin-top: 0.6em;'
-                        ]
-                    ) ?>
-                    <? if ($room_name) : ?>
-                        <?= Icon::create('decline')->asInput(
-                            [
+                            'style' => 'margin-left: 0.2em; margin-top: 0.6em;',
+                        ]) ?>
+                        <? if (!empty($room_name)) : ?>
+                            <?= Icon::create('decline')->asInput([
                                 'title' => _('alle Angaben zurücksetzen'),
                                 'type'  => 'image',
                                 'class' => 'text-bottom',
                                 'name'  => 'reset_name',
-                                'style' => 'margin-left: 0.2em; margin-top: 0.6em;'
-                            ]
-                        ) ?>
-                    <? endif?>
-                </span>
-            </label>
+                                'style' => 'margin-left: 0.2em; margin-top: 0.6em;',
+                            ]) ?>
+                        <? endif?>
+                    </span>
+                </label>
 
-        </fieldset>
+            </fieldset>
+        </div>
+<? endif; ?>
+    </section>
 
-    </div>
-</section>
-<?= $this->render_partial('course/room_requests/_new_request_form_footer', ['step' => $step]) ?>
+<? if (empty($embedded)) : ?>
+    <?= $this->render_partial('course/room_requests/_new_request_form_footer', ['step' => $step]) ?>
 <? endif ?>
diff --git a/app/views/course/room_requests/request_find_available_properties.php b/app/views/course/room_requests/request_find_available_properties.php
index ea0767f2e6d..0b434ed4bf2 100644
--- a/app/views/course/room_requests/request_find_available_properties.php
+++ b/app/views/course/room_requests/request_find_available_properties.php
@@ -59,7 +59,7 @@
                 <? if ($available_properties) : ?>
                     <? foreach ($available_properties as $property) : ?>
                         <?= $property->toHtmlInput(
-                            $selected_properties[$property->name],
+                            $selected_properties[$property->name] ?? '',
                             'selected_properties[' . htmlReady($property->name) . ']',
                             true,
                             false
@@ -80,42 +80,40 @@
                 <label>
                     <?= _('Raumname') ?>
                     <span class="flex-row">
-                    <input type="text" name="room_name" value="<?= htmlReady($room_name) ?>" >
-                    <?= Icon::create('search')->asInput(
-                        [
+                        <input type="text" name="room_name" value="<?= htmlReady($room_name) ?>" >
+                        <?= Icon::create('search')->asInput([
                             'title' => _('Räume suchen'),
                             'name'  => 'search_by_name',
                             'class' => 'text-bottom',
-                            'style' => 'margin-left: 0.2em; margin-top: 0.6em;'
-                        ]
-                    ) ?>
-                </span>
+                            'style' => 'margin-left: 0.2em; margin-top: 0.6em;',
+                        ]) ?>
+                    </span>
                 </label>
-                    <? if ($available_rooms) : ?>
-                        <label><strong><?= _('Passende Räume') ?></strong>
-                            <section class="selectbox" id="room_select">
-                                <? foreach ($available_rooms as $room): ?>
-                                    <div class="flex-row">
-                                        <label class="horizontal">
-                                            <?= $available_room_icons[$room->id] ?>
-                                            <input type="radio" name="selected_room_id"
-                                                   data-activates="button[type='submit'][name='select_room']"
-                                                   value="<?= htmlReady($room->id) ?>"
-                                                <? if ($_SESSION[$request_id]['room_id'] === $room->id) echo 'checked' ?>>
-                                            <?= htmlReady(mila($room->name, 50)) . ' (' . $room['category']->name . ')'?>
-                                            <? if ($room->properties): ?>
-                                                <? $property_names = $room->getInfolabelProperties()
-                                                    ->pluck('fullname') ?>
-                                                <?= tooltipIcon(implode("\n", $property_names)) ?>
-                                            <? endif ?>
-                                        </label>
-                                    </div>
-                                <? endforeach ?>
-                            </section>
-                        </label>
-                        <?= \Studip\Button::create(_('Raum auswählen'), 'select_room') ?>
-                    <? else : ?>
-                    <? endif ?>
+            <? if (!empty($available_rooms)) : ?>
+                <label>
+                    <strong><?= _('Passende Räume') ?></strong>
+                    <section class="selectbox" id="room_select">
+                        <? foreach ($available_rooms as $room): ?>
+                            <div class="flex-row">
+                                <label class="horizontal">
+                                    <?= $available_room_icons[$room->id] ?>
+                                    <input type="radio" name="selected_room_id"
+                                           data-activates="button[type='submit'][name='select_room']"
+                                           value="<?= htmlReady($room->id) ?>"
+                                        <? if ($_SESSION[$request_id]['room_id'] === $room->id) echo 'checked' ?>>
+                                    <?= htmlReady(mila($room->name, 50)) . ' (' . $room['category']->name . ')'?>
+                                    <? if ($room->properties): ?>
+                                        <? $property_names = $room->getInfolabelProperties()
+                                            ->pluck('fullname') ?>
+                                        <?= tooltipIcon(implode("\n", $property_names)) ?>
+                                    <? endif ?>
+                                </label>
+                            </div>
+                        <? endforeach ?>
+                    </section>
+                </label>
+                <?= \Studip\Button::create(_('Raum auswählen'), 'select_room') ?>
+            <? endif ?>
             </fieldset>
 
         </div>
diff --git a/app/views/course/room_requests/request_find_matching_rooms.php b/app/views/course/room_requests/request_find_matching_rooms.php
index a474ab2a77a..01f42a41071 100644
--- a/app/views/course/room_requests/request_find_matching_rooms.php
+++ b/app/views/course/room_requests/request_find_matching_rooms.php
@@ -61,7 +61,7 @@
                     <? if ($available_properties) : ?>
                         <? foreach ($available_properties as $property) : ?>
                             <?= $property->toHtmlInput(
-                                $selected_properties[$property->name],
+                                $selected_properties[$property->name] ?? '',
                                 'selected_properties[' . htmlReady($property->name) . ']',
                                 true,
                                 false,
@@ -74,11 +74,11 @@
 
                 <? endif ?>
 
-                <? if (!$embedded) : ?>
             </fieldset>
 
         </div>
 
+    <? if (empty($embedded)) : ?>
         <div>
             <fieldset class="request-fieldset">
                 <legend><?= _('Raumsuche') ?></legend>
@@ -124,11 +124,11 @@
                 <? else : ?>
                     <?= MessageBox::info(_('Es wurden keine passenden Räume gefunden!')) ?>
                 <? endif ?>
-
             </fieldset>
-
         </div>
+    <? endif; ?>
     </section>
 
+<? if (empty($embedded)) : ?>
     <?= $this->render_partial('course/room_requests/_new_request_form_footer', ['step' => $step, 'search_by' => 'roomname']) ?>
 <? endif ?>
diff --git a/app/views/course/timesrooms/_roomRequest.php b/app/views/course/timesrooms/_roomRequest.php
index 2351fde00f5..989fccb6120 100644
--- a/app/views/course/timesrooms/_roomRequest.php
+++ b/app/views/course/timesrooms/_roomRequest.php
@@ -107,7 +107,7 @@
                     </td>
                 </tr>
             <? endforeach ?>
-            <? if ($request_id === $rr->id) : ?>
+            <? if (isset($request_id) && $request_id === $rr->id) : ?>
                 <tr>
                     <td colspan="4">
                         <?= $this->render_partial('course/room_requests/_request.php', ['request' => $rr]); ?>
diff --git a/lib/models/Folder.php b/lib/models/Folder.php
index 630a157da99..b2e88868880 100644
--- a/lib/models/Folder.php
+++ b/lib/models/Folder.php
@@ -222,11 +222,13 @@ class Folder extends SimpleORMap implements FeedbackRange
                 [$course_topic->seminar_id]
             );
 
-            foreach ($topic_folders as $folder) {
-                if ($folder['data_content']['topic_id'] === $topic_id) {
-                    $ret[] = $folder;
+            $ret = array_filter(
+                $topic_folders,
+                function (Folder $folder) use ($topic_id): bool {
+                    return isset($folder->data_content)
+                        && $folder->data_content['topic_id'] === $topic_id;
                 }
-            }
+            );
         }
         return $ret;
     }
@@ -241,7 +243,7 @@ class Folder extends SimpleORMap implements FeedbackRange
      */
     public static function findByTermin_id($termin_id)
     {
-        $course_date   = CourseDate::find($termin_id);
+        $course_date = CourseDate::find($termin_id);
         $ret = [];
         if ($course_date) {
             $date_folders = self::findBySQL(
@@ -249,11 +251,13 @@ class Folder extends SimpleORMap implements FeedbackRange
                 [$course_date->range_id]
             );
 
-            foreach ($date_folders as $folder) {
-                if ($folder['data_content']['termin_id'] === $termin_id) {
-                    $ret[] = $folder;
+            $ret = array_filter(
+                $date_folders,
+                function (Folder $folder) use ($termin_id): bool {
+                    return isset($folder->data_content['termin_id'])
+                        && $folder->data_content['termin_id'] === $termin_id;
                 }
-            }
+            );
         }
         return $ret;
     }
diff --git a/lib/models/resources/ResourceRequest.class.php b/lib/models/resources/ResourceRequest.class.php
index 10c06fb3586..6200127cb3b 100644
--- a/lib/models/resources/ResourceRequest.class.php
+++ b/lib/models/resources/ResourceRequest.class.php
@@ -1189,8 +1189,8 @@ class ResourceRequest extends SimpleORMap implements PrivacyObject, Studip\Calen
 
                     $interval['range']       = ResourceRequestAppointment::class;
                     $interval['range_id']    = $appointment->appointment_id;
-                    $interval['booked_room'] = $date->room_booking ? $date->room_booking->resource_id : null;
-                    $interval['booking_id']  = $date->room_booking ? $date->room_booking->id : null;
+                    $interval['booked_room'] = $date->room_booking->resource_id ?? null;
+                    $interval['booking_id']  = $date->room_booking->id ?? null;
 
                 }
                 $time_intervals[] = $interval;
@@ -1214,8 +1214,8 @@ class ResourceRequest extends SimpleORMap implements PrivacyObject, Studip\Calen
             if ($with_range) {
                 $interval['range']       = CourseDate::class;
                 $interval['range_id']    = $this->termin_id;
-                $interval['booked_room'] = $this->date->room_booking ? $this->date->room_booking->resource_id: null;
-                $interval['booking_id']  = $this->date->room_booking ? $this->date->room_booking->id : null;
+                $interval['booked_room'] = $this->date->room_booking->resource_id ?? null;
+                $interval['booking_id']  = $this->date->room_booking->id ?? null;
             }
             return [$interval];
         } elseif ($this->metadate_id) {
@@ -1238,8 +1238,8 @@ class ResourceRequest extends SimpleORMap implements PrivacyObject, Studip\Calen
                 if ($with_range) {
                     $interval['range']       = CourseDate::class;
                     $interval['range_id']    = $date->id;
-                    $interval['booked_room'] = $date->room_booking->resource_id;
-                    $interval['booking_id']  = $date->room_booking->id;
+                    $interval['booked_room'] = $date->room_booking->resource_id ?? null;
+                    $interval['booking_id']  = $date->room_booking->id ?? null;
                 }
                 $time_intervals[] = $interval;
             }
@@ -1265,8 +1265,8 @@ class ResourceRequest extends SimpleORMap implements PrivacyObject, Studip\Calen
                     if ($with_range) {
                         $interval['range']       = CourseDate::class;
                         $interval['range_id']    = $date->id;
-                        $interval['booked_room'] = $date->room_booking ? $date->room_booking->resource_id: null;
-                        $interval['booking_id']  = $date->room_booking ? $date->room_booking->id : null;
+                        $interval['booked_room'] = $date->room_booking->resource_id ?? null;
+                        $interval['booking_id']  = $date->room_booking->id ?? null;
                     }
                     $time_intervals[] = $interval;
                 }
diff --git a/templates/i18n/textarea.php b/templates/i18n/textarea.php
index 17f97214a7d..6d3dff88d0d 100644
--- a/templates/i18n/textarea.php
+++ b/templates/i18n/textarea.php
@@ -13,7 +13,7 @@
             }
 
             // Remove required attribute if no text has been set
-            if (isset($attr['required']) && !$attr['value']) {
+            if (isset($attr['required']) && empty($attr['value'])) {
                 unset($attr['required']);
             }
         }
-- 
GitLab