$postedType, 'title' => $_POST['title'] ?? '', 'subtitle' => $_POST['subtitle'] ?? '', 'body' => $_POST['body'] ?? '', 'meta_url' => $_POST['meta_url'] ?? '', 'meta_value' => $_POST['meta_value'] ?? '', 'weekday' => $_POST['weekday'] ?? null, 'start_time' => $_POST['start_time'] ?? null, 'end_time' => $_POST['end_time'] ?? null, 'status' => $_POST['status'] ?? 'published', 'sort_order' => $_POST['sort_order'] ?? 0, ], $saveId); set_flash('success', $saveId ? 'Contenido actualizado.' : 'Nuevo contenido creado.'); header('Location: /admin.php?type=' . urlencode($postedType) . '&id=' . $savedId); exit; } catch (Throwable $e) { set_flash('danger', $e->getMessage()); header('Location: /admin.php?type=' . urlencode($postedType) . ($saveId ? '&id=' . $saveId : '&mode=new')); exit; } } $flash = pull_flash(); $counts = get_entry_counts(); $programs = get_entries('program'); $djs = get_entries('dj'); $socials = get_entries('social'); $messages = get_entries('message'); if (!$entry && $selectedId) { $type = 'program'; } $entry = $entry && $entry['entry_type'] === $type ? $entry : ($mode === 'new' ? null : $entry); $assetVersion = (string) max(@filemtime(__DIR__ . '/assets/css/custom.css') ?: time(), @filemtime(__DIR__ . '/assets/js/main.js') ?: time()); $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? project_description(); $projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? ''; ?> Admin · <?= h(project_name()) ?>

Gestiona shows, DJs, redes y mensajes

Primera versión funcional: listados por tipo, detalle editable y revisión básica de mensajes recibidos.

Programas
DJs
Redes
Mensajes

>