thw-theorie-web/functions.inc.php
Kai Blaschke 7b28fea35c
Code-Modernisierungen für PHP-8-Kompatibilität.
Zusätzlich Charsets, Linebreaks und Kommentar-Blöcke korrigiert.
2023-01-24 15:12:37 +01:00

294 lines
9.5 KiB
PHP

<?php
/*
* Copyright (C) 2001 Kai Blaschke <webmaster@thw-theorie.de>
*
* The included 'THW Thema' templates, logos and the Q&A catalog are protected
* by copyright laws, and must not be used without the written permission
* of the
*
* Bundesanstalt Technisches Hilfswerk
* Provinzialstraße 93
* D-53127 Bonn
* Germany
* E-Mail: redaktion@thw.de
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/**
* Holt eine einzelne Frage aus der Datenbank.
* @param int $id Die Frage-ID
* @return array Die Fragen-Inhalte als assoziatives Array.
*/
function getQuestionById(int $id): array
{
$stmt = $GLOBALS['db']->prepare('SELECT * FROM fragen WHERE ID=?');
$stmt->bind_param('i', $id);
$stmt->execute();
$result = $stmt->get_result();
$question = $result->fetch_array(MYSQLI_ASSOC);
return $question;
}
/**
* Holt eine Liste aller Abschnitte im aktuellen Jahr
* @return array Liste der Themenbereiche.
*/
function getTopics(): array
{
$nr = 0;
$description = '';
$stmt = $GLOBALS['db']->prepare('SELECT `Nr`,`Beschreibung` FROM `abschnitte` WHERE `Jahr` = ? ORDER BY `Nr`');
$stmt->bind_param('i', $_SESSION['jahr']);
$stmt->execute();
$stmt->bind_result($nr, $description);
$topics = array();
while ($stmt->fetch()) {
$topics[$nr] = $description;
}
$stmt->close();
return $topics;
}
/**
* Kopfzeile mit Informationen über Fragen-Nummer und Lernabschnitt.
* @param int $id Frage-ID
* @param int $nr Frage-Nummer
* @param int $questionCount Anzahl Fragen
* @return void
*/
function questionHeader(int $id, int $nr, int $questionCount): void
{
$section = getSingleResult('SELECT Abschnitt FROM fragen WHERE ID=? AND Jahr=?',
array('ii', $id, $_SESSION['jahr']));
$sectionName = getSingleResult('SELECT Beschreibung FROM abschnitte WHERE Nr=? AND Jahr=?',
array('ii', $section, $_SESSION['jahr']));
$GLOBALS['tpl']->addVars(Array(
'aktuelleFrage' => $nr,
'fragenCnt' => $questionCount,
'abschnittNr' => $section,
'abschnitt' => $sectionName
));
$GLOBALS['tpl']->parseBlock('content', 'Kopf', 'Content');
}
/**
* Eine einzelne Frage mit Kopfzeile ausgeben.
* @param int $id Frage-ID
* @param int $nr Frage-Nummer
* @param int $questionCount Anzahl Fragen
* @return void
*/
function SingleQuestion(int $id, int $nr, int $questionCount): void
{
questionHeader($id, $nr, $questionCount);
showQuestion($id);
}
/**
* Fragengenerator
*
* Erzeugt eine Tabelle mit Frage, Antworten und Formularinformationen
* zur übergebenen Fragen-ID
* @param int $id Fragen-ID
* @return void
*/
function showQuestion(int $id): void
{
// Frage aus DB holen
$stmt = $GLOBALS['db']->prepare('SELECT * FROM fragen WHERE ID=?');
$stmt->bind_param('i', $id);
$stmt->execute();
$result = $stmt->get_result();
$question = $result->fetch_array(MYSQLI_ASSOC);
$GLOBALS['tpl']->addVars(Array(
'frageID' => $id,
'frageNr' => $question['Nr'],
'abschnittNr' => $question['Abschnitt'],
'frageText' => $question['Frage'],
'Antwort1' => $question['Antwort1'],
'Antwort2' => $question['Antwort2'],
'Antwort3' => $question['Antwort3']
));
if ($question['Antwort3'] == '') {
$GLOBALS['tpl']->addVars('rowCnt', '2');
$GLOBALS['tpl']->delBlockHandle('content', 'ThreeRows');
}
else {
$GLOBALS['tpl']->addVars('rowCnt', '3');
$GLOBALS['tpl']->parseBlock('content', 'ThreeRows', 'Row', TRUE);
}
$result->close();
$stmt->close();
}
/**
* Auswertung
*
* Erzeugt eine Tabelle mit Frage, Antworten und Markiert richtige/falsche
* Antworten farblich (grün=richtig, rot=falsch)
* @param int $id Frage-ID
* @param array $answer Antwort-Array
* @param bool $showStatus Status anzeigen
* @return bool true, falls korrekt beantwortet, sonst false.
*/
function Answer(int $id, array $answer, bool $showStatus = true): bool
{
// Frage aus DB holen
$question = getQuestionById($id);
// Einzelne Antworten aus Flag in Array splitten
$solution = array( 1 => ( $question['Loesung'] & 0x1),
2 => (($question['Loesung'] & 0x2) >> 1),
3 => (($question['Loesung'] & 0x4) >> 2));
$correct = (($solution[1] == (isset($answer[$id][1]) ? $answer[$id][1] : 0))
&& ($solution[2] == (isset($answer[$id][2]) ? $answer[$id][2] : 0))
&& ($solution[3] == (isset($answer[$id][3]) ? $answer[$id][3] : 0)));
// Aufräumen
$GLOBALS['tpl']->delHandle('antwortStatus');
$GLOBALS['tpl']->delHandle('antwort1Loesung');
$GLOBALS['tpl']->delHandle('antwort2Loesung');
$GLOBALS['tpl']->delHandle('antwort3Loesung');
$GLOBALS['tpl']->delBlockHandle('content', 'A1L');
$GLOBALS['tpl']->delBlockHandle('content', 'A2L');
$GLOBALS['tpl']->delBlockHandle('content', 'A3L');
if ($showStatus) {
if ($correct)
$GLOBALS['tpl']->parseBlock('content', 'Status', 'Richtig');
else
$GLOBALS['tpl']->parseBlock('content', 'Status', 'Falsch');
} else {
if ($correct)
$GLOBALS['tpl']->parseBlock('content', 'BogenStatus', 'Richtig');
else
$GLOBALS['tpl']->parseBlock('content', 'BogenStatus', 'Falsch');
}
$GLOBALS['tpl']->addVars(Array(
'abschnittNr' => $question['Abschnitt'],
'frageNr' => $question['Nr'],
'frageText' => $question['Frage'],
'antwort1Status' => $solution[1] ? 'korrekt' : 'falsch',
'antwort2Status' => $solution[2] ? 'korrekt' : 'falsch',
'antwort3Status' => $solution[3] ? 'korrekt' : 'falsch',
'Antwort1' => $question['Antwort1'],
'Antwort2' => $question['Antwort2'],
'Antwort3' => $question['Antwort3']
));
if ($question['Antwort3'] == '') {
$GLOBALS['tpl']->addVars('rowCnt', '2');
$GLOBALS['tpl']->delBlockHandle('content', 'ThreeRows');
}
else {
$GLOBALS['tpl']->addVars('rowCnt', '3');
$GLOBALS['tpl']->parseBlock('content', 'ThreeRows', 'Row');
}
if (isset($answer[$id][1]) && $answer[$id][1] === '1') $GLOBALS['tpl']->parseBlock('content', 'A1L', 'Haken');
if (isset($answer[$id][2]) && $answer[$id][2] === '1') $GLOBALS['tpl']->parseBlock('content', 'A2L', 'Haken');
if (isset($answer[$id][3]) && $answer[$id][3] === '1') $GLOBALS['tpl']->parseBlock('content', 'A3L', 'Haken');
// Anhängen per default
$GLOBALS['tpl']->parse('content', 'antwort', TRUE, TRUE);
return $correct;
}
/**
* Brotkrumen-Navigation.
*
* Fügt einen Link zur Brotkrumen-Navigation hinzu.
* @param string $page Seiten-Link
* @param string $title Seiten-Titel
* @return void
*/
function addBreadcrumb(string $page, string $title): void
{
$GLOBALS['tpl']->addVars(Array(
'page' => htmlspecialchars($page),
'pageTitle' => htmlspecialchars($title)
));
$GLOBALS['tpl']->parseBlock('page-body', 'Breadcrumb', 'Link', TRUE);
}
/**
* Zeigt die Auflösung an.
* @param array $frage Referenz auf das assoziative Fragen-Array
* @return void
*/
function ShowAnswer(array &$frage): void
{
// Einzelne Antworten aus Flag in Array splitten
$loesung = array( 1 => ( $frage['Loesung'] & 0x1),
2 => (($frage['Loesung'] & 0x2) >> 1),
3 => (($frage['Loesung'] & 0x4) >> 2));
// Aufräumen
$GLOBALS['tpl']->delHandle('antwortStatus');
$GLOBALS['tpl']->delHandle('antwort1Loesung');
$GLOBALS['tpl']->delHandle('antwort2Loesung');
$GLOBALS['tpl']->delHandle('antwort3Loesung');
$GLOBALS['tpl']->addVars(Array(
'abschnittNr' => $frage['Abschnitt'],
'frageNr' => $frage['Nr'],
'frageText' => $frage['Frage'],
'antwort1Status' => $loesung[1]?'korrekt':'falsch',
'antwort2Status' => $loesung[2]?'korrekt':'falsch',
'antwort3Status' => $loesung[3]?'korrekt':'falsch',
'Antwort1' => $frage['Antwort1'],
'Antwort2' => $frage['Antwort2'],
'Antwort3' => $frage['Antwort3']
));
$GLOBALS['tpl']->delBlockHandle('content', 'A1L');
$GLOBALS['tpl']->delBlockHandle('content', 'A2L');
$GLOBALS['tpl']->delBlockHandle('content', 'A3L');
if ($loesung[1]) $GLOBALS['tpl']->parseBlock('content', 'A1L', 'Haken');
if ($loesung[2]) $GLOBALS['tpl']->parseBlock('content', 'A2L', 'Haken');
if ($loesung[3]) $GLOBALS['tpl']->parseBlock('content', 'A3L', 'Haken');
if ($frage['Antwort3'] == '') {
$GLOBALS['tpl']->addVars('rowCnt', '2');
$GLOBALS['tpl']->delBlockHandle('content', 'ThreeRows');
}
else {
$GLOBALS['tpl']->addVars('rowCnt', '3');
$GLOBALS['tpl']->parseBlock('content', 'ThreeRows', 'Row');
}
}