ydasd
All checks were successful
Deploy / deploy (push) Successful in 53s

This commit is contained in:
2026-08-19 20:33:08 +02:00
parent 39dfc97ae6
commit 5401e89a2b
5 changed files with 37 additions and 10 deletions

View File

@@ -54,6 +54,7 @@ Papa-Kind-Treff ist eine PHP-basierte Plattform für Väter. Kernbereiche sind l
- Kategorien liegen nicht mehr unter `System`, sondern in einem eigenen Mitgliederbereichspunkt `Kategorien`; dort werden nur neue Kategorien angezeigt und per Vorschlagsfeld mit bestehenden Kategorien aus der Datenbank zusammengeführt.
- Neue Kategorien bleiben dort sichtbar, bis sie von einem Berechtigten bestätigt oder mit einer bestehenden Kategorie zusammengeführt werden.
- Im Bereich `Kategorien` gibt es zusätzlich eine Suche über bestehende Kategorien, damit sie gezielt gefunden und zusammengeführt werden können.
- Beim Zusammenführen kann explizit festgelegt werden, welche der beiden Kategorien erhalten bleibt.
- Community-Level können zusätzlich die Rechte für Kategorien sowie für die Freigabe von Orten und Veranstaltungen tragen.
## Technischer Rahmen

View File

@@ -54,6 +54,7 @@ Papa-Kind-Treff is a PHP-based platform for fathers. Core areas are local events
- Categories no longer live under `System`, but in their own member-area section `Categories`; that area only shows newly created categories and merges them into existing database categories through a suggestion field.
- New categories remain visible there until an authorized user confirms them or merges them into an existing category.
- The `Categories` area also includes a search across existing categories so they can be found and merged directly.
- During merging, it is now possible to explicitly choose which of the two categories should be kept.
- Community levels can now additionally carry the rights for category handling as well as place and event approvals.
## Technical Frame

View File

@@ -44,6 +44,7 @@ Papa-Kind-Treff ist eine PHP-basierte Plattform für Väter mit Fokus auf:
- Kategorien wurden aus `System` in den eigenen Mitgliederbereichspunkt `Kategorien` verschoben; dort werden nur neue Kategorien angezeigt und per Vorschlagsfeld mit bestehenden Kategorien aus der Datenbank zusammengeführt
- Neue Kategorien bleiben im Bereich `Kategorien` sichtbar, bis sie von einem Berechtigten bestätigt oder zusammengeführt werden
- Im Bereich `Kategorien` gibt es zusätzlich eine Suche über bestehende Kategorien, damit sie gezielt gefunden und zusammengeführt werden können
- Beim Zusammenführen von Kategorien kann jetzt explizit festgelegt werden, welche der beiden Kategorien erhalten bleibt
- Community-Level können jetzt zusätzlich die Rechte für Kategorien sowie für die Freigabe von Orten und Veranstaltungen tragen
- neue interne Grundstruktur: `listing_places`, `listings`, `listing_occurrences`, `listing_prices`, `listing_benefits`
- Seiten-Admins haben zusätzlich eine System-Sektion für globale Wartungs- und Diensteschalter

View File

@@ -999,18 +999,25 @@ if (!empty($canManageSystemSettings)) {
</div>
<form method="post" class="stack gap-8" style="margin-top:12px;">
<input type="hidden" name="action" value="category_merge">
<input type="hidden" name="source_category_slug" value="<?= htmlspecialchars((string)$categoryItem['slug'], ENT_QUOTES) ?>">
<input type="hidden" name="current_category_slug" value="<?= htmlspecialchars((string)$categoryItem['slug'], ENT_QUOTES) ?>">
<div class="stack gap-6">
<label class="label" for="targetCategorySearchInput<?= (int)($categoryItem['id'] ?? 0) ?>">Mit bestehender Kategorie zusammenführen</label>
<label class="label" for="targetCategorySearchInput<?= (int)($categoryItem['id'] ?? 0) ?>">Zweite Kategorie</label>
<input
id="targetCategorySearchInput<?= (int)($categoryItem['id'] ?? 0) ?>"
name="target_category_input"
name="other_category_input"
class="input"
list="categoryMergeSuggestions"
placeholder="Kategorie suchen"
required
>
</div>
<div class="stack gap-6">
<label class="label" for="keepCategorySearchChoice<?= (int)($categoryItem['id'] ?? 0) ?>">Behalten</label>
<select id="keepCategorySearchChoice<?= (int)($categoryItem['id'] ?? 0) ?>" name="keep_category_choice" class="select">
<option value="current"><?= htmlspecialchars((string)$categoryItem['title'], ENT_QUOTES) ?></option>
<option value="other">Ausgewählte zweite Kategorie</option>
</select>
</div>
<div class="flex gap-8" style="flex-wrap:wrap;">
<button class="btn ghost" type="submit">Zusammenführen</button>
</div>
@@ -1044,18 +1051,25 @@ if (!empty($canManageSystemSettings)) {
</div>
<form method="post" class="stack gap-8" style="margin-top:12px;">
<input type="hidden" name="action" value="category_merge">
<input type="hidden" name="source_category_slug" value="<?= htmlspecialchars((string)$categoryItem['slug'], ENT_QUOTES) ?>">
<input type="hidden" name="current_category_slug" value="<?= htmlspecialchars((string)$categoryItem['slug'], ENT_QUOTES) ?>">
<div class="stack gap-6">
<label class="label" for="targetCategoryInput<?= (int)($categoryItem['id'] ?? 0) ?>">Mit bestehender Kategorie zusammenführen</label>
<label class="label" for="targetCategoryInput<?= (int)($categoryItem['id'] ?? 0) ?>">Zweite Kategorie</label>
<input
id="targetCategoryInput<?= (int)($categoryItem['id'] ?? 0) ?>"
name="target_category_input"
name="other_category_input"
class="input"
list="categoryMergeSuggestions"
placeholder="Kategorie suchen"
required
>
</div>
<div class="stack gap-6">
<label class="label" for="keepCategoryChoice<?= (int)($categoryItem['id'] ?? 0) ?>">Behalten</label>
<select id="keepCategoryChoice<?= (int)($categoryItem['id'] ?? 0) ?>" name="keep_category_choice" class="select">
<option value="current"><?= htmlspecialchars((string)$categoryItem['title'], ENT_QUOTES) ?></option>
<option value="other">Ausgewählte zweite Kategorie</option>
</select>
</div>
<div class="flex gap-8" style="flex-wrap:wrap;">
<button class="btn ghost" type="submit">Zusammenführen</button>
</div>

View File

@@ -333,12 +333,22 @@ final class AccountPages
if (!$canManageCategories || !$listingCatalog) {
throw new \RuntimeException('Keine Berechtigung für die Kategorien-Verwaltung.');
}
$targetCategorySlug = $listingCatalog->resolveExistingCategorySlug((string)($_POST['target_category_input'] ?? ''));
if ($targetCategorySlug === null) {
throw new \RuntimeException('Bitte wähle eine vorhandene Zielkategorie aus den Vorschlägen.');
$currentCategorySlug = trim((string)($_POST['current_category_slug'] ?? ''));
$otherCategorySlug = $listingCatalog->resolveExistingCategorySlug((string)($_POST['other_category_input'] ?? ''));
if ($currentCategorySlug === '') {
throw new \RuntimeException('Bitte wähle eine Ausgangskategorie aus.');
}
if ($otherCategorySlug === null) {
throw new \RuntimeException('Bitte wähle eine vorhandene zweite Kategorie aus den Vorschlägen.');
}
if ($currentCategorySlug === $otherCategorySlug) {
throw new \RuntimeException('Bitte wähle zwei unterschiedliche Kategorien aus.');
}
$keepChoice = (string)($_POST['keep_category_choice'] ?? 'current');
$targetCategorySlug = $keepChoice === 'other' ? $otherCategorySlug : $currentCategorySlug;
$sourceCategorySlug = $keepChoice === 'other' ? $currentCategorySlug : $otherCategorySlug;
$listingCatalog->mergeCategories(
(string)($_POST['source_category_slug'] ?? ''),
$sourceCategorySlug,
$targetCategorySlug
);
$info = 'Kategorie zusammengeführt.';