From 6fd7b8d918d197f468e49e8a8158995bddbfa4ad Mon Sep 17 00:00:00 2001 From: pbbfa23abi Date: Wed, 9 Jul 2025 11:15:31 +0200 Subject: [PATCH 1/4] user_role check im admin view --- Views/User/showUserAccountPage.phtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Views/User/showUserAccountPage.phtml b/Views/User/showUserAccountPage.phtml index 3b0e0ef..e5cad1c 100644 --- a/Views/User/showUserAccountPage.phtml +++ b/Views/User/showUserAccountPage.phtml @@ -45,7 +45,7 @@ From af6f6238ae48ebed5befe00ed8ffe37d7fc6ef95 Mon Sep 17 00:00:00 2001 From: pbbfa23abi Date: Thu, 10 Jul 2025 10:57:30 +0200 Subject: [PATCH 2/4] kurs bearbeiten --- Controller/UserController.php | 20 ++++++ Model/UserModel.php | 72 ++++++++++++++++++++- Views/User/showAdminForm.phtml | 37 +++++++++-- Views/User/showKursEditedConfirmation.phtml | 12 ++++ Views/User/showNewKursConfirmation.phtml | 2 +- 5 files changed, 134 insertions(+), 9 deletions(-) create mode 100644 Views/User/showKursEditedConfirmation.phtml diff --git a/Controller/UserController.php b/Controller/UserController.php index 5837577..aff9823 100644 --- a/Controller/UserController.php +++ b/Controller/UserController.php @@ -134,6 +134,26 @@ class UserController{ } } + public function validateEditKursForm(){ + foreach ($this->kursLabels as $index => $value) { + if($value === "|") continue; + if (strpos($value, "*") !== false && (!isset($_POST[$index]) || empty($_POST[$index]))) { + $this->kursErrors[$index] = "Bitte " . $value . " eingeben"; + } else { + $this->kursValidData[$index] = $_POST[$index] === '' ? null : $_POST[$index]; + } + } + if (count($this->errors) > 0) { + $this->view->setDoMethodName("showUserAccountPage"); + $this->showUserAccountPage(); + } else { + if ($this->db->writeNewCourse($this->kursValidData, $_SESSION["user_id"])) { + $this->view->setDoMethodName("showKursEditedConfirmation"); + $this->showConfirmation(); + } + } + } + public function showConfirmation(){} public function showUserLoginConfirmation(){ diff --git a/Model/UserModel.php b/Model/UserModel.php index 4dd93a7..98c01c9 100644 --- a/Model/UserModel.php +++ b/Model/UserModel.php @@ -157,7 +157,7 @@ class UserModel extends Database } public function getMyCourses() { - $sql = "SELECT k.id, k.name, k.preis, k.dauer, k.rabatt, k.kategorie, k.beschreibung, o.stadt, o.strasse, o.plz, b.note, b.kommentar + $sql = "SELECT k.id, k.name, k.preis, k.dauer, k.rabatt, k.kategorie, k.beschreibung, k.ort_id, o.stadt, o.strasse, o.plz, b.note, b.kommentar FROM kurs AS k JOIN ort AS o ON o.id = k.ort_id LEFT JOIN bewertungen AS b ON b.kurs_id = k.id @@ -174,4 +174,74 @@ class UserModel extends Database die; } } + + public function updateCourse($course) { + $pdo = $this->linkDB(); + + try { + if (isset($course['ort_id'])) { + $this->updateAddress($course); + $addressId = $course['ort_id']; + } else { + $addressId = $this->writeNewAddress($course); + } + + $sql = "UPDATE kurs SET + `name` = :name, + `preis` = :preis, + `dauer` = :dauer, + `rabatt` = :rabatt, + `kategorie` = :kategorie, + `beschreibung` = :beschreibung, + `ort_id` = :ort_id + WHERE `id` = :id"; + + $sth = $pdo->prepare($sql); + $sth->execute([ + ':id' => $course['id'], + ':name' => $course['name'], + ':preis' => $course['preis'], + ':dauer' => $course['dauer'], + ':rabatt' => $course['rabatt'], + ':kategorie' => $course['kategorie'], + ':beschreibung' => $course['beschreibung'], + ':ort_id' => $addressId + ]); + + } catch (PDOException $e) { + new \Blog\Library\ErrorMsg("Fehler beim Aktualisieren des Kurses.", $e); + die; + } + + return true; + } + + public function updateAddress($data) { + $pdo = $this->linkDB(); + + if (!isset($data['ort_id'])) { + throw new \Exception("Keine Adress-ID vorhanden zum Aktualisieren."); + } + + $sql = "UPDATE ort SET + `strasse` = :strasse, + `stadt` = :stadt, + `plz` = :plz + WHERE `id` = :id"; + + try { + $sth = $pdo->prepare($sql); + $sth->execute([ + ':id' => $data['ort_id'], + ':strasse' => $data['strasse'], + ':stadt' => $data['stadt'], + ':plz' => $data['plz'] + ]); + } catch (PDOException $e) { + new \Blog\Library\ErrorMsg("Fehler beim Aktualisieren der Adresse.", $e); + die; + } + + return true; + } } \ No newline at end of file diff --git a/Views/User/showAdminForm.phtml b/Views/User/showAdminForm.phtml index 4929a03..0e5cff4 100644 --- a/Views/User/showAdminForm.phtml +++ b/Views/User/showAdminForm.phtml @@ -1,6 +1,21 @@

Neuer Kurs

getMyCourses(); +$id = $_GET["id"] ?? null; + +$selectedCourse = null; +foreach ($courses as $course) { + if ($course['id'] === $id) { + $selectedCourse = $course; + break; + } +} +$validData = $selectedCourse ?? null; +$isEditing = $validData != null; +$saveLabel = $isEditing ? "Speichern" : "Erstellen"; + function createInputField($label, $name, $errors, $validData, $type = 'input') { $errorClass = isset($errors[$name]) ? 'error' : ''; $value = htmlspecialchars($validData[$name] ?? ''); @@ -36,15 +51,18 @@ function createInputField($label, $name, $errors, $validData, $type = 'input') { echo ''; ?> - -
- -
+ +
+ +
+ HTML; + ?>
getMyCourses(); $doc = new DOMDocument('1.0', 'UTF-8'); if (!empty($courses)) { @@ -52,7 +70,7 @@ if (!empty($courses)) { foreach ($courses as $kurs) { $courseCard = $doc->createElement('div'); $courseCard->setAttribute('class', 'course-card'); - + $courseImage = $doc->createElement('div'); $courseImage->setAttribute('class', 'course-image'); $courseCard->appendChild($courseImage); @@ -84,6 +102,11 @@ if (!empty($courses)) { $category = $doc->createElement('div', htmlspecialchars($kurs['kategorie'] ?? 'Keine Kategorie')); $courseRight->appendChild($category); + $editLink = $doc->createElement('a', "Bearbeiten"); + $editLink->setAttribute('href', '?controller=User&do=showUserAccountPage&id=' . $kurs['id']); + $editLink->setAttribute('class', 'course-card-link'); + $courseRight->appendChild($editLink); + echo $doc->saveHTML($courseCard); } echo ''; diff --git a/Views/User/showKursEditedConfirmation.phtml b/Views/User/showKursEditedConfirmation.phtml new file mode 100644 index 0000000..effcbd2 --- /dev/null +++ b/Views/User/showKursEditedConfirmation.phtml @@ -0,0 +1,12 @@ + + +
+

Kurs erfolgreich bearbeitet.

+Weiter +
+ + + + \ No newline at end of file diff --git a/Views/User/showNewKursConfirmation.phtml b/Views/User/showNewKursConfirmation.phtml index 35de568..7ee139a 100644 --- a/Views/User/showNewKursConfirmation.phtml +++ b/Views/User/showNewKursConfirmation.phtml @@ -4,7 +4,7 @@ include dirname(__DIR__).'/header.phtml';

Kurs erfolgreich erstellt.

-Weiter +Weiter
From 4e243976dbcd4821f21842b1b9196992a5d6f303 Mon Sep 17 00:00:00 2001 From: pbbfa23abi Date: Thu, 10 Jul 2025 11:32:32 +0200 Subject: [PATCH 3/4] fixes --- CSS/Element/form.css | 13 ++++-------- CSS/variables.css | 1 + Model/UserModel.php | 29 +++++++++++++++++++++------ Views/User/showUserRegisterForm.phtml | 4 +--- 4 files changed, 29 insertions(+), 18 deletions(-) diff --git a/CSS/Element/form.css b/CSS/Element/form.css index 2ab719d..2064c7c 100644 --- a/CSS/Element/form.css +++ b/CSS/Element/form.css @@ -95,21 +95,16 @@ form .error { grid-template-columns: auto !important; } -/* fix radio buttons registration */ .radio { flex-direction: row; - justify-content: space-between; max-width: 290px; align-items: center; -} - -.radio { - display: flex; - flex-direction: row; - align-items: center; - gap: 10px; + gap: 24px; + } .radio input { margin-top: 0; + height: var(--h-sm); + width: var(--h-sm); } diff --git a/CSS/variables.css b/CSS/variables.css index b85371f..0db4045 100644 --- a/CSS/variables.css +++ b/CSS/variables.css @@ -21,6 +21,7 @@ /*Font-Weight*/ --font-weight-semibold: 600; + --h-sm: 24px; --h-md: 48px; --border-primary: 1px solid #998E82; diff --git a/Model/UserModel.php b/Model/UserModel.php index 98c01c9..a5ac67e 100644 --- a/Model/UserModel.php +++ b/Model/UserModel.php @@ -157,17 +157,33 @@ class UserModel extends Database } public function getMyCourses() { - $sql = "SELECT k.id, k.name, k.preis, k.dauer, k.rabatt, k.kategorie, k.beschreibung, k.ort_id, o.stadt, o.strasse, o.plz, b.note, b.kommentar - FROM kurs AS k - JOIN ort AS o ON o.id = k.ort_id - LEFT JOIN bewertungen AS b ON b.kurs_id = k.id - ORDER BY k.name;"; + $personId = $_SESSION["user_id"]; + $isKursleiter = $_SESSION["user_role"] === "leiter"; $pdo = $this->linkDB(); + if ($isKursleiter) { + $sql = "SELECT k.id, k.name, k.preis, k.dauer, k.rabatt, k.kategorie, k.beschreibung, k.ort_id, + o.stadt, o.strasse, o.plz, b.note, b.kommentar + FROM kurs AS k + JOIN ort AS o ON o.id = k.ort_id + LEFT JOIN bewertungen AS b ON b.kurs_id = k.id + WHERE k.kursleiter = :personId + ORDER BY k.name"; + } else { + $sql = "SELECT k.id, k.name, k.preis, k.dauer, k.rabatt, k.kategorie, k.beschreibung, k.ort_id, + o.stadt, o.strasse, o.plz, b.note, b.kommentar + FROM kurs_user AS ku + JOIN kurs AS k ON k.id = ku.kurs_id + JOIN ort AS o ON o.id = k.ort_id + LEFT JOIN bewertungen AS b ON b.kurs_id = k.id + WHERE ku.user_id = :personId + ORDER BY k.name"; + } + try { $sth = $pdo->prepare($sql); - $sth->execute(); + $sth->execute([':personId' => $personId]); return $sth->fetchAll(\PDO::FETCH_ASSOC); } catch (PDOException $e) { new \Blog\Library\ErrorMsg("Fehler beim Lesen der Daten.", $e); @@ -175,6 +191,7 @@ class UserModel extends Database } } + public function updateCourse($course) { $pdo = $this->linkDB(); diff --git a/Views/User/showUserRegisterForm.phtml b/Views/User/showUserRegisterForm.phtml index 2d8671a..4a3ccee 100644 --- a/Views/User/showUserRegisterForm.phtml +++ b/Views/User/showUserRegisterForm.phtml @@ -6,11 +6,9 @@

Registration

-
- $label): ?> -
+
"> From 633f8eb1e2cd670aa575de590519f2a4b390aed5 Mon Sep 17 00:00:00 2001 From: Besmir Skenderi / PBBFS23A Date: Thu, 10 Jul 2025 11:40:20 +0200 Subject: [PATCH 4/4] =?UTF-8?q?=C3=84nderung=20der=20Startseite?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CSS/Element/card.css | 127 ++++++++++++------------- CSS/Element/filter_box.css | 33 +++++++ CSS/style.css | 1 + Views/Welcome/showWelcome.phtml | 164 ++++++++++++++++++++++---------- 4 files changed, 213 insertions(+), 112 deletions(-) create mode 100644 CSS/Element/filter_box.css diff --git a/CSS/Element/card.css b/CSS/Element/card.css index 3c42570..2a41193 100644 --- a/CSS/Element/card.css +++ b/CSS/Element/card.css @@ -1,104 +1,103 @@ -/* === Grundlayout === */ + body { - margin: 0; - font-family: var(--font-family-main); - background-color: var(--brand-background); - color: var(--brand-white); + margin: 0; + font-family: var(--font-family-main); + background-color: var(--brand-background); + color: var(--brand-white); } -/* === Header-Bereich === */ .welcome-header { - text-align: center; - margin: 60px 20px 40px 20px; + text-align: center; + margin: 60px 20px 40px 20px; } .welcome-heading { - font-size: 50px; - font-weight: 500; - color: var(--brand-primary); - margin-bottom: 20px; + font-size: 50px; + font-weight: 500; + color: var(--brand-primary); + margin-bottom: 20px; } .welcome-subheading { - font-size: 28px; - font-weight: bold; - color: white; - text-align: left; - max-width: 1000px; - margin: 0 auto; - padding-left: 230px; + font-size: 28px; + font-weight: bold; + color: white; + text-align: left; + max-width: 1000px; + margin: 0 auto; + padding-left: 230px; + margin-bottom: 30px; } -/* === Kurs-Grid === */ -.courses-view { - display: flex; - flex-direction: row; - flex-wrap: wrap; - gap: 30px; - justify-content: center; - padding: 30px 0 30px 0; +.course-grid { + display: flex; + flex-wrap: wrap; + gap: 30px; + margin: 0 auto; } -/* === Kurs-Karte === */ .course-card { - background: var(--brand-white); - border-radius: 12px; - overflow: hidden; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); - min-height: 300px; - display: flex; - flex-direction: column; - width: 100%; - max-width: 600px; + background: var(--brand-white); + border-radius: 12px; + overflow: hidden; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); + min-height: 300px; + display: flex; + flex-direction: column; } -/* Optional: Kurs-Bildbereich */ .course-image { - background-color: #ddd; /* Platzhalter – kannst du durch echte Bilder ersetzen */ - height: 180px; - width: 100%; + background-color: #ddd; + height: 180px; + width: 100%; } -/* === Kurs-Inhalt === */ .course-content { - background-color: var(--brand-primary); /* Orange */ - color: var(--brand-white); - padding: 20px; - font-size: 16px; - display: flex; - justify-content: space-between; - align-items: flex-start; - gap: 10px; + background-color: var(--brand-primary); + color: var(--brand-white); + padding: 20px; + font-size: 16px; + display: flex; + justify-content: space-between; + align-items: flex-start; + gap: 10px; } .course-left, .course-right { - display: flex; - flex-direction: column; - font-size: 14px; - line-height: 1.4; + display: flex; + flex-direction: column; + font-size: 14px; + line-height: 1.4; } .course-left div:first-child, .course-right div:first-child { - font-weight: bold; - font-size: 16px; + font-weight: bold; + font-size: 16px; } .course-right { - text-align: right; + text-align: right; } @media screen and (max-width: 1024px) { + .course-card { + flex: 0 0 calc(50% - 20px); + } } @media screen and (max-width: 640px) { - .welcome-heading { - font-size: 36px; - } + .course-card { + flex: 0 0 100%; + } - .welcome-subheading { - font-size: 20px; - text-align: center; - } + .welcome-heading { + font-size: 36px; + } + + .welcome-subheading { + font-size: 20px; + text-align: center; + } } diff --git a/CSS/Element/filter_box.css b/CSS/Element/filter_box.css new file mode 100644 index 0000000..007cfc0 --- /dev/null +++ b/CSS/Element/filter_box.css @@ -0,0 +1,33 @@ +.filter-box { + background: #EB8202; + color: #fff; + padding: 1em; + max-width: 300px; + border-radius: 8px; + font-family: sans-serif; + margin-bottom: 1em; +} + +.filter-box label { + display: block; + margin-top: 0.5em; +} + +.filter-box select, +.filter-box input[type="text"], +.filter-box input[type="range"] { + width: 100%; + margin-top: 0.25em; +} + +.filter-box button { + margin-top: 1em; + width: 100%; + background: white; + color: #000; + border: none; + padding: 0.5em; + font-weight: bold; + cursor: pointer; + border-radius: 4px; +} diff --git a/CSS/style.css b/CSS/style.css index 367bdb9..f630618 100644 --- a/CSS/style.css +++ b/CSS/style.css @@ -6,6 +6,7 @@ @import url(Element/form.css); @import url(Element/button.css); @import url(Element/card.css); +@import url(Element/filter_box.css); *, *:before, diff --git a/Views/Welcome/showWelcome.phtml b/Views/Welcome/showWelcome.phtml index dd820db..ca7d4dd 100644 --- a/Views/Welcome/showWelcome.phtml +++ b/Views/Welcome/showWelcome.phtml @@ -1,60 +1,128 @@
-

KURSE & ERLEBNISSE JEDER ART

-

Alle Kurse in deiner Nähe – auf einen Blick

-
- 5, - 'titel' => 'Marketing Pro', - 'adresse' => 'Bulu ulu Straße 17', - 'preis' => '59,99€', - 'ort' => '33333 Frankfurt', - 'leiter' => 'Max Mustermann' - ], - [ - 'bewertung' => 4, - 'titel' => 'Design Basics', - 'adresse' => 'Musterstraße 10', - 'preis' => '39,99€', - 'ort' => '10115 Berlin', - 'leiter' => 'Lisa Beispiel' - ], - [ - 'bewertung' => 5, - 'titel' => 'Excel Masterclass', - 'adresse' => 'Tabellenweg 5', - 'preis' => '49,99€', - 'ort' => '20457 Hamburg', - 'leiter' => 'Thomas Tabelle' - ] - ]; +

KURSE & ERLEBNISSE JEDER ART

+

Alle Kurse in deiner Nähe – auf einen Blick

- foreach ($kurse as $kurs): ?> -
-
-
-
-
-
-
Kursleiter:
-
-
-
-
-
-
+
+
+
+ + + + + + + +
- -
+ +
+ +
+ 5, + 'titel' => 'Marketing Pro', + 'adresse' => 'Bulu ulu Straße 17', + 'preis' => '59,99€', + 'ort' => '33333 Frankfurt', + 'leiter' => 'Max Mustermann' + ], + [ + 'bewertung' => 4, + 'titel' => 'Design Basics', + 'adresse' => 'Musterstraße 10', + 'preis' => '39,99€', + 'ort' => '10115 Berlin', + 'leiter' => 'Lisa Beispiel' + ], + [ + 'bewertung' => 5, + 'titel' => 'Excel Masterclass', + 'adresse' => 'Tabellenweg 5', + 'preis' => '49,99€', + 'ort' => '20457 Hamburg', + 'leiter' => 'Thomas Tabelle' + ], + [ + 'bewertung' => 5, + 'titel' => 'Excel Masterclass', + 'adresse' => 'Tabellenweg 5', + 'preis' => '49,99€', + 'ort' => '20457 Hamburg', + 'leiter' => 'Thomas Tabelle' + ], + [ + 'bewertung' => 5, + 'titel' => 'Excel Masterclass', + 'adresse' => 'Tabellenweg 5', + 'preis' => '49,99€', + 'ort' => '20457 Hamburg', + 'leiter' => 'Thomas Tabelle' + ], + ]; + + // Filter anwenden + $filteredKurse = array_filter($kurse, function($kurs) use ($rating, $location) { + if ($rating && $kurs['bewertung'] < $rating) return false; + if ($location && stripos($kurs['ort'], $location) === false) return false; + return true; + }); + + // Preise in Float umwandeln für Sortierung + if ($price) { + usort($filteredKurse, function($a, $b) use ($price) { + $priceA = floatval(str_replace(',', '.', str_replace('€', '', $a['preis']))); + $priceB = floatval(str_replace(',', '.', str_replace('€', '', $b['preis']))); + return $price === 'asc' ? $priceA <=> $priceB : $priceB <=> $priceA; + }); + } + + foreach ($filteredKurse as $kurs): ?> +
+
+
+
+
+
+
Kursleiter:
+
+
+
+
+
+
+
+
+ +
+
+
+ + + +
-
\ No newline at end of file +