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.
|
- 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.
|
- 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.
|
- 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.
|
- Community-Level können zusätzlich die Rechte für Kategorien sowie für die Freigabe von Orten und Veranstaltungen tragen.
|
||||||
|
|
||||||
## Technischer Rahmen
|
## 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.
|
- 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.
|
- 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.
|
- 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.
|
- Community levels can now additionally carry the rights for category handling as well as place and event approvals.
|
||||||
|
|
||||||
## Technical Frame
|
## 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
|
- 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
|
- 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
|
- 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
|
- 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`
|
- 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
|
- Seiten-Admins haben zusätzlich eine System-Sektion für globale Wartungs- und Diensteschalter
|
||||||
|
|||||||
@@ -999,18 +999,25 @@ if (!empty($canManageSystemSettings)) {
|
|||||||
</div>
|
</div>
|
||||||
<form method="post" class="stack gap-8" style="margin-top:12px;">
|
<form method="post" class="stack gap-8" style="margin-top:12px;">
|
||||||
<input type="hidden" name="action" value="category_merge">
|
<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">
|
<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
|
<input
|
||||||
id="targetCategorySearchInput<?= (int)($categoryItem['id'] ?? 0) ?>"
|
id="targetCategorySearchInput<?= (int)($categoryItem['id'] ?? 0) ?>"
|
||||||
name="target_category_input"
|
name="other_category_input"
|
||||||
class="input"
|
class="input"
|
||||||
list="categoryMergeSuggestions"
|
list="categoryMergeSuggestions"
|
||||||
placeholder="Kategorie suchen"
|
placeholder="Kategorie suchen"
|
||||||
required
|
required
|
||||||
>
|
>
|
||||||
</div>
|
</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;">
|
<div class="flex gap-8" style="flex-wrap:wrap;">
|
||||||
<button class="btn ghost" type="submit">Zusammenführen</button>
|
<button class="btn ghost" type="submit">Zusammenführen</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -1044,18 +1051,25 @@ if (!empty($canManageSystemSettings)) {
|
|||||||
</div>
|
</div>
|
||||||
<form method="post" class="stack gap-8" style="margin-top:12px;">
|
<form method="post" class="stack gap-8" style="margin-top:12px;">
|
||||||
<input type="hidden" name="action" value="category_merge">
|
<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">
|
<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
|
<input
|
||||||
id="targetCategoryInput<?= (int)($categoryItem['id'] ?? 0) ?>"
|
id="targetCategoryInput<?= (int)($categoryItem['id'] ?? 0) ?>"
|
||||||
name="target_category_input"
|
name="other_category_input"
|
||||||
class="input"
|
class="input"
|
||||||
list="categoryMergeSuggestions"
|
list="categoryMergeSuggestions"
|
||||||
placeholder="Kategorie suchen"
|
placeholder="Kategorie suchen"
|
||||||
required
|
required
|
||||||
>
|
>
|
||||||
</div>
|
</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;">
|
<div class="flex gap-8" style="flex-wrap:wrap;">
|
||||||
<button class="btn ghost" type="submit">Zusammenführen</button>
|
<button class="btn ghost" type="submit">Zusammenführen</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -333,12 +333,22 @@ final class AccountPages
|
|||||||
if (!$canManageCategories || !$listingCatalog) {
|
if (!$canManageCategories || !$listingCatalog) {
|
||||||
throw new \RuntimeException('Keine Berechtigung für die Kategorien-Verwaltung.');
|
throw new \RuntimeException('Keine Berechtigung für die Kategorien-Verwaltung.');
|
||||||
}
|
}
|
||||||
$targetCategorySlug = $listingCatalog->resolveExistingCategorySlug((string)($_POST['target_category_input'] ?? ''));
|
$currentCategorySlug = trim((string)($_POST['current_category_slug'] ?? ''));
|
||||||
if ($targetCategorySlug === null) {
|
$otherCategorySlug = $listingCatalog->resolveExistingCategorySlug((string)($_POST['other_category_input'] ?? ''));
|
||||||
throw new \RuntimeException('Bitte wähle eine vorhandene Zielkategorie aus den Vorschlägen.');
|
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(
|
$listingCatalog->mergeCategories(
|
||||||
(string)($_POST['source_category_slug'] ?? ''),
|
$sourceCategorySlug,
|
||||||
$targetCategorySlug
|
$targetCategorySlug
|
||||||
);
|
);
|
||||||
$info = 'Kategorie zusammengeführt.';
|
$info = 'Kategorie zusammengeführt.';
|
||||||
|
|||||||
Reference in New Issue
Block a user