Favoriten überarbeitet
This commit is contained in:
+3
-5
@@ -1,8 +1,6 @@
|
|||||||
<<<<<<< HEAD
|
.codex-temp/
|
||||||
php-server.log
|
php-server.log
|
||||||
php-server.err.log
|
php-server.err.log
|
||||||
php-server-error.log
|
php-server-error.log
|
||||||
=======
|
__pycache__/
|
||||||
.codex-temp/
|
*.pyc
|
||||||
php-server-error.log
|
|
||||||
>>>>>>> fc3264cc2fa76249c40e422de2381eb7c6920c28
|
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ Hier liegen die internen Anleitungen und technischen Hilfen für das Projekt.
|
|||||||
Lokale Startanleitung für den PHP-Webserver auf den bekannten Arbeitsplätzen
|
Lokale Startanleitung für den PHP-Webserver auf den bekannten Arbeitsplätzen
|
||||||
- [`docs/README_RECHTESYSTEM.md`](README_RECHTESYSTEM.md)
|
- [`docs/README_RECHTESYSTEM.md`](README_RECHTESYSTEM.md)
|
||||||
Beschreibung des aktuellen Rollen- und Seitenrechtesystems
|
Beschreibung des aktuellen Rollen- und Seitenrechtesystems
|
||||||
|
- [`docs/README_DATENBANKABFRAGEN.md`](README_DATENBANKABFRAGEN.md)
|
||||||
|
Kurzanleitung fuer lokale Datenbankabfragen mit der vorhandenen Projektkonfiguration
|
||||||
|
|
||||||
## Hinweis
|
## Hinweis
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,83 @@
|
|||||||
|
# Datenbankabfragen
|
||||||
|
|
||||||
|
Diese Notiz beschreibt, wie in diesem Projekt lokale Datenbankabfragen ausgefuehrt werden koennen.
|
||||||
|
|
||||||
|
## Zugangsdaten
|
||||||
|
|
||||||
|
Die Verbindungsdaten liegen in:
|
||||||
|
|
||||||
|
- `config/database.php`
|
||||||
|
|
||||||
|
Dort stehen `host`, `dbname`, `user`, `pass` und `charset`.
|
||||||
|
|
||||||
|
## Empfohlener Weg
|
||||||
|
|
||||||
|
Am einfachsten ist eine kurze PHP-Datei oder ein kurzes PHP-Skript, das die vorhandene Projektkonfiguration verwendet.
|
||||||
|
|
||||||
|
Beispiel:
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
$config = require __DIR__ . '/../config/database.php';
|
||||||
|
|
||||||
|
$dsn = sprintf(
|
||||||
|
'mysql:host=%s;dbname=%s;charset=%s',
|
||||||
|
$config['host'],
|
||||||
|
$config['dbname'],
|
||||||
|
$config['charset'] ?? 'utf8mb4'
|
||||||
|
);
|
||||||
|
|
||||||
|
$pdo = new PDO(
|
||||||
|
$dsn,
|
||||||
|
$config['user'],
|
||||||
|
$config['pass'],
|
||||||
|
[
|
||||||
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
||||||
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
$stmt = $pdo->query("SELECT id, mp_number, designation_text FROM minorplanets_mpc WHERE mp_number = 1 LIMIT 1");
|
||||||
|
$row = $stmt->fetch();
|
||||||
|
|
||||||
|
echo json_encode($row, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Ausfuehrung
|
||||||
|
|
||||||
|
Wenn `php` nicht im Systempfad liegt, kann die lokale `php.exe` direkt verwendet werden.
|
||||||
|
|
||||||
|
Beispiel von diesem Rechner:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
C:\laragon\bin\php\php-8.4.5-nts-Win32-vs17-x64\php.exe .codex-temp\check_defaults.php
|
||||||
|
```
|
||||||
|
|
||||||
|
## Praktische Beispielabfragen
|
||||||
|
|
||||||
|
`Ceres` pruefen:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SELECT id, mp_number, designation_text, desig_packed
|
||||||
|
FROM minorplanets_mpc
|
||||||
|
WHERE mp_number = 1
|
||||||
|
LIMIT 1;
|
||||||
|
```
|
||||||
|
|
||||||
|
`Halley` pruefen:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SELECT id, designation_and_name, orbit_type
|
||||||
|
FROM comets_mpc
|
||||||
|
WHERE designation_and_name LIKE '%Halley%'
|
||||||
|
ORDER BY designation_and_name ASC, id ASC
|
||||||
|
LIMIT 10;
|
||||||
|
```
|
||||||
|
|
||||||
|
## Hinweise
|
||||||
|
|
||||||
|
- Temporaere Pruefskripte am besten in `.codex-temp/` anlegen und danach wieder loeschen.
|
||||||
|
- Fuer Projektcode immer die vorhandene `config/database.php` verwenden und keine Zugangsdaten hart in Dateien eintragen.
|
||||||
|
- Wenn nur geprueft werden soll, reichen `SELECT`-Abfragen ohne schreibende Operationen.
|
||||||
+205
-36
@@ -358,18 +358,26 @@ function renderTrackedMinorplanetsSection(array $trackedMinorplanets, bool $oob
|
|||||||
<td class="<?= (int) $minorplanet['is_favorite'] === 1 ? 'favorite-text' : '' ?>"><?= h($minorplanet['mp_number'] !== null ? (string) $minorplanet['mp_number'] : '-') ?></td>
|
<td class="<?= (int) $minorplanet['is_favorite'] === 1 ? 'favorite-text' : '' ?>"><?= h($minorplanet['mp_number'] !== null ? (string) $minorplanet['mp_number'] : '-') ?></td>
|
||||||
<td class="<?= (int) $minorplanet['is_favorite'] === 1 ? 'favorite-text' : '' ?>"><?= (int) $minorplanet['is_favorite'] === 1 ? '*' : '-' ?></td>
|
<td class="<?= (int) $minorplanet['is_favorite'] === 1 ? 'favorite-text' : '' ?>"><?= (int) $minorplanet['is_favorite'] === 1 ? '*' : '-' ?></td>
|
||||||
<td class="action-cell">
|
<td class="action-cell">
|
||||||
<form method="post" action="" class="favorites-loading-form favorites-loading-form-htmx" data-loading-message="Kleinplaneten-Favorit wird aktualisiert..." hx-post="my_favorites.php" hx-target="#favorites-messages" hx-swap="outerHTML">
|
<?php if (count($trackedMinorplanets) <= 1 && (int) $minorplanet['is_favorite'] === 1): ?>
|
||||||
<input type="hidden" name="action" value="toggle_minorplanet_favorite">
|
<span class="hint">Favorit bleibt gesetzt</span>
|
||||||
<input type="hidden" name="minorplanet_id" value="<?= (int) $minorplanet['id'] ?>">
|
<?php else: ?>
|
||||||
<button type="submit" class="btn btn-sm btn-secondary<?= (int) $minorplanet['is_favorite'] === 1 ? ' favorite-active' : '' ?>">
|
<form method="post" action="" class="favorites-loading-form favorites-loading-form-htmx" data-loading-message="Kleinplaneten-Favorit wird aktualisiert..." hx-post="my_favorites.php" hx-target="#favorites-messages" hx-swap="outerHTML">
|
||||||
<?= (int) $minorplanet['is_favorite'] === 1 ? 'Favorit entfernen' : 'Als Favorit' ?>
|
<input type="hidden" name="action" value="toggle_minorplanet_favorite">
|
||||||
</button>
|
<input type="hidden" name="minorplanet_id" value="<?= (int) $minorplanet['id'] ?>">
|
||||||
</form>
|
<button type="submit" class="btn btn-sm btn-secondary<?= (int) $minorplanet['is_favorite'] === 1 ? ' favorite-active' : '' ?>">
|
||||||
<form method="post" action="" class="favorites-loading-form favorites-loading-form-htmx" data-loading-message="Kleinplanet wird entfernt..." hx-post="my_favorites.php" hx-target="#favorites-messages" hx-swap="outerHTML" onsubmit="return confirm('Kleinplanet wirklich entfernen?');">
|
<?= (int) $minorplanet['is_favorite'] === 1 ? 'Favorit entfernen' : 'Als Favorit' ?>
|
||||||
<input type="hidden" name="action" value="remove_minorplanet">
|
</button>
|
||||||
<input type="hidden" name="minorplanet_id" value="<?= (int) $minorplanet['id'] ?>">
|
</form>
|
||||||
<button type="submit" class="btn btn-sm btn-danger">Entfernen</button>
|
<?php endif; ?>
|
||||||
</form>
|
<?php if (count($trackedMinorplanets) > 1): ?>
|
||||||
|
<form method="post" action="" class="favorites-loading-form favorites-loading-form-htmx" data-loading-message="Kleinplanet wird entfernt..." hx-post="my_favorites.php" hx-target="#favorites-messages" hx-swap="outerHTML" onsubmit="return confirm('Kleinplanet wirklich entfernen?');">
|
||||||
|
<input type="hidden" name="action" value="remove_minorplanet">
|
||||||
|
<input type="hidden" name="minorplanet_id" value="<?= (int) $minorplanet['id'] ?>">
|
||||||
|
<button type="submit" class="btn btn-sm btn-danger">Entfernen</button>
|
||||||
|
</form>
|
||||||
|
<?php else: ?>
|
||||||
|
<span class="hint">Letzter Kleinplanet</span>
|
||||||
|
<?php endif; ?>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
@@ -470,18 +478,26 @@ function renderTrackedCometsSection(array $trackedComets, bool $oob = false): st
|
|||||||
<td class="<?= (int) $comet['is_favorite'] === 1 ? 'favorite-text' : '' ?>"><?= h((string) $comet['orbit_type']) ?></td>
|
<td class="<?= (int) $comet['is_favorite'] === 1 ? 'favorite-text' : '' ?>"><?= h((string) $comet['orbit_type']) ?></td>
|
||||||
<td class="<?= (int) $comet['is_favorite'] === 1 ? 'favorite-text' : '' ?>"><?= (int) $comet['is_favorite'] === 1 ? '*' : '-' ?></td>
|
<td class="<?= (int) $comet['is_favorite'] === 1 ? 'favorite-text' : '' ?>"><?= (int) $comet['is_favorite'] === 1 ? '*' : '-' ?></td>
|
||||||
<td class="action-cell">
|
<td class="action-cell">
|
||||||
<form method="post" action="" class="favorites-loading-form favorites-loading-form-htmx" data-loading-message="Kometen-Favorit wird aktualisiert..." hx-post="my_favorites.php" hx-target="#favorites-messages" hx-swap="outerHTML">
|
<?php if (count($trackedComets) <= 1 && (int) $comet['is_favorite'] === 1): ?>
|
||||||
<input type="hidden" name="action" value="toggle_comet_favorite">
|
<span class="hint">Favorit bleibt gesetzt</span>
|
||||||
<input type="hidden" name="comet_id" value="<?= (int) $comet['id'] ?>">
|
<?php else: ?>
|
||||||
<button type="submit" class="btn btn-sm btn-secondary<?= (int) $comet['is_favorite'] === 1 ? ' favorite-active' : '' ?>">
|
<form method="post" action="" class="favorites-loading-form favorites-loading-form-htmx" data-loading-message="Kometen-Favorit wird aktualisiert..." hx-post="my_favorites.php" hx-target="#favorites-messages" hx-swap="outerHTML">
|
||||||
<?= (int) $comet['is_favorite'] === 1 ? 'Favorit entfernen' : 'Als Favorit' ?>
|
<input type="hidden" name="action" value="toggle_comet_favorite">
|
||||||
</button>
|
<input type="hidden" name="comet_id" value="<?= (int) $comet['id'] ?>">
|
||||||
</form>
|
<button type="submit" class="btn btn-sm btn-secondary<?= (int) $comet['is_favorite'] === 1 ? ' favorite-active' : '' ?>">
|
||||||
<form method="post" action="" class="favorites-loading-form favorites-loading-form-htmx" data-loading-message="Komet wird entfernt..." hx-post="my_favorites.php" hx-target="#favorites-messages" hx-swap="outerHTML" onsubmit="return confirm('Komet wirklich entfernen?');">
|
<?= (int) $comet['is_favorite'] === 1 ? 'Favorit entfernen' : 'Als Favorit' ?>
|
||||||
<input type="hidden" name="action" value="remove_comet">
|
</button>
|
||||||
<input type="hidden" name="comet_id" value="<?= (int) $comet['id'] ?>">
|
</form>
|
||||||
<button type="submit" class="btn btn-sm btn-danger">Entfernen</button>
|
<?php endif; ?>
|
||||||
</form>
|
<?php if (count($trackedComets) > 1): ?>
|
||||||
|
<form method="post" action="" class="favorites-loading-form favorites-loading-form-htmx" data-loading-message="Komet wird entfernt..." hx-post="my_favorites.php" hx-target="#favorites-messages" hx-swap="outerHTML" onsubmit="return confirm('Komet wirklich entfernen?');">
|
||||||
|
<input type="hidden" name="action" value="remove_comet">
|
||||||
|
<input type="hidden" name="comet_id" value="<?= (int) $comet['id'] ?>">
|
||||||
|
<button type="submit" class="btn btn-sm btn-danger">Entfernen</button>
|
||||||
|
</form>
|
||||||
|
<?php else: ?>
|
||||||
|
<span class="hint">Letzter Komet</span>
|
||||||
|
<?php endif; ?>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
@@ -566,6 +582,35 @@ function setExclusiveFavorite(PDO $pdo, string $tableName, string $idColumn, int
|
|||||||
':entity_id' => $entityId,
|
':entity_id' => $entityId,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
if ($newValue === 0) {
|
||||||
|
$stmtNextFavorite = $pdo->prepare("
|
||||||
|
SELECT `{$idColumn}`
|
||||||
|
FROM `{$tableName}`
|
||||||
|
WHERE `user_id` = :user_id
|
||||||
|
AND `{$idColumn}` <> :entity_id
|
||||||
|
ORDER BY `created_at` ASC, `{$idColumn}` ASC
|
||||||
|
LIMIT 1
|
||||||
|
");
|
||||||
|
$stmtNextFavorite->execute([
|
||||||
|
':user_id' => $userId,
|
||||||
|
':entity_id' => $entityId,
|
||||||
|
]);
|
||||||
|
$nextEntityId = $stmtNextFavorite->fetchColumn();
|
||||||
|
|
||||||
|
if ($nextEntityId !== false) {
|
||||||
|
$stmtPromote = $pdo->prepare("
|
||||||
|
UPDATE `{$tableName}`
|
||||||
|
SET `is_favorite` = 1
|
||||||
|
WHERE `user_id` = :user_id
|
||||||
|
AND `{$idColumn}` = :entity_id
|
||||||
|
");
|
||||||
|
$stmtPromote->execute([
|
||||||
|
':user_id' => $userId,
|
||||||
|
':entity_id' => (int) $nextEntityId,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$pdo->commit();
|
$pdo->commit();
|
||||||
return true;
|
return true;
|
||||||
} catch (Throwable $e) {
|
} catch (Throwable $e) {
|
||||||
@@ -590,6 +635,51 @@ function countUserRows(PDO $pdo, string $tableName, int $userId): int
|
|||||||
return (int) $stmtCount->fetchColumn();
|
return (int) $stmtCount->fetchColumn();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function ensureFavoriteIfNeeded(PDO $pdo, string $tableName, string $idColumn, int $userId): void
|
||||||
|
{
|
||||||
|
$stmtFavoriteCount = $pdo->prepare("
|
||||||
|
SELECT COUNT(*)
|
||||||
|
FROM `{$tableName}`
|
||||||
|
WHERE `user_id` = :user_id
|
||||||
|
AND `is_favorite` = 1
|
||||||
|
");
|
||||||
|
$stmtFavoriteCount->execute([
|
||||||
|
':user_id' => $userId,
|
||||||
|
]);
|
||||||
|
$favoriteCount = (int) $stmtFavoriteCount->fetchColumn();
|
||||||
|
|
||||||
|
if ($favoriteCount > 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$stmtNextFavorite = $pdo->prepare("
|
||||||
|
SELECT `{$idColumn}`
|
||||||
|
FROM `{$tableName}`
|
||||||
|
WHERE `user_id` = :user_id
|
||||||
|
ORDER BY `created_at` ASC, `{$idColumn}` ASC
|
||||||
|
LIMIT 1
|
||||||
|
");
|
||||||
|
$stmtNextFavorite->execute([
|
||||||
|
':user_id' => $userId,
|
||||||
|
]);
|
||||||
|
$nextEntityId = $stmtNextFavorite->fetchColumn();
|
||||||
|
|
||||||
|
if ($nextEntityId === false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$stmtPromote = $pdo->prepare("
|
||||||
|
UPDATE `{$tableName}`
|
||||||
|
SET `is_favorite` = 1
|
||||||
|
WHERE `user_id` = :user_id
|
||||||
|
AND `{$idColumn}` = :entity_id
|
||||||
|
");
|
||||||
|
$stmtPromote->execute([
|
||||||
|
':user_id' => $userId,
|
||||||
|
':entity_id' => (int) $nextEntityId,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
function validateLocationForm(array $input, array &$errors): array
|
function validateLocationForm(array $input, array &$errors): array
|
||||||
{
|
{
|
||||||
$name = trim((string) ($input['name'] ?? ''));
|
$name = trim((string) ($input['name'] ?? ''));
|
||||||
@@ -879,6 +969,13 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
$errors[] = 'Ungültiger Kleinplanet.';
|
$errors[] = 'Ungültiger Kleinplanet.';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (empty($errors)) {
|
||||||
|
$minorplanetCount = countUserRows($pdo, 'app_user_minorplanets', $userId);
|
||||||
|
if ($minorplanetCount <= 1) {
|
||||||
|
$errors[] = 'Der letzte Kleinplanet kann nicht gelöscht werden.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (empty($errors)) {
|
if (empty($errors)) {
|
||||||
$stmtDelete = $pdo->prepare("
|
$stmtDelete = $pdo->prepare("
|
||||||
DELETE FROM `app_user_minorplanets`
|
DELETE FROM `app_user_minorplanets`
|
||||||
@@ -901,6 +998,32 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
$errors[] = 'Ungültiger Kleinplanet.';
|
$errors[] = 'Ungültiger Kleinplanet.';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (empty($errors)) {
|
||||||
|
$stmtCurrentMinorplanet = $pdo->prepare("
|
||||||
|
SELECT `is_favorite`
|
||||||
|
FROM `app_user_minorplanets`
|
||||||
|
WHERE `user_id` = :user_id
|
||||||
|
AND `minorplanet_id` = :minorplanet_id
|
||||||
|
LIMIT 1
|
||||||
|
");
|
||||||
|
$stmtCurrentMinorplanet->execute([
|
||||||
|
':user_id' => $userId,
|
||||||
|
':minorplanet_id' => $minorplanetId,
|
||||||
|
]);
|
||||||
|
$currentMinorplanetFavorite = $stmtCurrentMinorplanet->fetchColumn();
|
||||||
|
|
||||||
|
if ($currentMinorplanetFavorite === false) {
|
||||||
|
$errors[] = 'Der Kleinplanet ist nicht in deiner Liste vorhanden.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($errors)) {
|
||||||
|
$minorplanetCount = countUserRows($pdo, 'app_user_minorplanets', $userId);
|
||||||
|
if ($minorplanetCount <= 1 && (int) $currentMinorplanetFavorite === 1) {
|
||||||
|
$errors[] = 'Beim letzten Kleinplaneten kann der Favorit nicht entfernt werden.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (empty($errors)) {
|
if (empty($errors)) {
|
||||||
if (!setExclusiveFavorite($pdo, 'app_user_minorplanets', 'minorplanet_id', $userId, $minorplanetId)) {
|
if (!setExclusiveFavorite($pdo, 'app_user_minorplanets', 'minorplanet_id', $userId, $minorplanetId)) {
|
||||||
$errors[] = 'Der Kleinplanet ist nicht in deiner Liste vorhanden.';
|
$errors[] = 'Der Kleinplanet ist nicht in deiner Liste vorhanden.';
|
||||||
@@ -965,6 +1088,13 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
$errors[] = 'Ungueltiger Komet.';
|
$errors[] = 'Ungueltiger Komet.';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (empty($errors)) {
|
||||||
|
$cometCount = countUserRows($pdo, 'app_user_comets', $userId);
|
||||||
|
if ($cometCount <= 1) {
|
||||||
|
$errors[] = 'Der letzte Komet kann nicht gelöscht werden.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (empty($errors)) {
|
if (empty($errors)) {
|
||||||
$stmtDelete = $pdo->prepare("
|
$stmtDelete = $pdo->prepare("
|
||||||
DELETE FROM `app_user_comets`
|
DELETE FROM `app_user_comets`
|
||||||
@@ -987,6 +1117,32 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
$errors[] = 'Ungueltiger Komet.';
|
$errors[] = 'Ungueltiger Komet.';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (empty($errors)) {
|
||||||
|
$stmtCurrentComet = $pdo->prepare("
|
||||||
|
SELECT `is_favorite`
|
||||||
|
FROM `app_user_comets`
|
||||||
|
WHERE `user_id` = :user_id
|
||||||
|
AND `comet_id` = :comet_id
|
||||||
|
LIMIT 1
|
||||||
|
");
|
||||||
|
$stmtCurrentComet->execute([
|
||||||
|
':user_id' => $userId,
|
||||||
|
':comet_id' => $cometId,
|
||||||
|
]);
|
||||||
|
$currentCometFavorite = $stmtCurrentComet->fetchColumn();
|
||||||
|
|
||||||
|
if ($currentCometFavorite === false) {
|
||||||
|
$errors[] = 'Der Komet ist nicht in deiner Liste vorhanden.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($errors)) {
|
||||||
|
$cometCount = countUserRows($pdo, 'app_user_comets', $userId);
|
||||||
|
if ($cometCount <= 1 && (int) $currentCometFavorite === 1) {
|
||||||
|
$errors[] = 'Beim letzten Kometen kann der Favorit nicht entfernt werden.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (empty($errors)) {
|
if (empty($errors)) {
|
||||||
if (!setExclusiveFavorite($pdo, 'app_user_comets', 'comet_id', $userId, $cometId)) {
|
if (!setExclusiveFavorite($pdo, 'app_user_comets', 'comet_id', $userId, $cometId)) {
|
||||||
$errors[] = 'Der Komet ist nicht in deiner Liste vorhanden.';
|
$errors[] = 'Der Komet ist nicht in deiner Liste vorhanden.';
|
||||||
@@ -1329,6 +1485,11 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||||
|
ensureFavoriteIfNeeded($pdo, 'app_user_minorplanets', 'minorplanet_id', $userId);
|
||||||
|
ensureFavoriteIfNeeded($pdo, 'app_user_comets', 'comet_id', $userId);
|
||||||
|
}
|
||||||
|
|
||||||
$stmtLocations = $pdo->prepare("
|
$stmtLocations = $pdo->prepare("
|
||||||
SELECT
|
SELECT
|
||||||
`id`,
|
`id`,
|
||||||
@@ -1987,18 +2148,26 @@ $loggedIn = true;
|
|||||||
<td class="<?= (int) $minorplanet['is_favorite'] === 1 ? 'favorite-text' : '' ?>"><?= h($minorplanet['mp_number'] !== null ? (string) $minorplanet['mp_number'] : '-') ?></td>
|
<td class="<?= (int) $minorplanet['is_favorite'] === 1 ? 'favorite-text' : '' ?>"><?= h($minorplanet['mp_number'] !== null ? (string) $minorplanet['mp_number'] : '-') ?></td>
|
||||||
<td class="<?= (int) $minorplanet['is_favorite'] === 1 ? 'favorite-text' : '' ?>"><?= (int) $minorplanet['is_favorite'] === 1 ? '*' : '-' ?></td>
|
<td class="<?= (int) $minorplanet['is_favorite'] === 1 ? 'favorite-text' : '' ?>"><?= (int) $minorplanet['is_favorite'] === 1 ? '*' : '-' ?></td>
|
||||||
<td class="action-cell">
|
<td class="action-cell">
|
||||||
<form method="post" action="" class="favorites-loading-form favorites-loading-form-htmx" data-loading-message="Kleinplaneten-Favorit wird aktualisiert..." hx-post="my_favorites.php" hx-target="#favorites-messages" hx-swap="outerHTML">
|
<?php if (count($trackedMinorplanets) <= 1 && (int) $minorplanet['is_favorite'] === 1): ?>
|
||||||
<input type="hidden" name="action" value="toggle_minorplanet_favorite">
|
<span class="hint">Favorit bleibt gesetzt</span>
|
||||||
<input type="hidden" name="minorplanet_id" value="<?= (int) $minorplanet['id'] ?>">
|
<?php else: ?>
|
||||||
<button type="submit" class="btn btn-sm btn-secondary<?= (int) $minorplanet['is_favorite'] === 1 ? ' favorite-active' : '' ?>">
|
<form method="post" action="" class="favorites-loading-form favorites-loading-form-htmx" data-loading-message="Kleinplaneten-Favorit wird aktualisiert..." hx-post="my_favorites.php" hx-target="#favorites-messages" hx-swap="outerHTML">
|
||||||
<?= (int) $minorplanet['is_favorite'] === 1 ? 'Favorit entfernen' : 'Als Favorit' ?>
|
<input type="hidden" name="action" value="toggle_minorplanet_favorite">
|
||||||
</button>
|
<input type="hidden" name="minorplanet_id" value="<?= (int) $minorplanet['id'] ?>">
|
||||||
</form>
|
<button type="submit" class="btn btn-sm btn-secondary<?= (int) $minorplanet['is_favorite'] === 1 ? ' favorite-active' : '' ?>">
|
||||||
<form method="post" action="" class="favorites-loading-form favorites-loading-form-htmx" data-loading-message="Kleinplanet wird entfernt..." hx-post="my_favorites.php" hx-target="#favorites-messages" hx-swap="outerHTML" onsubmit="return confirm('Kleinplanet wirklich entfernen?');">
|
<?= (int) $minorplanet['is_favorite'] === 1 ? 'Favorit entfernen' : 'Als Favorit' ?>
|
||||||
<input type="hidden" name="action" value="remove_minorplanet">
|
</button>
|
||||||
<input type="hidden" name="minorplanet_id" value="<?= (int) $minorplanet['id'] ?>">
|
</form>
|
||||||
<button type="submit" class="btn btn-sm btn-danger">Entfernen</button>
|
<?php endif; ?>
|
||||||
</form>
|
<?php if (count($trackedMinorplanets) > 1): ?>
|
||||||
|
<form method="post" action="" class="favorites-loading-form favorites-loading-form-htmx" data-loading-message="Kleinplanet wird entfernt..." hx-post="my_favorites.php" hx-target="#favorites-messages" hx-swap="outerHTML" onsubmit="return confirm('Kleinplanet wirklich entfernen?');">
|
||||||
|
<input type="hidden" name="action" value="remove_minorplanet">
|
||||||
|
<input type="hidden" name="minorplanet_id" value="<?= (int) $minorplanet['id'] ?>">
|
||||||
|
<button type="submit" class="btn btn-sm btn-danger">Entfernen</button>
|
||||||
|
</form>
|
||||||
|
<?php else: ?>
|
||||||
|
<span class="hint">Letzter Kleinplanet</span>
|
||||||
|
<?php endif; ?>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ const DEFAULT_LOCATION_LONGITUDE = 11.189;
|
|||||||
const DEFAULT_LOCATION_ELEVATION = 640.0;
|
const DEFAULT_LOCATION_ELEVATION = 640.0;
|
||||||
const DEFAULT_LOCATION_TIMEZONE = 'Europe/Berlin';
|
const DEFAULT_LOCATION_TIMEZONE = 'Europe/Berlin';
|
||||||
const DEFAULT_SATELLITE_ID = 61;
|
const DEFAULT_SATELLITE_ID = 61;
|
||||||
|
const DEFAULT_MINORPLANET_NUMBER = 1;
|
||||||
|
const DEFAULT_COMET_SEARCH = 'Halley';
|
||||||
|
|
||||||
function sendRegistrationNotification(string $username, string $email, ?string $displayName): void
|
function sendRegistrationNotification(string $username, string $email, ?string $displayName): void
|
||||||
{
|
{
|
||||||
@@ -77,6 +79,39 @@ function textLength(string $value): int
|
|||||||
return strlen($value);
|
return strlen($value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function findDefaultMinorplanetId(PDO $pdo): ?int
|
||||||
|
{
|
||||||
|
$stmt = $pdo->prepare("
|
||||||
|
SELECT `id`
|
||||||
|
FROM `minorplanets_mpc`
|
||||||
|
WHERE `mp_number` = :mp_number
|
||||||
|
LIMIT 1
|
||||||
|
");
|
||||||
|
$stmt->execute([
|
||||||
|
':mp_number' => DEFAULT_MINORPLANET_NUMBER,
|
||||||
|
]);
|
||||||
|
$id = $stmt->fetchColumn();
|
||||||
|
|
||||||
|
return $id !== false ? (int) $id : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function findDefaultCometId(PDO $pdo): ?int
|
||||||
|
{
|
||||||
|
$stmt = $pdo->prepare("
|
||||||
|
SELECT `id`
|
||||||
|
FROM `comets_mpc`
|
||||||
|
WHERE `designation_and_name` LIKE :search
|
||||||
|
ORDER BY `designation_and_name` ASC, `id` ASC
|
||||||
|
LIMIT 1
|
||||||
|
");
|
||||||
|
$stmt->execute([
|
||||||
|
':search' => '%' . DEFAULT_COMET_SEARCH . '%',
|
||||||
|
]);
|
||||||
|
$id = $stmt->fetchColumn();
|
||||||
|
|
||||||
|
return $id !== false ? (int) $id : null;
|
||||||
|
}
|
||||||
|
|
||||||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||||
$username = trim($_POST['username'] ?? '');
|
$username = trim($_POST['username'] ?? '');
|
||||||
$email = trim($_POST['email'] ?? '');
|
$email = trim($_POST['email'] ?? '');
|
||||||
@@ -131,6 +166,19 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
|
|
||||||
if (empty($errors)) {
|
if (empty($errors)) {
|
||||||
$passwordHash = password_hash($password, PASSWORD_DEFAULT);
|
$passwordHash = password_hash($password, PASSWORD_DEFAULT);
|
||||||
|
$defaultMinorplanetId = findDefaultMinorplanetId($pdo);
|
||||||
|
$defaultCometId = findDefaultCometId($pdo);
|
||||||
|
|
||||||
|
if ($defaultMinorplanetId === null) {
|
||||||
|
$errors[] = 'Der Standard-Kleinplanet Ceres wurde in der Datenbank nicht gefunden.';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($defaultCometId === null) {
|
||||||
|
$errors[] = 'Der Standard-Komet Halley wurde in der Datenbank nicht gefunden.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($errors)) {
|
||||||
$pdo->beginTransaction();
|
$pdo->beginTransaction();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -215,6 +263,42 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
':satellite_id' => DEFAULT_SATELLITE_ID,
|
':satellite_id' => DEFAULT_SATELLITE_ID,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
$stmtInsertMinorplanet = $pdo->prepare("
|
||||||
|
INSERT INTO `app_user_minorplanets` (
|
||||||
|
`user_id`,
|
||||||
|
`minorplanet_id`,
|
||||||
|
`is_favorite`,
|
||||||
|
`created_at`
|
||||||
|
) VALUES (
|
||||||
|
:user_id,
|
||||||
|
:minorplanet_id,
|
||||||
|
1,
|
||||||
|
NOW()
|
||||||
|
)
|
||||||
|
");
|
||||||
|
$stmtInsertMinorplanet->execute([
|
||||||
|
':user_id' => $userId,
|
||||||
|
':minorplanet_id' => $defaultMinorplanetId,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$stmtInsertComet = $pdo->prepare("
|
||||||
|
INSERT INTO `app_user_comets` (
|
||||||
|
`user_id`,
|
||||||
|
`comet_id`,
|
||||||
|
`is_favorite`,
|
||||||
|
`created_at`
|
||||||
|
) VALUES (
|
||||||
|
:user_id,
|
||||||
|
:comet_id,
|
||||||
|
1,
|
||||||
|
NOW()
|
||||||
|
)
|
||||||
|
");
|
||||||
|
$stmtInsertComet->execute([
|
||||||
|
':user_id' => $userId,
|
||||||
|
':comet_id' => $defaultCometId,
|
||||||
|
]);
|
||||||
|
|
||||||
$pdo->commit();
|
$pdo->commit();
|
||||||
} catch (Throwable $e) {
|
} catch (Throwable $e) {
|
||||||
if ($pdo->inTransaction()) {
|
if ($pdo->inTransaction()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user