|
@@ -35,23 +35,52 @@ if (isset($_POST['save_game'])) {
|
|
|
$r_id = (int)$_POST['game_reihe_id'];
|
|
$r_id = (int)$_POST['game_reihe_id'];
|
|
|
$t_id = ($_POST['game_typ_id'] == '0') ? null : (int)$_POST['game_typ_id'];
|
|
$t_id = ($_POST['game_typ_id'] == '0') ? null : (int)$_POST['game_typ_id'];
|
|
|
$l_id = ($_POST['game_level_id'] == '0') ? null : (int)$_POST['game_level_id'];
|
|
$l_id = ($_POST['game_level_id'] == '0') ? null : (int)$_POST['game_level_id'];
|
|
|
- $ean = (!isset($_POST['ean']) || $_POST['ean'] === '') ? null : $_POST['ean'];
|
|
|
|
|
- $url = !empty($_POST['url']) ? $_POST['url'] : 'https://via.placeholder.com/300x180';
|
|
|
|
|
|
|
+
|
|
|
|
|
+ // EAN BEREINIGUNG: NUR LEERZEICHEN ENTFERNEN
|
|
|
|
|
+ $eanRaw = $_POST['ean'] ?? '';
|
|
|
|
|
+ $eanClean = str_replace(' ', '', (string)$eanRaw);
|
|
|
|
|
+ $ean = ($eanClean === '') ? null : $eanClean;
|
|
|
|
|
+
|
|
|
|
|
+ $urlInput = trim($_POST['url']);
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
|
|
|
+ $pdo->beginTransaction();
|
|
|
|
|
+
|
|
|
if ($id > 0) {
|
|
if ($id > 0) {
|
|
|
- $stmt = $pdo->prepare("UPDATE spiele SET game_reihe_id=?, titel=?, game_typ_id=?, game_level_id=?, ean=?, bild_url=? WHERE id=?");
|
|
|
|
|
- $stmt->execute([$r_id, $_POST['titel'], $t_id, $l_id, $ean, $url, $id]);
|
|
|
|
|
- $msg = "Spiel aktualisiert!";
|
|
|
|
|
|
|
+ $stmt = $pdo->prepare("UPDATE spiele SET game_reihe_id=?, titel=?, game_typ_id=?, game_level_id=?, ean=? WHERE id=?");
|
|
|
|
|
+ $stmt->execute([$r_id, $_POST['titel'], $t_id, $l_id, $ean, $id]);
|
|
|
|
|
+ $spiel_id = $id;
|
|
|
} else {
|
|
} else {
|
|
|
- $stmt = $pdo->prepare("INSERT INTO spiele (game_reihe_id, titel, game_typ_id, game_level_id, ean, bild_url) VALUES (?,?,?,?,?,?)");
|
|
|
|
|
- $stmt->execute([$r_id, $_POST['titel'], $t_id, $l_id, $ean, $url]);
|
|
|
|
|
- $msg = "Neues Spiel angelegt!";
|
|
|
|
|
|
|
+ $stmt = $pdo->prepare("INSERT INTO spiele (game_reihe_id, titel, game_typ_id, game_level_id, ean) VALUES (?,?,?,?,?)");
|
|
|
|
|
+ $stmt->execute([$r_id, $_POST['titel'], $t_id, $l_id, $ean]);
|
|
|
|
|
+ $spiel_id = $pdo->lastInsertId();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // BILD-DOWNLOAD LOGIK (Nur bei externen URLs)
|
|
|
|
|
+ if (!empty($urlInput) && strpos($urlInput, 'http') === 0) {
|
|
|
|
|
+ $ext = pathinfo(parse_url($urlInput, PHP_URL_PATH), PATHINFO_EXTENSION) ?: 'jpg';
|
|
|
|
|
+ // Dateiname basiert auf bereinigter EAN (oder ID)
|
|
|
|
|
+ $fileName = (!empty($eanClean) ? $eanClean : "game_" . $spiel_id) . "." . $ext;
|
|
|
|
|
+ $destPath = IMG_PATH . $fileName;
|
|
|
|
|
+
|
|
|
|
|
+ $imgData = @file_get_contents($urlInput);
|
|
|
|
|
+ if ($imgData && file_put_contents($destPath, $imgData)) {
|
|
|
|
|
+ $pdo->prepare("UPDATE spiele SET bild_url=? WHERE id=?")->execute([$fileName, $spiel_id]);
|
|
|
|
|
+ }
|
|
|
|
|
+ } elseif (!empty($urlInput)) {
|
|
|
|
|
+ // Falls bereits ein Dateiname oder lokaler Pfad übergeben wurde
|
|
|
|
|
+ $pdo->prepare("UPDATE spiele SET bild_url=? WHERE id=?")->execute([$urlInput, $spiel_id]);
|
|
|
}
|
|
}
|
|
|
- } catch (PDOException $e) { $error = "Fehler: " . $e->getMessage(); }
|
|
|
|
|
|
|
+
|
|
|
|
|
+ $pdo->commit();
|
|
|
|
|
+ $msg = ($id > 0) ? "Spiel aktualisiert!" : "Neues Spiel angelegt!";
|
|
|
|
|
+ } catch (PDOException $e) {
|
|
|
|
|
+ $pdo->rollBack();
|
|
|
|
|
+ $error = "Fehler: " . $e->getMessage();
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// STAMMDATEN HINZUFÜGEN (Duplikat-Check)
|
|
|
|
|
|
|
+// STAMMDATEN LOGIK (Bleibt unverändert)
|
|
|
if (isset($_POST['add_reihe'])) {
|
|
if (isset($_POST['add_reihe'])) {
|
|
|
$c = $pdo->prepare("SELECT id FROM game_reihe WHERE name=?"); $c->execute([$_POST['name']]);
|
|
$c = $pdo->prepare("SELECT id FROM game_reihe WHERE name=?"); $c->execute([$_POST['name']]);
|
|
|
if ($c->fetch()) { $error = "Reihe existiert bereits!"; }
|
|
if ($c->fetch()) { $error = "Reihe existiert bereits!"; }
|
|
@@ -96,7 +125,6 @@ $spiele = $pdo->query("SELECT s.*, r.name as r_name FROM spiele s LEFT JOIN gam
|
|
|
<title>Admin Dashboard</title>
|
|
<title>Admin Dashboard</title>
|
|
|
<style>
|
|
<style>
|
|
|
:root { --accent: #e67e22; --bg: #f4f7f6; --card: #fff; --text: #333; --border: #ddd; }
|
|
:root { --accent: #e67e22; --bg: #f4f7f6; --card: #fff; --text: #333; --border: #ddd; }
|
|
|
- .dark-theme { --bg: #1a1a1a; --card: #2d2d2d; --text: #eee; --border: #444; }
|
|
|
|
|
body { font-family: 'Segoe UI', sans-serif; background: var(--bg); color: var(--text); margin: 0; padding: 20px; }
|
|
body { font-family: 'Segoe UI', sans-serif; background: var(--bg); color: var(--text); margin: 0; padding: 20px; }
|
|
|
.header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; }
|
|
.header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; }
|
|
|
.nav-tabs { display: flex; gap: 10px; margin-bottom: 20px; border-bottom: 2px solid var(--border); }
|
|
.nav-tabs { display: flex; gap: 10px; margin-bottom: 20px; border-bottom: 2px solid var(--border); }
|
|
@@ -144,12 +172,17 @@ $spiele = $pdo->query("SELECT s.*, r.name as r_name FROM spiele s LEFT JOIN gam
|
|
|
</form>
|
|
</form>
|
|
|
|
|
|
|
|
<table>
|
|
<table>
|
|
|
- <thead><tr><th>Bild</th><th>Reihe</th><th>Titel</th><th>Typ / Level</th><th>EAN</th><th>Bild-URL</th><th>Aktion</th></tr></thead>
|
|
|
|
|
|
|
+ <thead><tr><th>Bild</th><th>Reihe</th><th>Titel</th><th>Typ / Level</th><th>EAN</th><th>Bild / Link</th><th>Aktion</th></tr></thead>
|
|
|
<?php foreach($spiele as $s): ?>
|
|
<?php foreach($spiele as $s): ?>
|
|
|
<tr>
|
|
<tr>
|
|
|
<form method="POST">
|
|
<form method="POST">
|
|
|
<input type="hidden" name="id" value="<?=$s['id']?>">
|
|
<input type="hidden" name="id" value="<?=$s['id']?>">
|
|
|
- <td><img src="<?=htmlspecialchars($s['bild_url'])?>" class="img-preview" onerror="this.src='https://via.placeholder.com/45';"></td>
|
|
|
|
|
|
|
+ <td>
|
|
|
|
|
+ <?php
|
|
|
|
|
+ $src = (strpos($s['bild_url'], 'http') === 0) ? $s['bild_url'] : IMG_URL . $s['bild_url'];
|
|
|
|
|
+ ?>
|
|
|
|
|
+ <img src="<?=htmlspecialchars($src)?>" class="img-preview" onerror="this.src='https://via.placeholder.com/45';">
|
|
|
|
|
+ </td>
|
|
|
<td><select name="game_reihe_id" id="r_<?=$s['id']?>" onchange="filter(<?=$s['id']?>)"><?php foreach($reihen as $r): ?><option value="<?=$r['id']?>" <?=$s['game_reihe_id']==$r['id']?'selected':''?>><?=$r['name']?></option><?php endforeach; ?></select></td>
|
|
<td><select name="game_reihe_id" id="r_<?=$s['id']?>" onchange="filter(<?=$s['id']?>)"><?php foreach($reihen as $r): ?><option value="<?=$r['id']?>" <?=$s['game_reihe_id']==$r['id']?'selected':''?>><?=$r['name']?></option><?php endforeach; ?></select></td>
|
|
|
<td><input type="text" name="titel" value="<?=htmlspecialchars($s['titel'])?>"></td>
|
|
<td><input type="text" name="titel" value="<?=htmlspecialchars($s['titel'])?>"></td>
|
|
|
<td>
|
|
<td>
|
|
@@ -206,7 +239,8 @@ function openTab(evt, name) {
|
|
|
evt.currentTarget.classList.add('active');
|
|
evt.currentTarget.classList.add('active');
|
|
|
}
|
|
}
|
|
|
function filter(id) {
|
|
function filter(id) {
|
|
|
- let r_val = document.getElementById('r_'+id).value;
|
|
|
|
|
|
|
+ let r_el = document.getElementById('r_'+id); if(!r_el) return;
|
|
|
|
|
+ let r_val = r_el.value;
|
|
|
['t_'+id, 'l_'+id].forEach(sid => {
|
|
['t_'+id, 'l_'+id].forEach(sid => {
|
|
|
let sel = document.getElementById(sid); if(!sel) return;
|
|
let sel = document.getElementById(sid); if(!sel) return;
|
|
|
sel.querySelectorAll('option').forEach(o => {
|
|
sel.querySelectorAll('option').forEach(o => {
|