= h(weekday_name((int) $weekday)) ?>
+ = h((string) count($items)) ?> show= count($items) === 1 ? '' : 's' ?> += h($item['body']) ?>
+diff --git a/admin.php b/admin.php new file mode 100644 index 0000000..8df9c59 --- /dev/null +++ b/admin.php @@ -0,0 +1,257 @@ + $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'] ?? ''; +?> + + +
+ + +Primera versión funcional: listados por tipo, detalle editable y revisión básica de mensajes recibidos.
+= $type === 'message' ? 'Marca el estado del mensaje y consulta el pedido.' : 'Completa los campos mínimos para actualizar la experiencia pública.' ?>
+= ($_SERVER['HTTP_HOST'] ?? '') === 'appwizzy.com' ? 'AppWizzy' : 'Flatlogic' ?> AI is collecting your requirements and applying the first changes.
-This page will update automatically as the plan is implemented.
-Runtime: PHP = htmlspecialchars($phpVersion) ?> — UTC = htmlspecialchars($now) ?>
Lili Records Radio abre con play inmediato, estado de “Ahora suena”, parrilla semanal, perfiles de DJs y un flujo real para que los oyentes envíen mensajes que el admin puede revisar y actualizar.
+ +El reproductor queda visible de inmediato y el contexto editorial acompaña la escucha.
+Si quieres, en la siguiente iteración puedo conectar metadata real del stream para reemplazar el “Ahora suena” basado en parrilla.
+Los bloques publicados alimentan la vista pública y el estado editorial de la estación.
+= h($item['body']) ?>
+Cada perfil puede enlazar a redes o biografía corta desde el mismo backend.
+= h($dj['subtitle']) ?>
+= h($dj['body']) ?>
+ + Ver enlace principal + +El formulario guarda el pedido en base de datos y lo deja listo para revisión desde el panel admin.
+Desde el panel puedes crear programas, DJs y enlaces, además de revisar el detalle de cada mensaje recibido.
+