From 1cdef43a87e9ec1536ead3c0fa8ea43f7a366418 Mon Sep 17 00:00:00 2001
From: PBBFA24AAL
Date: Fri, 10 Jul 2026 16:23:50 +0200
Subject: [PATCH] Add weekly progress and validation
---
README.md | 6 ++++--
app/Controllers/HabitController.php | 11 ++++++++++-
app/Models/Category.php | 10 +++++++++-
app/Models/Habit.php | 8 ++++++--
app/Views/habits/dashboard.php | 3 +--
app/Views/habits/form.php | 12 +++++++++---
6 files changed, 39 insertions(+), 11 deletions(-)
diff --git a/README.md b/README.md
index c9e2e9c..efdef4d 100644
--- a/README.md
+++ b/README.md
@@ -9,6 +9,7 @@ Habit Tracker ist eine PHP-Webanwendung, mit der Benutzer eigene Gewohnheiten an
- Habits erstellen, bearbeiten, loeschen und fuer heute abhaken
- Kategorien und Statusfilter im Dashboard
- Tagesprotokoll ueber `habit_logs`
+- Wochenfortschritt im Dashboard gegen das persoenliche Wochenziel
- Responsive Oberflaeche fuer Desktop und Smartphone
- Serverseitige Validierung und klare Fehlermeldungen
- Schutz gegen SQL-Injection durch PDO Prepared Statements
@@ -67,8 +68,9 @@ Die Datenbank besteht aus 5 Tabellen:
3. Habit mit Kategorie und Wochenziel erstellen.
4. Habit im Dashboard filtern.
5. Habit fuer heute abhaken.
-6. Habit bearbeiten und loeschen.
-7. Seite auf Smartphone-Breite pruefen.
+6. Wochenfortschritt im Dashboard kontrollieren.
+7. Habit bearbeiten und loeschen.
+8. Seite auf Smartphone-Breite pruefen.
## Bewertungsbezug
diff --git a/app/Controllers/HabitController.php b/app/Controllers/HabitController.php
index 3db81a5..1a0efef 100644
--- a/app/Controllers/HabitController.php
+++ b/app/Controllers/HabitController.php
@@ -119,6 +119,16 @@ class HabitController
if ($title === '') {
$errors['title'] = 'Bitte gib einen Namen fuer den Habit ein.';
+ } elseif (mb_strlen($title) > 120) {
+ $errors['title'] = 'Der Name darf maximal 120 Zeichen lang sein.';
+ }
+
+ if (mb_strlen($description) > 1000) {
+ $errors['description'] = 'Die Beschreibung darf maximal 1000 Zeichen lang sein.';
+ }
+
+ if ($categoryId !== '' && !Category::exists((int) $categoryId)) {
+ $errors['category_id'] = 'Bitte waehle eine gueltige Kategorie aus.';
}
if ($targetPerWeek < 1 || $targetPerWeek > 7) {
@@ -134,4 +144,3 @@ class HabitController
];
}
}
-
diff --git a/app/Models/Category.php b/app/Models/Category.php
index 8982b81..c984432 100644
--- a/app/Models/Category.php
+++ b/app/Models/Category.php
@@ -1,4 +1,4 @@
-query('SELECT id, name, color FROM categories ORDER BY name')
->fetchAll();
}
+
+ public static function exists(int $id): bool
+ {
+ $statement = Database::connection()->prepare('SELECT id FROM categories WHERE id = :id LIMIT 1');
+ $statement->execute(['id' => $id]);
+
+ return (bool) $statement->fetch();
+ }
}
diff --git a/app/Models/Habit.php b/app/Models/Habit.php
index 77808ec..53f0289 100644
--- a/app/Models/Habit.php
+++ b/app/Models/Habit.php
@@ -1,4 +1,4 @@
-= e($habit['description']) ?>
= e($habit['category_name'] ?? 'Ohne Kategorie') ?> |
- Ziel: = (int) $habit['target_per_week'] ?>x pro Woche
+ Woche: = (int) $habit['completed_this_week'] ?> / = (int) $habit['target_per_week'] ?> erledigt
@@ -64,4 +64,3 @@
-
diff --git a/app/Views/habits/form.php b/app/Views/habits/form.php
index f12b11c..6b6ac43 100644
--- a/app/Views/habits/form.php
+++ b/app/Views/habits/form.php
@@ -14,6 +14,7 @@
id="title"
name="title"
type="text"
+ maxlength="120"
class="= !empty($errors['title']) ? 'input-error' : '' ?>"
value="= e($habit['title'] ?? '') ?>"
required
@@ -24,10 +25,13 @@
-
+
+
+ = e($errors['description']) ?>
+
-