This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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.';
|
||||
|
||||
Reference in New Issue
Block a user