From b8256a4732c53ca504bb8c17adcb47cfa799d81e Mon Sep 17 00:00:00 2001
From: Jan-Hendrik Willms <tleilax+studip@gmail.com>
Date: Wed, 26 Oct 2022 10:10:25 +0000
Subject: [PATCH] prevent more php8 warnings, fixes #1679 (again)

Closes #1679

Merge request studip/studip!1097
---
 app/controllers/admission/courseset.php       | 12 ++--
 .../admission/restricted_courses.php          | 57 ++++++++++---------
 app/controllers/studip_controller.php         |  8 +--
 app/views/admin/user/index.php                |  2 +-
 .../admission/courseset/_institute_choose.php | 22 ++-----
 app/views/admission/institute-select.php      | 23 ++++++++
 .../restricted_courses/_institute_choose.php  | 22 ++-----
 .../admission/restricted_courses/index.php    |  8 +--
 app/views/admission/user_list/configure.php   |  2 +-
 .../course/feedback/_add_edit_entry_form.php  | 25 +++++---
 app/views/course/forum/index/_post.php        |  2 +-
 app/views/course/forum/index/index.php        |  2 +-
 app/views/questionnaire/evaluate.php          | 10 ++--
 app/views/siteinfo/markup/adminList.php       |  2 +-
 app/views/siteinfo/markup/indicator.php       |  5 +-
 app/views/siteinfo/markup/rootlist.php        |  2 +-
 app/views/siteinfo/markup/toplist.php         |  2 +-
 lib/classes/CoursesetModel.php                | 18 +++---
 lib/classes/MediaProxy.php                    |  6 +-
 lib/classes/MyRealmModel.php                  |  2 +-
 lib/classes/Siteinfo.php                      |  2 +-
 lib/classes/StudipCoreFormat.php              | 20 +++++--
 lib/classes/admission/UserFilter.class.php    |  4 +-
 lib/models/DatafieldEntryModel.class.php      | 17 +++---
 lib/models/User.class.php                     | 14 ++---
 lib/user_visible.inc.php                      |  2 +
 lib/visual.inc.php                            |  8 +--
 public/sendfile.php                           |  2 +-
 templates/shared/pagechooser.php              |  2 +-
 29 files changed, 159 insertions(+), 144 deletions(-)
 create mode 100644 app/views/admission/institute-select.php

diff --git a/app/controllers/admission/courseset.php b/app/controllers/admission/courseset.php
index aa688e8845b..a37ce7dee06 100644
--- a/app/controllers/admission/courseset.php
+++ b/app/controllers/admission/courseset.php
@@ -86,15 +86,15 @@ class Admission_CoursesetController extends AuthenticatedController
         $filter['rule_types'] = array_keys($this->current_rule_types);
         $this->myInstitutes = CoursesetModel::getInstitutes($filter);
         if (!$this->current_institut_id) {
-            if ($this->myInstitutes['all']['num_sets'] < 100) {
+            if ($this->myInstitutes['all']['count'] < 100) {
                 $this->current_institut_id = 'all';
             } else {
-                next($this->myInstitutes);
-                $this->current_institut_id = key($this->myInstitutes);
-                reset($this->myInstitutes);
+                list($this->current_institut_id) = reset($this->myInstitutes);
             }
         }
-        list($institut_id, $all) = explode('_', $this->current_institut_id);
+        $chunks = explode('_', $this->current_institut_id);
+        $institut_id = $chunks[0];
+        $all = $chunks[1] ?? null;
         if ($institut_id == 'all') {
             $institutes = array_keys($this->myInstitutes);
         } else if ($all == 'all') {
@@ -105,7 +105,7 @@ class Admission_CoursesetController extends AuthenticatedController
         }
 
         foreach ($institutes as $one) {
-            if ($this->myInstitutes[$one]['num_sets']) {
+            if ($this->myInstitutes[$one]['count']) {
                 $sets = CourseSet::getCoursesetsByInstituteId($one, $filter);
                 foreach ($sets as $set) {
                     $courseset = new CourseSet($set['set_id']);
diff --git a/app/controllers/admission/restricted_courses.php b/app/controllers/admission/restricted_courses.php
index f611f094103..b790088bcf1 100644
--- a/app/controllers/admission/restricted_courses.php
+++ b/app/controllers/admission/restricted_courses.php
@@ -92,8 +92,8 @@ class Admission_RestrictedCoursesController extends AuthenticatedController
                 $row[] = (int)$course['count_prelim'];
                 $row[] = (int)$course['count_waiting'];
                 $row[] = $course['distribution_time'] ? strftime('%x %R', $course['distribution_time']) : '';
-                $row[] = $course['start_time'] ? strftime('%x %R', $course['start_time']) : '';
-                $row[] = $course['end_time'] ? strftime('%x %R', $course['end_time']) : '';
+                $row[] = isset($course['start_time']) ? strftime('%x %R', $course['start_time']) : '';
+                $row[] = isset($course['end_time']) ? strftime('%x %R', $course['end_time']) : '';
                 $data[] = $row;
             }
 
@@ -119,7 +119,9 @@ class Admission_RestrictedCoursesController extends AuthenticatedController
     {
         global $perm, $user;
 
-        list($institut_id, $all) = explode('_', $this->current_institut_id);
+        $chunks = explode('_', $this->current_institut_id);
+        $institut_id = $chunks[0];
+        $all = $chunks[1] ?? null;
         // Prepare count statements
         $query = "SELECT count(*)
                   FROM seminar_user
@@ -172,9 +174,9 @@ class Admission_RestrictedCoursesController extends AuthenticatedController
             $count1_statement->execute([$seminar_id]);
             $counts = $count1_statement->fetch(PDO::FETCH_ASSOC);
 
-            $ret[$seminar_id]['count_prelim'] = (int)$counts['count2'];
-            $ret[$seminar_id]['count_waiting']  = (int)$counts['count3'];
-            if (!$csets[$row['set_id']]) {
+            $ret[$seminar_id]['count_prelim'] = (int) ($counts['count2'] ?? 0);
+            $ret[$seminar_id]['count_waiting']  = (int) ($counts['count3'] ?? 0);
+            if (!isset($csets[$row['set_id']])) {
                 $csets[$row['set_id']] = new CourseSet($row['set_id']);
             }
             $cs = $csets[$row['set_id']];
@@ -199,7 +201,7 @@ class Admission_RestrictedCoursesController extends AuthenticatedController
         global $perm, $user;
 
         // Prepare institute statement
-        $query = "SELECT a.Institut_id, a.Name, COUNT(courseset_rule.type) AS num_sem
+        $query = "SELECT a.Institut_id, a.Name, COUNT(courseset_rule.type) AS count
         FROM Institute AS a
         LEFT JOIN seminare ON (seminare.Institut_id = a.Institut_id)
         LEFT JOIN semester_courses ON (seminare.Seminar_id = semester_courses.course_id)
@@ -209,7 +211,7 @@ class Admission_RestrictedCoursesController extends AuthenticatedController
             AND a.Institut_id != fakultaets_id
             {$seminare_condition}
         GROUP BY a.Institut_id
-        ORDER BY a.Name, num_sem DESC";
+        ORDER BY a.Name, count DESC";
         $institute_statement = DBManager::get()->prepare($query);
 
         $parameters = [];
@@ -226,9 +228,9 @@ class Admission_RestrictedCoursesController extends AuthenticatedController
             $_my_inst['all'] = [
                 'name'    => _('alle'),
                 'is_fak'  => true,
-                'num_sem' => $num_sem,
+                'count' => $num_sem,
             ];
-            $query = "SELECT a.Institut_id, a.Name, 1 AS is_fak, COUNT(courseset_rule.type) AS num_sem
+            $query = "SELECT a.Institut_id, a.Name, 1 AS is_fak, COUNT(courseset_rule.type) AS count
             FROM Institute AS a
             LEFT JOIN seminare ON (seminare.Institut_id = a.Institut_id)
             LEFT JOIN semester_courses ON (seminare.Seminar_id = semester_courses.course_id)
@@ -237,9 +239,9 @@ class Admission_RestrictedCoursesController extends AuthenticatedController
             WHERE a.Institut_id = fakultaets_id
                 {$seminare_condition}
             GROUP BY a.Institut_id
-            ORDER BY is_fak, Name, num_sem DESC";
+            ORDER BY is_fak, Name, count DESC";
         } else {
-            $query = "SELECT s.inst_perms,b.Institut_id, b.Name, b.Institut_id = b.fakultaets_id AS is_fak, COUNT( courseset_rule.type ) AS num_sem
+            $query = "SELECT s.inst_perms,b.Institut_id, b.Name, b.Institut_id = b.fakultaets_id AS is_fak, COUNT( courseset_rule.type ) AS count
             FROM user_inst AS s
             LEFT JOIN Institute AS b USING ( Institut_id )
             LEFT JOIN seminare ON ( seminare.Institut_id = b.Institut_id)
@@ -250,7 +252,7 @@ class Admission_RestrictedCoursesController extends AuthenticatedController
                 AND s.inst_perms IN ('admin', 'dozent')
                 {$seminare_condition}
             GROUP BY b.Institut_id
-            ORDER BY is_fak, Name, num_sem DESC";
+            ORDER BY is_fak, Name, count DESC";
             $parameters[] = $user->id;
         }
         $statement = DBManager::get()->prepare($query);
@@ -259,38 +261,37 @@ class Admission_RestrictedCoursesController extends AuthenticatedController
 
         foreach ($temp as $row) {
             $_my_inst[$row['Institut_id']] = [
-                    'name'    => $row['Name'],
-                    'is_fak'  => $row['is_fak'],
-                    'num_sem' => $row['num_sem']
+                'name'   => $row['Name'],
+                'is_fak' => $row['is_fak'],
+                'count'  => $row['count'],
             ];
-            if ($row["is_fak"] && $row["inst_perms"] != 'dozent') {
+            if ($row["is_fak"] && (!isset($row['inst_perms']) || $row['inst_perms'] !== 'dozent')) {
                 $institute_statement->execute([$row['Institut_id']]);
                 $alle = $institute_statement->fetchAll();
                 if (count($alle)) {
                     $_my_inst[$row['Institut_id'] . '_all'] = [
-                            'name'    => sprintf(_('[Alle unter %s]'), $row['Name']),
-                            'is_fak'  => 'all',
-                            'num_sem' => $row['num_sem']
+                        'name'   => sprintf(_('[Alle unter %s]'), $row['Name']),
+                        'is_fak' => 'all',
+                        'count'  => $row['count']
                     ];
 
                     $num_inst = 0;
-                    $num_sem_alle = $row['num_sem'];
-
+                    $num_sem_alle = $row['count'];
 
                     foreach ($alle as $institute) {
-                        if(!$_my_inst[$institute['Institut_id']]) {
+                        if(empty($_my_inst[$institute['Institut_id']])) {
                             $num_inst += 1;
-                            $num_sem_alle += $institute['num_sem'];
+                            $num_sem_alle += $institute['count'];
                         }
                         $_my_inst[$institute['Institut_id']] = [
-                                'name'    => $institute['Name'],
-                                'is_fak'  => 0,
-                                'num_sem' => $institute["num_sem"]
+                            'name'   => $institute['Name'],
+                            'is_fak' => 0,
+                            'count'  => $institute['count']
                         ];
                     }
                     $_my_inst[$row['Institut_id']]['num_inst']          = $num_inst;
                     $_my_inst[$row['Institut_id'] . '_all']['num_inst'] = $num_inst;
-                    $_my_inst[$row['Institut_id'] . '_all']['num_sem']  = $num_sem_alle;
+                    $_my_inst[$row['Institut_id'] . '_all']['count']    = $num_sem_alle;
                 }
             }
         }
diff --git a/app/controllers/studip_controller.php b/app/controllers/studip_controller.php
index 1190416a130..0347b37ea19 100644
--- a/app/controllers/studip_controller.php
+++ b/app/controllers/studip_controller.php
@@ -172,18 +172,18 @@ abstract class StudipController extends Trails_Controller
             $reflection = new ReflectionMethod($this, $this->current_action . '_action');
             $parameters = $reflection->getParameters();
             foreach ($parameters as $i => $parameter) {
-                $class_type = $parameter->getClass();
+                $class_type = $parameter->getType();
 
                 if (!$class_type
-                    || !class_exists($class_type->name)
-                    || !is_a($class_type->name, SimpleORMap::class, true))
+                    || !class_exists($class_type->getName())
+                    || !is_a($class_type->getName(), SimpleORMap::class, true))
                 {
                     continue;
                 }
 
                 $types[$i] = 'sorm';
                 $class_infos[$i] = [
-                    'model'    => $class_type->name,
+                    'model'    => $class_type->getName(),
                     'var'      => $parameter->getName(),
                     'optional' => $parameter->isOptional(),
                 ];
diff --git a/app/views/admin/user/index.php b/app/views/admin/user/index.php
index 0eb45407981..cab7b7b2f33 100644
--- a/app/views/admin/user/index.php
+++ b/app/views/admin/user/index.php
@@ -67,7 +67,7 @@ use Studip\Button, Studip\LinkButton;
         </label>
     </fieldset>
 
-    <fieldset class="collapsable <?= (!$advanced) ?  'collapsed' : '' ?>">
+    <fieldset class="collapsable <? if (empty($advanced)) echo 'collapsed'; ?>">
         <legend><?= _('Erweiterte Suche') ?></legend>
 
         <label for="institute" class="col-3">
diff --git a/app/views/admission/courseset/_institute_choose.php b/app/views/admission/courseset/_institute_choose.php
index e684de6a44f..7fcc8da9f5e 100644
--- a/app/views/admission/courseset/_institute_choose.php
+++ b/app/views/admission/courseset/_institute_choose.php
@@ -4,24 +4,10 @@
     <fieldset>
         <legend><?= _('Anmeldesets auflisten') ?></legend>
 
-        <label>
-            <?=_("Einrichtung:")?>
-            <select name="choose_institut_id" class="nested-select">
-                <? while (list($institut_id,$institute) = each($myInstitutes)) : ?>
-                <option value="<?= $institut_id ?>" <?=($current_institut_id == $institut_id ? 'selected' : '')?> class="<?= $institute['is_fak'] ? 'nested-item-header' : 'nested-item' ?>">
-                    <?= htmlReady(my_substr($institute["name"] . ' (' . $institute["num_sets"] . ')',0,100));?>
-                </option>
-                <? if ($institute['is_fak'] === 'all') : ?>
-                    <? $num_inst = $institute['num_inst']; for ($i = 0; $i < $num_inst; ++$i) : ?>
-                        <? list($institut_id,$institute) = each($myInstitutes);?>
-                        <option value="<?= $institut_id?>" <?=($current_institut_id == $institut_id ? 'selected' : '')?> class="nested-item">
-                            <?= htmlReady(my_substr($institute["name"] . ' (' . $institute["num_sets"] . ')',0,100));?>
-                        </option>
-                    <? endfor ?>
-                <? endif ?>
-            <? endwhile ?>
-            </select>
-        </label>
+        <?= $this->render_partial('admission/institute-select.php', [
+            'institutes' => $myInstitutes,
+            'current_institut_id' => $current_institut_id,
+        ]) ?>
 
         <label>
             <?=_("Präfix des Namens:")?>
diff --git a/app/views/admission/institute-select.php b/app/views/admission/institute-select.php
new file mode 100644
index 00000000000..e9b9ed64ec5
--- /dev/null
+++ b/app/views/admission/institute-select.php
@@ -0,0 +1,23 @@
+<? reset($institutes); ?>
+<label>
+    <?=_("Einrichtung:")?>
+    <select name="choose_institut_id" class="nested-select">
+        <? while (($institut_id = key($institutes)) && ($institute = current($institutes))): ?>
+            <option value="<?= $institut_id ?>" <? if ($current_institut_id === $institut_id) echo 'selected'; ?> class="<?= $institute['is_fak'] ? 'nested-item-header' : 'nested-item' ?>">
+                <?= htmlReady(my_substr($institute["name"] . ' (' . $institute["count"] . ')',0,100));?>
+            </option>
+            <? if ($institute['is_fak'] === 'all') : ?>
+                <? $num_inst = $institute['num_inst']; for ($i = 0; $i < $num_inst; ++$i) : ?>
+                    <?
+                    $institute = next($institutes);
+                    $institut_id = key($institutes);
+                    ?>
+                    <option value="<?= $institut_id?>" <?=($current_institut_id == $institut_id ? 'selected' : '')?> class="nested-item">
+                        <?= htmlReady(my_substr($institute['name'] . ' (' . $institute['count'] . ')',0,100));?>
+                    </option>
+                <? endfor ?>
+            <? endif ?>
+            <? next($institutes); ?>
+        <? endwhile; ?>
+    </select>
+</label>
diff --git a/app/views/admission/restricted_courses/_institute_choose.php b/app/views/admission/restricted_courses/_institute_choose.php
index 9c53d5f5ce9..d6bb8ba088e 100644
--- a/app/views/admission/restricted_courses/_institute_choose.php
+++ b/app/views/admission/restricted_courses/_institute_choose.php
@@ -3,24 +3,10 @@
     <fieldset>
         <legend><?= _('Anmeldesets auflisten') ?></legend>
 
-        <label>
-            <?=_("Einrichtung:")?>
-            <select name="choose_institut_id" class="nested-select">
-            <? while (list($institut_id,$institute) = each($my_inst)) : ?>
-                <option value="<?= $institut_id?>" <?=($current_institut_id == $institut_id ? 'selected' : '')?> class="<?= $institute['is_fak'] ? 'nested-item-header' : 'nested-item' ?>">
-                    <?= htmlReady(my_substr($institute["name"] . ' (' . $institute["num_sem"] . ')',0,100));?>
-                </option>
-                <? if ($institute["is_fak"] == 'all') : ?>
-                    <? $num_inst = $institute["num_inst"]; for ($i = 0; $i < $num_inst; ++$i) : ?>
-                        <? list($institut_id,$institute) = each($my_inst);?>
-                        <option value="<?= $institut_id?>" <?=($current_institut_id == $institut_id ? 'selected' : '')?> class="nested-item">
-                            <?= htmlReady(my_substr($institute["name"] . ' (' . $institute["num_sem"] . ')',0,100));?>
-                        </option>
-                    <? endfor ?>
-                <? endif ?>
-            <? endwhile ?>
-            </select>
-        </label>
+        <?= $this->render_partial('admission/institute-select.php', [
+            'institutes' => $my_inst,
+            'current_institut_id' => $current_institut_id,
+        ]) ?>
 
         <label>
             <?=_("Präfix des Veranstaltungsnamens / Nummer:")?>
diff --git a/app/views/admission/restricted_courses/index.php b/app/views/admission/restricted_courses/index.php
index 096e825033d..615a5015523 100644
--- a/app/views/admission/restricted_courses/index.php
+++ b/app/views/admission/restricted_courses/index.php
@@ -36,11 +36,11 @@
                 <td style="white-space:nowrap" data-sort-value="<?= (int) $course['distribution_time']?>">
                     <?= htmlReady($course['distribution_time'] ? strftime('%x %R', $course['distribution_time']) : '-') ?>
                 </td>
-                <td style="white-space:nowrap" data-sort-value="<?= (int) $course['start_time']?>">
-                    <?= htmlReady($course['start_time'] ? strftime('%x %R', $course['start_time']) : '-') ?>
+                <td style="white-space:nowrap" data-sort-value="<?= (int) ($course['start_time'] ?? null) ?>">
+                    <?= htmlReady(isset($course['start_time']) ? strftime('%x %R', $course['start_time']) : '-') ?>
                 </td>
-                <td style="white-space:nowrap" data-sort-value="<?= (int) $course['end_time']?>">
-                    <?= htmlReady($course['end_time'] ? strftime('%x %R', $course['end_time']) : '-') ?>
+                <td style="white-space:nowrap" data-sort-value="<?= (int) ($course['end_time'] ?? null) ?>">
+                    <?= htmlReady(isset($course['end_time']) ? strftime('%x %R', $course['end_time']) : '-') ?>
                 </td>
             </tr>
         <? endforeach ?>
diff --git a/app/views/admission/user_list/configure.php b/app/views/admission/user_list/configure.php
index 391e758cc14..9338f452161 100644
--- a/app/views/admission/user_list/configure.php
+++ b/app/views/admission/user_list/configure.php
@@ -12,7 +12,7 @@ Helpbar::get()->addPlainText(_('Info'), "Stellen Sie hier ein, wie die Chancen b
                                         "bevorzugt.");
 ?>
 <?= $this->render_partial('dialog/confirm_dialog') ?>
-<?= $error ? $error : '' ?>
+<?= $error ?? '' ?>
 <form class="default" action="<?= $controller->url_for('admission/userlist/save', $userlist_id) ?>" method="post">
     <?= CSRFProtection::tokenTag() ?>
 
diff --git a/app/views/course/feedback/_add_edit_entry_form.php b/app/views/course/feedback/_add_edit_entry_form.php
index 80bec1ffcd3..57bf7d84267 100644
--- a/app/views/course/feedback/_add_edit_entry_form.php
+++ b/app/views/course/feedback/_add_edit_entry_form.php
@@ -1,22 +1,29 @@
+<?php
+/**
+ * @var FeedbackElement $feedback
+ * @var FeedbackEntry|null $entry
+ */
+?>
 <? if ($feedback->mode != 0) : ?>
 <?php
-        $n = 5;
-        if ($feedback->mode == 2) {
-            $n = 10;
-        }
-    ?>
+    $n = 5;
+    if ($feedback->mode == 2) {
+        $n = 10;
+    }
+?>
 <div class="rating">
     <p><?= _('Bewertung') ?></p>
     <? for ($i = 1; $i < $n+1; $i++) : ?>
-    <label class="star-rating undecorated <?= $i <= $entry->rating || $i === 1 ? ' checked' : '' ?>">
+    <label class="star-rating undecorated <?= (isset($entry) && $i <= $entry->rating) || $i === 1 ? ' checked' : '' ?>">
         <input class="star-rating-input" name="rating" value="<?= $i ?>" type="radio"
-            <?= $i == $entry->rating ? ' selected' : '' ?> required/>
-        <?= Icon::create('star', 'clickable') ?>
+               required
+               <? if (isset($entry) && $i == $entry->rating) echo 'selected'; ?>>
+        <?= Icon::create('star') ?>
     </label>
     <? endfor; ?>
 </div>
 <? endif; ?>
-<? if ($feedback->commentable == 1) : ?>
+<? if ($feedback->commentable) : ?>
 <label>
     <?= _('Kommentar') ?>
     <textarea name="comment"><?= htmlReady($entry->comment) ?></textarea>
diff --git a/app/views/course/forum/index/_post.php b/app/views/course/forum/index/_post.php
index 864c796d6a0..538b98d42d3 100644
--- a/app/views/course/forum/index/_post.php
+++ b/app/views/course/forum/index/_post.php
@@ -70,7 +70,7 @@
 
             <span data-show-topic="<?= $post['topic_id'] ?>">
                 <a href="<?= $controller->link_for('course/forum/index/index/' . $post['topic_id'] .'?'. http_build_query(['highlight' => $highlight]) ) ?>#<?= $post['topic_id'] ?>">
-                <? if ($show_full_path) : ?>
+                <? if (!empty($show_full_path)) : ?>
                     <?= ForumHelpers::highlight(htmlReady(implode(' >> ', ForumEntry::getFlatPathToPosting($post['topic_id']))), $highlight) ?>
                 <? elseif ($post['depth'] < 3) : ?>
                 <span data-topic-name="<?= $post['topic_id'] ?>">
diff --git a/app/views/course/forum/index/index.php b/app/views/course/forum/index/index.php
index 029b93d9243..2f887359368 100644
--- a/app/views/course/forum/index/index.php
+++ b/app/views/course/forum/index/index.php
@@ -141,7 +141,7 @@ $pagechooser = null;
             .'/%s/?searchfor=' . $searchfor . (!empty($options) ? '&'. http_build_query($options) : '' ))))
     ]); ?>
     <? endif ?>
-    <?= $link  ?>
+    <?= $link ?? ''  ?>
 </div>
 <? endif ?>
 
diff --git a/app/views/questionnaire/evaluate.php b/app/views/questionnaire/evaluate.php
index f33162fcc31..7a8def7b6c9 100644
--- a/app/views/questionnaire/evaluate.php
+++ b/app/views/questionnaire/evaluate.php
@@ -34,25 +34,25 @@
     </script>
     <div data-dialog-button style="max-height: none; opacity: 1; text-align: center;">
         <? if ($questionnaire->isAnswerable() && $questionnaire['editanswers']) : ?>
-            <?= \Studip\LinkButton::create($questionnaire->isAnswered() ? _("Antwort ändern") : _("Beantworten"), URLHelper::getURL("dispatch.php/questionnaire/answer/".$questionnaire->getId(), ['range_type' => $range_type, 'range_id' => $range_id]), ['data-dialog' => '']) ?>
+            <?= \Studip\LinkButton::create($questionnaire->isAnswered() ? _("Antwort ändern") : _("Beantworten"), URLHelper::getURL("dispatch.php/questionnaire/answer/".$questionnaire->getId()), ['data-dialog' => '']) ?>
         <? endif ?>
         <? if ($questionnaire->isEditable()) : ?>
             <?= \Studip\LinkButton::create(_("Ergebnisse herunterladen"), URLHelper::getURL("dispatch.php/questionnaire/export/".$questionnaire->getId())) ?>
         <? endif ?>
         <? if ($questionnaire->isEditable() && (!$questionnaire->isRunning() || !$questionnaire->countAnswers())) : ?>
-            <?= \Studip\LinkButton::create(_("Bearbeiten"), URLHelper::getURL("dispatch.php/questionnaire/edit/".$questionnaire->getId(), ['range_type' => $range_type, 'range_id' => $range_id]), ['data-dialog' => '']) ?>
+            <?= \Studip\LinkButton::create(_("Bearbeiten"), URLHelper::getURL("dispatch.php/questionnaire/edit/".$questionnaire->getId()), ['data-dialog' => '']) ?>
         <? endif ?>
         <? if ($questionnaire->isEditable()) : ?>
-            <?= \Studip\LinkButton::create(_("Kontext auswählen"), URLHelper::getURL("dispatch.php/questionnaire/context/".$questionnaire->getId(), ['range_type' => $range_type, 'range_id' => $range_id]), ['data-dialog' => '']) ?>
+            <?= \Studip\LinkButton::create(_("Kontext auswählen"), URLHelper::getURL("dispatch.php/questionnaire/context/".$questionnaire->getId()), ['data-dialog' => '']) ?>
         <? endif ?>
         <? if ($questionnaire->isCopyable()) : ?>
             <?= \Studip\LinkButton::create(_("Kopieren"), URLHelper::getURL("dispatch.php/questionnaire/copy/".$questionnaire->getId()), ['data-dialog' => '']) ?>
         <? endif ?>
         <? if ($questionnaire->isEditable() && !$questionnaire->isRunning()) : ?>
-            <?= \Studip\LinkButton::create(_("Starten"), URLHelper::getURL("dispatch.php/questionnaire/start/".$questionnaire->getId(),  in_array($range_type, ['course', 'insitute']) ? ['redirect' => $range_type . "/overview"] : [])) ?>
+            <?= \Studip\LinkButton::create(_("Starten"), URLHelper::getURL("dispatch.php/questionnaire/start/".$questionnaire->getId())) ?>
         <? endif ?>
         <? if ($questionnaire->isEditable() && $questionnaire->isRunning()) : ?>
-            <?= \Studip\LinkButton::create(_("Beenden"), URLHelper::getURL("dispatch.php/questionnaire/stop/".$questionnaire->getId(), in_array($range_type, ['course', 'insitute']) ? ['redirect' => $range_type . "/overview"] : [])) ?>
+            <?= \Studip\LinkButton::create(_("Beenden"), URLHelper::getURL("dispatch.php/questionnaire/stop/".$questionnaire->getId())) ?>
         <? endif ?>
 
     </div>
diff --git a/app/views/siteinfo/markup/adminList.php b/app/views/siteinfo/markup/adminList.php
index 1b0cf2c6377..68b514d5e6b 100644
--- a/app/views/siteinfo/markup/adminList.php
+++ b/app/views/siteinfo/markup/adminList.php
@@ -1,7 +1,7 @@
 <?
 # Lifter010: TODO
 ?>
-<? if ($error) : ?>
+<? if (!empty($error)) : ?>
     <em><?= _("keine. Na sowas. Das kann ja eigentlich gar nicht sein...") ?></em>
 <? else : ?>
     <? $current_head = "" ?>
diff --git a/app/views/siteinfo/markup/indicator.php b/app/views/siteinfo/markup/indicator.php
index 16e3943e403..4748f53150f 100644
--- a/app/views/siteinfo/markup/indicator.php
+++ b/app/views/siteinfo/markup/indicator.php
@@ -1,7 +1,4 @@
-<?
-# Lifter010: TODO
-?>
-<? if($detail != '') : ?>
+<? if (!empty($detail)) : ?>
     <span title="<?= $detail ?>">
 <? else : ?>
     <span>
diff --git a/app/views/siteinfo/markup/rootlist.php b/app/views/siteinfo/markup/rootlist.php
index 4f8344a7f2d..2ab31e09f6c 100644
--- a/app/views/siteinfo/markup/rootlist.php
+++ b/app/views/siteinfo/markup/rootlist.php
@@ -1,7 +1,7 @@
 <?
 # Lifter010: TODO
 ?>
-<? if ($error) : ?>
+<? if (!empty($error)) : ?>
     <em><?= _("keine. Na sowas. Das kann ja eigentlich gar nicht sein...") ?></em>
 <? else : ?>
     <ul>
diff --git a/app/views/siteinfo/markup/toplist.php b/app/views/siteinfo/markup/toplist.php
index 499a0b70326..d7f88fe0ddb 100644
--- a/app/views/siteinfo/markup/toplist.php
+++ b/app/views/siteinfo/markup/toplist.php
@@ -9,7 +9,7 @@
             case "seminar":
                 $link = URLHelper::getLink('dispatch.php/course/details/', ['sem_id' => $line["seminar_id"],
                                                                 'send_from_search' => 'true',
-                                                                'send_from_search_page' => $view]);
+                                                                'send_from_search_page' => $view ?? null]);
                 break;
             case "user":
                 $link = URLHelper::getLink('dispatch.php/profile', ['username' => $line["username"]]);
diff --git a/lib/classes/CoursesetModel.php b/lib/classes/CoursesetModel.php
index 9694a41c0df..e12d3b9682b 100644
--- a/lib/classes/CoursesetModel.php
+++ b/lib/classes/CoursesetModel.php
@@ -163,6 +163,8 @@ class CoursesetModel
      * admission rules
      *
      * @return Array Found institutes.
+     *
+     * @todo this is a really messed up construct and should be refactored
      */
     public static function getInstitutes($filter = [])
     {
@@ -197,9 +199,9 @@ class CoursesetModel
             $num_sets = $cs_count_all_statement->fetchColumn();
 
             $my_inst['all'] = [
-                'name'     => _('alle'),
-                'is_fak'   => true,
-                'num_sets' => $num_sets
+                'name'   => _('alle'),
+                'is_fak' => true,
+                'count'  => $num_sets
             ];
             $top_insts = Institute::findBySQL('Institut_id = fakultaets_id ORDER BY Name');
         } else {
@@ -209,7 +211,7 @@ class CoursesetModel
             $my_inst[$inst->id] = $inst->toArray('name is_fak');
             $parameters[0] = $inst->id;
             $cs_count_statement->execute($parameters);
-            $my_inst[$inst->id]['num_sets'] = $cs_count_statement->fetchColumn();
+            $my_inst[$inst->id]['count'] = $cs_count_statement->fetchColumn();
             if ($inst->is_fak && ($perm->have_perm('root') || $inst->members->findBy('user_id', $user->id)->val('inst_perms') == 'admin')) {
                 $alle = $inst->sub_institutes;
                 if (count($alle)) {
@@ -219,18 +221,18 @@ class CoursesetModel
                     ];
 
                     $num_inst = 0;
-                    $num_sets_alle = $my_inst[$inst->id]['num_sets'];
+                    $num_sets_alle = $my_inst[$inst->id]['count'];
 
                     foreach ($alle as $institute) {
                        $num_inst += 1;
                        $my_inst[$institute->id] = $institute->toArray('name is_fak');
                        $parameters[0] = $institute->id;
                        $cs_count_statement->execute($parameters);
-                       $my_inst[$institute->id]['num_sets'] = $cs_count_statement->fetchColumn();
-                       $num_sets_alle += $my_inst[$institute->id]['num_sets'];
+                       $my_inst[$institute->id]['count'] = $cs_count_statement->fetchColumn();
+                       $num_sets_alle += $my_inst[$institute->id]['count'];
                     }
                     $my_inst[$inst->id . '_all']['num_inst'] = $num_inst;
-                    $my_inst[$inst->id . '_all']['num_sets']  = $num_sets_alle;
+                    $my_inst[$inst->id . '_all']['count']  = $num_sets_alle;
                 }
             }
         }
diff --git a/lib/classes/MediaProxy.php b/lib/classes/MediaProxy.php
index 138ff5c5f0e..d42becb893e 100644
--- a/lib/classes/MediaProxy.php
+++ b/lib/classes/MediaProxy.php
@@ -183,9 +183,9 @@ class MediaProxy
         }
 
         $type = $response['content-type'];
-        $length = $response['content-length'];
-        $chdate = $response['last-modified'];
-        $expires = $response['expires'];
+        $length = $response['content-length'] ?? null;
+        $chdate = $response['last-modified'] ?? null;
+        $expires = $response['expires'] ?? null;
 
         $chdate = isset($chdate) ? strtotime($chdate) : time();
         $expires = isset($expires) ? strtotime($expires) : time() + $this->cache_lifetime;
diff --git a/lib/classes/MyRealmModel.php b/lib/classes/MyRealmModel.php
index 878b4a267cd..063972c4746 100644
--- a/lib/classes/MyRealmModel.php
+++ b/lib/classes/MyRealmModel.php
@@ -87,7 +87,7 @@ class MyRealmModel
             $neue  = $result['new'];
 
             if (!is_null($result['last_modified']) && (int)$result['last_modified'] != 0) {
-                if ($my_obj['last_modified'] < $result['last_modified']) {
+                if (!isset($my_obj['last_modified']) || $my_obj['last_modified'] < $result['last_modified']) {
                     $my_obj['last_modified'] = $result['last_modified'];
                 }
             }
diff --git a/lib/classes/Siteinfo.php b/lib/classes/Siteinfo.php
index 6e8dbc3e1a2..32cbdeae1a2 100644
--- a/lib/classes/Siteinfo.php
+++ b/lib/classes/Siteinfo.php
@@ -535,7 +535,7 @@ class SiteinfoMarkupEngine {
             // iterate over the other indicators
             if (in_array($key,array_keys($indicator))) {
                 if (!isset($indicator[$key]['constraint']) || $indicator[$key]['constraint']) {
-                    if ($indicator[$key]['query']) {
+                    if (isset($indicator[$key]['query'])) {
                         $result = $this->db->query($indicator[$key]['query']);
                         $rows = $result->fetch(PDO::FETCH_NUM);
                         $template->count = $rows[0];
diff --git a/lib/classes/StudipCoreFormat.php b/lib/classes/StudipCoreFormat.php
index 15794bfb33f..871f5fa2851 100644
--- a/lib/classes/StudipCoreFormat.php
+++ b/lib/classes/StudipCoreFormat.php
@@ -531,8 +531,13 @@ class StudipCoreFormat extends TextFormat
         $tag = $matches[1];
         $params = explode(":",$matches[2]);
         $url = $matches[3];
-        $whitespace = $matches[4];
+        $whitespace = $matches[4] ?? null;
 
+        $title = null;
+        $link = null;
+        $position = null;
+        $width = null;
+        $virtual_url = null;
         foreach ($params as $key => $param) {
             if ($param) {
                 if (is_numeric($param)) {
@@ -558,9 +563,16 @@ class StudipCoreFormat extends TextFormat
 
         $url = TransformInternalLinks($url);
         $pu = @parse_url($url);
-        if (($pu['scheme'] == 'http' || $pu['scheme'] == 'https')
-                && ($pu['host'] == $_SERVER['HTTP_HOST'] || $pu['host'].':'.$pu['port'] == $_SERVER['HTTP_HOST'])
-                && mb_strpos($pu['path'], $GLOBALS['CANONICAL_RELATIVE_PATH_STUDIP']) === 0) {
+
+        $intern = false;
+        if (
+            in_array($pu['scheme'], ['http', 'https'])
+            && (
+                $pu['host'] === $_SERVER['HTTP_HOST']
+                || (isset($pu['port']) && $pu['host'] . ':' . $pu['port'] === $_SERVER['HTTP_HOST'])
+            )
+            && mb_strpos($pu['path'], $GLOBALS['CANONICAL_RELATIVE_PATH_STUDIP']) === 0
+        ) {
             $intern = true;
             $checkpath = urldecode(mb_substr($pu['path'], mb_strlen($GLOBALS['CANONICAL_RELATIVE_PATH_STUDIP'])));
             if (mb_strpos($checkpath, '../') === false) {
diff --git a/lib/classes/admission/UserFilter.class.php b/lib/classes/admission/UserFilter.class.php
index 32eed483083..d380ef0c0b5 100644
--- a/lib/classes/admission/UserFilter.class.php
+++ b/lib/classes/admission/UserFilter.class.php
@@ -200,7 +200,9 @@ class UserFilter
                  * been removed since saving data to DB.
                  */
                 //try {
-                    list($type, $param) = explode('_', $data['type']);
+                    $chunks = explode('_', $data['type']);
+                    $type = $chunks[0];
+                    $param = $chunks[1] ?? null;
                     if ($param) {
                         $field = new $type($param, $data['field_id']);
                     } else {
diff --git a/lib/models/DatafieldEntryModel.class.php b/lib/models/DatafieldEntryModel.class.php
index 0ae03c4a17f..cea65ef773f 100644
--- a/lib/models/DatafieldEntryModel.class.php
+++ b/lib/models/DatafieldEntryModel.class.php
@@ -50,6 +50,7 @@ class DatafieldEntryModel extends SimpleORMap implements PrivacyObject
     {
         $mask = ["user" => 1, "autor" => 2, "tutor" => 4, "dozent" => 8, "admin" => 16, "root" => 32];
 
+        $sec_range_id = null;
         if (is_a($model, "Course")) {
             $params[':institution_ids'] = $model->institutes->pluck('institut_id');
             $object_class = SeminarCategories::GetByTypeId($model->status)->id;
@@ -85,13 +86,11 @@ class DatafieldEntryModel extends SimpleORMap implements PrivacyObject
             $object_class = $model->getVariant();
             $object_type = 'moduldeskriptor';
             $range_id = $model->deskriptor_id;
-            $sec_range_id = null;
         } elseif (is_a($model, 'ModulteilDeskriptor')) {
             $params[':institution_ids'] = [$model->modulteil->modul->responsible_institute->institut_id];
             $object_class = $model->getVariant();
             $object_type = 'modulteildeskriptor';
             $range_id = $model->deskriptor_id;
-            $sec_range_id = null;
         } elseif ($model instanceof StatusgruppeUser) {
             if (isset($model->group->institute)) {
                 $params[':institution_ids'] = [$model->group->institute->id];
@@ -107,7 +106,6 @@ class DatafieldEntryModel extends SimpleORMap implements PrivacyObject
             $object_class = $model->getVariant();
             $object_type = 'studycourse';
             $range_id = $model->studiengang_id;
-            $sec_range_id = null;
         }
 
         if (!$object_type) {
@@ -144,7 +142,7 @@ class DatafieldEntryModel extends SimpleORMap implements PrivacyObject
             $query .= "AND ((object_class & :object_class) OR object_class IS NULL) $one_datafield ORDER BY priority";
             $params = array_merge($params, [
                 ':range_id' => (string) $range_id,
-                ':sec_range_id' => (string) ($sec_range_id ?? ''),
+                ':sec_range_id' => (string) $sec_range_id,
                 ':object_type' => $object_type,
                 ':object_class' => (int) $object_class]);
         }
@@ -161,12 +159,11 @@ class DatafieldEntryModel extends SimpleORMap implements PrivacyObject
                 $ret[$c] = clone $df_entry;
             } else {
                 $ret[$c] = clone $df_entry_i18n;
-                $row['content'] = I18NStringDatafield::load(
-                        [
-                            $row['datafield_id'],
-                            $range_id,
-                            (string) $sec_range_id
-                        ]);
+                $row['content'] = I18NStringDatafield::load([
+                    $row['datafield_id'],
+                    $range_id,
+                    (string) $sec_range_id
+                ]);
             }
             $ret[$c]->setData($row, true);
             if (!$row['isset_content']) {
diff --git a/lib/models/User.class.php b/lib/models/User.class.php
index 825df46e6d0..6011e6b791a 100644
--- a/lib/models/User.class.php
+++ b/lib/models/User.class.php
@@ -338,22 +338,22 @@ class User extends AuthUserMd5 implements Range, PrivacyObject
                   LEFT JOIN `user_online` uo ON (au.`user_id` = uo.`user_id`)
                   LEFT JOIN `user_info` ui ON (au.`user_id` = ui.`user_id`)";
 
-        if ($attributes['username']) {
+        if (!empty($attributes['username'])) {
             $where[] =  "au.`username` like :username";
             $params[':username'] = self::searchParam($attributes['username']);
         }
 
-        if ($attributes['vorname']) {
+        if (!empty($attributes['vorname'])) {
             $where[] = "au.`Vorname` LIKE :vorname";
             $params[':vorname'] = self::searchParam($attributes['vorname']);
         }
 
-        if ($attributes['nachname']) {
+        if (!empty($attributes['nachname'])) {
             $where[] = "au.`Nachname` LIKE :nachname";
             $params[':nachname'] = self::searchParam($attributes['nachname']);
         }
 
-        if ($attributes['email']) {
+        if (!empty($attributes['email'])) {
             $where[] = "au.`Email` LIKE :email";
             $params[':email'] = self::searchParam($attributes['email']);
         }
@@ -370,11 +370,11 @@ class User extends AuthUserMd5 implements Range, PrivacyObject
         }
 
         // show only users who are not lecturers
-        if ($attributes['show_only_not_lectures']) {
+        if (!empty($attributes['show_only_not_lectures'])) {
             $where[] = "au.`user_id` NOT IN (SELECT `user_id` FROM `seminar_user` WHERE `status` = 'dozent') ";
         }
 
-        if ($attributes['auth_plugins']) {
+        if (!empty($attributes['auth_plugins'])) {
             $where[] = "IFNULL(`auth_plugin`, 'preliminary') = :auth_plugins ";
             $params[':auth_plugins'] = $attributes['auth_plugins'];
         }
@@ -407,7 +407,7 @@ class User extends AuthUserMd5 implements Range, PrivacyObject
         }
 
         // userdomains
-        if ($attributes['userdomains']) {
+        if (!empty($attributes['userdomains'])) {
             $joins[] = "LEFT JOIN `user_userdomains` uud ON (au.`user_id` = uud.`user_id`)";
             $joins[] = "LEFT JOIN `userdomains` uds USING (`userdomain_id`)";
             if ($attributes['userdomains'] === 'null-domain') {
diff --git a/lib/user_visible.inc.php b/lib/user_visible.inc.php
index c47640efd72..0706b325773 100644
--- a/lib/user_visible.inc.php
+++ b/lib/user_visible.inc.php
@@ -119,6 +119,8 @@ function get_vis_query($table_alias = 'auth_user_md5', $context = '') {
         $context_default = (int) Config::get()->getValue(mb_strtoupper($context) . '_VISIBILITY_DEFAULT');
         $contextQuery = " AND (IFNULL(user_visibility.{$context}, {$context_default}) = 1
                                OR {$table_alias}.visible = 'always')";
+    } else {
+        $contextQuery = '';
     }
 
     $my_domains = UserDomain::getUserDomainsForUser($GLOBALS['user']->id);
diff --git a/lib/visual.inc.php b/lib/visual.inc.php
index 99d80b002c3..4d63df482a8 100644
--- a/lib/visual.inc.php
+++ b/lib/visual.inc.php
@@ -311,10 +311,10 @@ function isLinkIntern($url) {
         return true;
     }
 
-    return in_array($pum['scheme'], ['https', 'http', NULL], true)
-        && in_array($pum['host'], [$_SERVER['SERVER_NAME'], NULL], true)
-        && in_array($pum['port'], [$_SERVER['SERVER_PORT'], NULL], true)
-        && mb_strpos($pum['path'], $GLOBALS['CANONICAL_RELATIVE_PATH_STUDIP']) === 0;
+    return in_array($pum['scheme'] ?? null, ['https', 'http', NULL], true)
+        && in_array($pum['host'] ?? null, [$_SERVER['SERVER_NAME'], NULL], true)
+        && in_array($pum['port'] ?? null, [$_SERVER['SERVER_PORT'], NULL], true)
+        && mb_strpos($pum['path'] ?? '', $GLOBALS['CANONICAL_RELATIVE_PATH_STUDIP']) === 0;
 }
 
 /**
diff --git a/public/sendfile.php b/public/sendfile.php
index 80084083c2c..77cc7353a3b 100644
--- a/public/sendfile.php
+++ b/public/sendfile.php
@@ -175,7 +175,7 @@ while (ob_get_level()) {
     ob_end_clean();
 }
 
-if (isset($file_ref) && $file_ref->file->metadata['access_type'] == 'redirect') {
+if (isset($file_ref, $file_ref->file) && $file_ref->file->metadata['access_type'] === 'redirect') {
     $file_ref->incrementDownloadCounter();
     header('Location: ' . $file_ref->file->metadata['url']);
     die();
diff --git a/templates/shared/pagechooser.php b/templates/shared/pagechooser.php
index bf8726db28c..d4416bb5c64 100644
--- a/templates/shared/pagechooser.php
+++ b/templates/shared/pagechooser.php
@@ -13,7 +13,7 @@
     $last_page = reset($items) - 1;
     $random_id = mb_substr(md5(uniqid('pagination', true)), -8);
 
-    $pageparams = $pageparams ?: [];
+    $pageparams = $pageparams ?? [];
 ?>
 <p id="pagination-label-<?= $random_id ?>" class="audible">
     <?= _('Blättern') ?>
-- 
GitLab