feature/formeln-backend #84

Merged
mg8220s merged 9 commits from feature/formeln-backend into dev 2024-12-14 18:19:32 +01:00
33 changed files with 261 additions and 96 deletions

48
webseite/classes/Task.php Normal file
View File

@@ -0,0 +1,48 @@
<?php
class Task
{
/**
* @var string Aufgabentext kann z.B. auch LaTeX-Notation enthalten
*/
private string $text;
/**
* @var array Alle verwendeten Variablen mit key als Variable und value als richtigen Wert
*/
private array $variables;
/**
* Erstellt eine neue Aufgabe
* @param string $text Aufgabentext, kann z.B. auch LaTeX-Notation enthalten
* @param array $variables Assoziatives Array mit Variable → Richtiger Wert
*/
public function __construct(string $text, array $variables)
{
$this->text = $text;
$this->variables = array();
foreach ($variables as $variable => $value) {
if(!is_string($value)) {
continue;
}
$this->variables[$variable] = $value;
}
}
/**
* @return string Aufgabentext
*/
public function getText(): string
{
return $this->text;
}
/**
* @return array Assoziatives Array mit Variable → Richtiger Wert
*/
public function getVariables(): array
{
return $this->variables;
}
}

View File

@@ -3,6 +3,7 @@
use exception\SubjectDoesNotExistException;
use exception\TopicAlreadyExistsException;
require_once("Task.php");
require_once("Config.php");
require_once("Util.php");
@@ -46,7 +47,13 @@ class TopicData
/**
* @var string Der gesamte Erklärungstext zum Thema, enthält fertiges HTML und LATEX Formelsyntax für MathJax https://docs.mathjax.org/en/latest/basic/mathematics.html
*/
public string $article;
private string $article;
/**
* @var array Alle zugehörigen Formelaufgaben als Task
* @see Task
*/
private array $tasks;
/**
* Erstellt ein neues Thema. Es wird noch nichts gespeichert!
@@ -91,6 +98,8 @@ class TopicData
$result->article = $article;
$result->tasks = array();
return $result;
}
@@ -191,7 +200,26 @@ class TopicData
if (!isset($article)) {
$article = "Kein Erklärtext vorhanden";
}
$result->article = str_replace('$TOPICPATH', Config::getTopicDirectory($subjectId, $topicId) . "images", $article);
$result->article = $article;
$taskJson = Util::readFileContent(Config::getTopicDirectory($subjectId, $topicId) . "tasks.json");
$result->tasks = array();
if(isset($taskJson)) {
$arr = json_decode($taskJson, true);
foreach ($arr as $rawTask) {
$text = $rawTask["text"];
if(!isset($text)) {
continue;
}
$vars = $rawTask["vars"];
if (!isset($vars)) {
continue;
}
$result->tasks[] = new Task($text, $vars);
}
}
$result->cleanupRelatedTopics();
$result->cleanupFiles();
@@ -213,7 +241,6 @@ class TopicData
$data["icon"] = $this->icon;
$data["description"] = $this->description;
$data["relatedTopics"] = $this->relatedTopics;
$data["files"] = $this->files;
$json = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
if (!$json) {
@@ -229,8 +256,23 @@ class TopicData
mkdir($topicDirectory, 0777, true);
}
$taskArray = array();
foreach ($this->tasks as $task) {
$element = array();
$element["text"] = $task->getText();
$element["vars"] = $task->getVariables();
$taskArray[] = $element;
}
$taskJson = json_encode($taskArray, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
if (!$taskJson) {
return false;
}
if (!(Util::writeFileContent($topicDirectory . "properties.json", $json)
&& Util::writeFileContent($topicDirectory . "article.html", $json))
&& Util::writeFileContent($topicDirectory . "article.html", $this->article)
&& Util::writeFileContent($topicDirectory . "tasks.json", $taskJson)
)
) {
return false;
}
@@ -383,6 +425,18 @@ class TopicData
return true;
}
public function addTask(Task $task): bool
{
$this->tasks[] = $task;
return true;
}
public function removeTask(Task $task): bool
{
$this->tasks = array_diff($this->tasks, [$task]);
return true;
}
public function getId(): string
{
return $this->id;
@@ -453,6 +507,15 @@ class TopicData
$this->files = $files;
}
/**
* Gibt anders als getArticle() Bildpfade richtig aus
* @return string HTML Quelltext für den Erklärtext
*/
public function getFinishedArticle(): string
{
return str_replace('$TOPICPATH', Config::getTopicDirectory($this->subjectId, $this->id) . "images", $this->article);
}
public function getArticle(): string
{
return $this->article;
@@ -463,5 +526,13 @@ class TopicData
$this->article = $article;
}
public function getTasks(): array
{
return $this->tasks;
}
public function setTasks(array $tasks): void
{
$this->tasks = $tasks;
}
}

View File

@@ -1,6 +1,6 @@
{
"displayName": "Deutsch",
"description": "Deutsch ist rot",
"color": "#ef4444",
"icon": "fa-book"
"displayName": "Deutsch",
"description": "Deutsch ist rot",
"color": "#ef4444",
"icon": "fa-book"
}

View File

@@ -1,8 +1,9 @@
{
"displayName": "Adverbiale Bestimmung",
"icon": "fa-map-pin",
"description": "Adverbiale Bestimmungen sind Satzteile, die zusätzliche Informationen über Umstände wie Zeit, Ort, Grund oder Art und Weise geben und dadurch die Handlung des Satzes genauer beschreiben.",
"relatedTopics": [
"wortarten", "vier-faelle"
]
"displayName": "Adverbiale Bestimmung",
"icon": "fa-map-pin",
"description": "Adverbiale Bestimmungen sind Satzteile, die zusätzliche Informationen über Umstände wie Zeit, Ort, Grund oder Art und Weise geben und dadurch die Handlung des Satzes genauer beschreiben.",
"relatedTopics": [
"wortarten",
"vier-faelle"
]
}

View File

@@ -1,8 +1,9 @@
{
"displayName": "Geschichten erzählen",
"icon": "fa-feather-pointed",
"description": "Das Thema \"Geschichten erzählen\" umfasst das kreative Gestalten und Vermitteln von Erlebnissen oder Fantasien durch eine spannende Handlung, interessante Charaktere und lebendige Beschreibungen, um die Zuhörer oder Leser zu fesseln.",
"relatedTopics": [
"satzglieder", "personalpronomen"
]
"displayName": "Geschichten erzählen",
"icon": "fa-feather-pointed",
"description": "Das Thema \"Geschichten erzählen\" umfasst das kreative Gestalten und Vermitteln von Erlebnissen oder Fantasien durch eine spannende Handlung, interessante Charaktere und lebendige Beschreibungen, um die Zuhörer oder Leser zu fesseln.",
"relatedTopics": [
"satzglieder",
"personalpronomen"
]
}

View File

@@ -1,8 +1,9 @@
{
"displayName": "Personalpronomen",
"icon": "fa-person",
"description": "Personalpronomen sind Wörter, die anstelle von Personen oder Dingen verwendet werden, wie zum Beispiel \"ich\", \"du\", \"er\", \"sie\" oder \"es\", um Wiederholungen zu vermeiden und Sätze flüssiger zu gestalten.",
"relatedTopics": [
"wortarten", "geschichten-erzaehlen"
]
"displayName": "Personalpronomen",
"icon": "fa-person",
"description": "Personalpronomen sind Wörter, die anstelle von Personen oder Dingen verwendet werden, wie zum Beispiel \"ich\", \"du\", \"er\", \"sie\" oder \"es\", um Wiederholungen zu vermeiden und Sätze flüssiger zu gestalten.",
"relatedTopics": [
"wortarten",
"geschichten-erzaehlen"
]
}

View File

@@ -1,8 +1,9 @@
{
"displayName": "Satzglieder",
"icon": "fa-link",
"description": "Satzglieder sind die Bausteine eines Satzes, die jeweils eine bestimmte Funktion erfüllen, wie Subjekt, Prädikat, Objekt oder adverbiale Bestimmung, und sich gemeinsam verschieben lassen, ohne die grammatische Korrektheit des Satzes zu verändern.",
"relatedTopics": [
"wortarten", "vier-faelle"
]
"displayName": "Satzglieder",
"icon": "fa-link",
"description": "Satzglieder sind die Bausteine eines Satzes, die jeweils eine bestimmte Funktion erfüllen, wie Subjekt, Prädikat, Objekt oder adverbiale Bestimmung, und sich gemeinsam verschieben lassen, ohne die grammatische Korrektheit des Satzes zu verändern.",
"relatedTopics": [
"wortarten",
"vier-faelle"
]
}

View File

@@ -0,0 +1 @@
[]

View File

@@ -1,8 +1,8 @@
{
"displayName": "Vier Fälle",
"icon": "fa-4",
"description": "Die vier Fälle im Deutschen - Nominativ, Genitiv, Dativ und Akkusativ - beschreiben die verschiedenen grammatischen Funktionen eines Nomens oder Pronomens im Satz, wie Subjekt, Besitz, indirektes Objekt oder direktes Objekt.",
"relatedTopics": [
"satzglieder"
]
"displayName": "Vier Fälle",
"icon": "fa-4",
"description": "Die vier Fälle im Deutschen - Nominativ, Genitiv, Dativ und Akkusativ - beschreiben die verschiedenen grammatischen Funktionen eines Nomens oder Pronomens im Satz, wie Subjekt, Besitz, indirektes Objekt oder direktes Objekt.",
"relatedTopics": [
"satzglieder"
]
}

View File

@@ -0,0 +1 @@
[]

View File

@@ -1,8 +1,10 @@
{
"displayName": "Wortarten",
"icon": "fa-sitemap",
"description": "Wortarten sind Kategorien, in die Wörter anhand ihrer grammatischen Funktion und Bedeutung eingeteilt werden, wie zum Beispiel Nomen, Verben, Adjektive und Adverbien.",
"relatedTopics": [
"satzglieder", "adverbiale-bestimmung", "personalpronomen"
]
"displayName": "Wortarten",
"icon": "fa-sitemap",
"description": "Wortarten sind Kategorien, in die Wörter anhand ihrer grammatischen Funktion und Bedeutung eingeteilt werden, wie zum Beispiel Nomen, Verben, Adjektive und Adverbien.",
"relatedTopics": [
"satzglieder",
"adverbiale-bestimmung",
"personalpronomen"
]
}

View File

@@ -0,0 +1 @@
[]

View File

@@ -1,6 +1,6 @@
{
"displayName": "Englisch",
"description": "He she it das s muss mit!",
"color": "#17B750",
"icon": "fa-language"
"displayName": "Englisch",
"description": "He she it das s muss mit!",
"color": "#17B750",
"icon": "fa-language"
}

View File

@@ -1,8 +1,6 @@
{
"displayName": "Lorem Ipsum",
"icon": "fa-sitemap",
"description": "Lorem Ipsum",
"relatedTopics": [
]
"displayName": "Lorem Ipsum",
"icon": "fa-sitemap",
"description": "Lorem Ipsum",
"relatedTopics": []
}

View File

@@ -0,0 +1 @@
[]

View File

@@ -1,6 +1,6 @@
{
"displayName": "Mathe",
"description": "Mathe ist blau",
"color": "#3b82f6",
"icon": "fa-square-root-alt"
"displayName": "Mathe",
"description": "Mathe ist blau",
"color": "#3b82f6",
"icon": "fa-square-root-alt"
}

View File

@@ -1,8 +1,11 @@
{
"displayName": "Bruchrechnung",
"icon": "fa-chart-pie",
"description": "Die Bruchrechnung ist ein Teil der Mathematik, der das Rechnen mit Brüchen beinhaltet, also das Teilen eines Ganzen in gleich große Teile, und umfasst Operationen wie Addition, Subtraktion, Multiplikation und Division von Brüchen.",
"relatedTopics": [
"schriftliches-multiplizieren", "schriftliches-dividieren", "punkt-vor-strichrechnung", "rechnen-mit-klammern"
]
"displayName": "Bruchrechnung",
"icon": "fa-chart-pie",
"description": "Die Bruchrechnung ist ein Teil der Mathematik, der das Rechnen mit Brüchen beinhaltet, also das Teilen eines Ganzen in gleich große Teile, und umfasst Operationen wie Addition, Subtraktion, Multiplikation und Division von Brüchen.",
"relatedTopics": [
"schriftliches-multiplizieren",
"schriftliches-dividieren",
"punkt-vor-strichrechnung",
"rechnen-mit-klammern"
]
}

View File

@@ -0,0 +1,24 @@
[
{
"text": "34 + 26 = ?",
"vars": {
"?": "60",
"x": "5",
"y": "2"
}
},
{
"text": "a + b = c",
"vars": {
"a": "1",
"b": "2",
"c": "4"
}
},
{
"text": "Wie schreibt man nähmlich richtig?",
"vars": {
"?": "nämlich"
}
}
]

View File

@@ -1,8 +1,9 @@
{
"displayName": "Punkt- vor Strichrechnung",
"icon": "fa-plus-minus",
"description": "Die Regel \"Punkt vor Strichrechnung\" besagt, dass bei mathematischen Berechnungen Multiplikation und Division immer vor Addition und Subtraktion ausgeführt werden müssen, um das richtige Ergebnis zu erhalten.",
"relatedTopics": [
"rechnen-mit-klammern", "bruchrechnung"
]
"displayName": "Punkt- vor Strichrechnung",
"icon": "fa-plus-minus",
"description": "Die Regel \"Punkt vor Strichrechnung\" besagt, dass bei mathematischen Berechnungen Multiplikation und Division immer vor Addition und Subtraktion ausgeführt werden müssen, um das richtige Ergebnis zu erhalten.",
"relatedTopics": [
"rechnen-mit-klammern",
"bruchrechnung"
]
}

View File

@@ -1,8 +1,9 @@
{
"displayName": "Rechnen mit Einheiten",
"icon": "fa-clock",
"description": "Rechnen mit Einheiten bedeutet, Größen mit verschiedenen Maßeinheiten wie Meter, Kilogramm oder Liter rechnerisch zu verarbeiten, dabei die Einheiten korrekt umzurechnen und sicherzustellen, dass das Ergebnis in der richtigen Einheit angegeben wird.",
"relatedTopics": [
"schriftliches-dividieren", "bruchrechnung"
]
"displayName": "Rechnen mit Einheiten",
"icon": "fa-clock",
"description": "Rechnen mit Einheiten bedeutet, Größen mit verschiedenen Maßeinheiten wie Meter, Kilogramm oder Liter rechnerisch zu verarbeiten, dabei die Einheiten korrekt umzurechnen und sicherzustellen, dass das Ergebnis in der richtigen Einheit angegeben wird.",
"relatedTopics": [
"schriftliches-dividieren",
"bruchrechnung"
]
}

View File

@@ -1,8 +1,9 @@
{
"displayName": "Rechnen mit Klammern",
"icon": "fa-code",
"description": "Beim Rechnen mit Klammern werden die Rechenoperationen innerhalb der Klammern zuerst ausgeführt, bevor die restlichen Berechnungen im Ausdruck vorgenommen werden, um die korrekte Reihenfolge der Rechenschritte einzuhalten.",
"relatedTopics": [
"punkt-vor-strichrechnung", "bruchrechnung"
]
"displayName": "Rechnen mit Klammern",
"icon": "fa-code",
"description": "Beim Rechnen mit Klammern werden die Rechenoperationen innerhalb der Klammern zuerst ausgeführt, bevor die restlichen Berechnungen im Ausdruck vorgenommen werden, um die korrekte Reihenfolge der Rechenschritte einzuhalten.",
"relatedTopics": [
"punkt-vor-strichrechnung",
"bruchrechnung"
]
}

View File

@@ -1,8 +1,8 @@
{
"displayName": "Schriftliches Dividieren",
"icon": "fa-divide",
"description": "Schriftliches Dividieren ist eine Methode zur schrittweisen Aufteilung einer Zahl durch eine andere, wobei man die Teilschritte nacheinander schriftlich notiert, um das Ergebnis systematisch zu berechnen.",
"relatedTopics": [
"schriftliches-multiplizieren"
]
"displayName": "Schriftliches Dividieren",
"icon": "fa-divide",
"description": "Schriftliches Dividieren ist eine Methode zur schrittweisen Aufteilung einer Zahl durch eine andere, wobei man die Teilschritte nacheinander schriftlich notiert, um das Ergebnis systematisch zu berechnen.",
"relatedTopics": [
"schriftliches-multiplizieren"
]
}

View File

@@ -1,8 +1,8 @@
{
"displayName": "Schriftliches Multiplizieren",
"icon": "fa-x",
"description": "Schriftliches Multiplizieren ist eine Rechenmethode, bei der zwei Zahlen schrittweise multipliziert werden, indem man die einzelnen Stellen der Zahlen nacheinander verrechnet, die Teilergebnisse notiert und am Ende addiert, um das Gesamtergebnis zu erhalten.",
"relatedTopics": [
"schriftliches-dividieren"
]
"displayName": "Schriftliches Multiplizieren",
"icon": "fa-x",
"description": "Schriftliches Multiplizieren ist eine Rechenmethode, bei der zwei Zahlen schrittweise multipliziert werden, indem man die einzelnen Stellen der Zahlen nacheinander verrechnet, die Teilergebnisse notiert und am Ende addiert, um das Gesamtergebnis zu erhalten.",
"relatedTopics": [
"schriftliches-dividieren"
]
}

View File

@@ -23,7 +23,7 @@ foreach ($subjects as $subject) {
strpos(strtolower($subject->displayName), $query) !== false ||
strpos(strtolower($topic->displayName), $query) !== false ||
strpos(strtolower($topic->description), $query) !== false ||
strpos(strtolower($topic->article), $query) !== false
strpos(strtolower($topic->getFinishedArticle()), $query) !== false
) {
$results[] = [
'type' => 'topic',

View File

@@ -89,7 +89,7 @@ if (!isset($topicData)) {
<?php echo($topicData->description); ?>
</p>
<p class="content-text article-section">
<?php echo($topicData->article); ?>
<?php echo($topicData->getFinishedArticle()); ?>
</p>
<div class="exercise-section bg-gray-100">