Autosave: 20260205-060056

This commit is contained in:
Flatlogic Bot 2026-02-05 06:00:56 +00:00
parent 7917ea5f98
commit 306385f2ae
5 changed files with 381 additions and 168 deletions

View File

@ -1,5 +1,5 @@
<?php <?php
$pageTitle = "Configuración del Kanban"; $pageTitle = "Configuración General";
require_once 'layout_header.php'; require_once 'layout_header.php';
require_once 'db/config.php'; require_once 'db/config.php';
@ -12,119 +12,306 @@ if ($_SESSION['user_role'] !== 'Administrador' && $_SESSION['user_role'] !== 'ad
$conn = db(); $conn = db();
// --- Gestión de Columnas --- // --- Procesamiento de Formularios ---
// Obtener todas las columnas del Kanban para la tabla de gestión
$query_manage_columns = "SELECT * FROM kanban_columns ORDER BY orden ASC";
$stmt_manage_columns = $conn->query($query_manage_columns);
$management_columns = $stmt_manage_columns->fetchAll(PDO::FETCH_ASSOC);
// --- Visibilidad de Columnas ---
// Obtener la configuración actual de visibilidad
$query_config = "SELECT * FROM configuracion WHERE id = 1";
$result_config = $conn->query($query_config);
$config = $result_config->fetch(PDO::FETCH_ASSOC);
$visible_columns = $config ? json_decode($config['kanban_columns'], true) : [];
// Guardar visibilidad de columnas del Kanban
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['save_visibility'])) { if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['save_visibility'])) {
$new_visible_columns = $_POST['columns'] ?? []; $visible_columns = $_POST['visible_columns'] ?? [];
$json_columns = json_encode($new_visible_columns); $json_visible_columns = json_encode($visible_columns);
// Usar INSERT ... ON DUPLICATE KEY UPDATE para seguridad
$update_query = "INSERT INTO configuracion (id, kanban_columns) VALUES (1, :kanban_columns)
ON DUPLICATE KEY UPDATE kanban_columns = :kanban_columns";
$stmt = $conn->prepare($update_query);
$stmt->bindParam(':kanban_columns', $json_columns);
$stmt = $conn->prepare("INSERT INTO configuracion (clave, valor) VALUES ('kanban_visible_columns', :valor) ON DUPLICATE KEY UPDATE valor = :valor");
$stmt->bindParam(':valor', $json_visible_columns);
if ($stmt->execute()) { if ($stmt->execute()) {
echo "<div class='alert alert-success'>Configuración de visibilidad guardada.</div>"; $_SESSION['success_message'] = 'Visibilidad de columnas actualizada.';
$visible_columns = $new_visible_columns; // Actualizar para mostrar el cambio inmediatamente
} else { } else {
echo "<div class='alert alert-danger'>Error al guardar la configuración de visibilidad.</div>"; $_SESSION['error_message'] = 'Error al actualizar la visibilidad.';
} }
header("Location: configuracion.php");
exit();
} }
// Obtener todas las columnas de kanban_columns para el formulario de visibilidad
$all_db_columns_query = "SELECT nombre FROM kanban_columns ORDER BY orden ASC"; // --- Carga de Datos para la Vista ---
$stmt_all_db_columns = $conn->query($all_db_columns_query);
// Datos para la gestión de columnas
$stmt_manage_columns = $conn->query("SELECT * FROM kanban_columns ORDER BY orden ASC");
$management_columns = $stmt_manage_columns->fetchAll(PDO::FETCH_ASSOC);
// Datos para la visibilidad de columnas
$stmt_visible = $conn->prepare("SELECT valor FROM configuracion WHERE clave = 'kanban_visible_columns'");
$stmt_visible->execute();
$config_row = $stmt_visible->fetch(PDO::FETCH_ASSOC);
$visible_columns = $config_row ? json_decode($config_row['valor'], true) : [];
$stmt_all_db_columns = $conn->query("SELECT nombre FROM kanban_columns ORDER BY orden ASC");
$available_columns_for_visibility = $stmt_all_db_columns->fetchAll(PDO::FETCH_COLUMN); $available_columns_for_visibility = $stmt_all_db_columns->fetchAll(PDO::FETCH_COLUMN);
// --- Datos para la GESTIÓN DE CONTENIDO DEL KANBAN ---
$products = $conn->query("SELECT id, nombre FROM products ORDER BY nombre ASC")->fetchAll(PDO::FETCH_ASSOC);
$kanban_columns_for_cards = $conn->query("SELECT id, nombre FROM kanban_columns ORDER BY orden, id")->fetchAll(PDO::FETCH_ASSOC);
$info_cards = $conn->query("
SELECT ip.*, p.nombre as producto_nombre, kc.nombre as column_nombre
FROM info_productos ip
LEFT JOIN products p ON ip.producto_id = p.id
LEFT JOIN kanban_columns kc ON ip.column_id = kc.id
ORDER BY ip.orden, ip.id DESC
")->fetchAll(PDO::FETCH_ASSOC);
// Mostrar mensajes de éxito o error
if (isset($_SESSION['success_message'])) {
echo "<div class='alert alert-success'>".$_SESSION['success_message']."</div>";
unset($_SESSION['success_message']);
}
if (isset($_SESSION['error_message'])) {
echo "<div class='alert alert-danger'>".$_SESSION['error_message']."</div>";
unset($_SESSION['error_message']);
}
?> ?>
<div class="container mt-5"> <div class="container mt-5">
<!-- SECCIÓN PARA GESTIONAR CONTENIDO DEL KANBAN (TARJETAS) -->
<div class="card mb-5">
<div class="card-header">
<h3>Gestionar Contenido del Kanban</h3>
</div>
<div class="card-body">
<p>Aquí puedes crear, editar y eliminar las tarjetas de información que aparecen en el tablero Kanban.</p>
<!-- Formulario para añadir/editar tarjeta -->
<div class="card mb-4">
<div class="card-header">
<h5 id="form-title">Añadir Nueva Tarjeta</h5>
</div>
<div class="card-body">
<form action="save_info_producto.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="id" id="info-id">
<div class="form-group">
<label for="producto_id">Producto Asociado (Opcional)</label>
<select name="producto_id" id="producto_id" class="form-control">
<option value="">Selecciona un producto</option>
<?php foreach ($products as $product): ?>
<option value="<?php echo $product['id']; ?>"><?php echo htmlspecialchars($product['nombre']); ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="form-group mt-3">
<label for="texto_informativo">Texto de la Tarjeta</label>
<textarea name="texto_informativo" id="texto_informativo" class="form-control" rows="3" required></textarea>
</div>
<div class="form-group mt-3">
<label for="imagen">Imagen de la Tarjeta</label>
<div id="image-preview" class="mt-2 mb-2"></div>
<input type="file" name="imagen" id="imagen" class="form-control-file">
<input type="hidden" name="current_imagen" id="current_imagen">
<small class="form-text text-muted">Sube una imagen para añadir o reemplazar la actual.</small>
</div>
<div class="form-group mt-3">
<label for="column_id">Columna del Kanban</label>
<select name="column_id" id="column_id" class="form-control" required>
<option value="">Selecciona una columna</option>
<?php foreach ($kanban_columns_for_cards as $column): ?>
<option value="<?php echo $column['id']; ?>"><?php echo htmlspecialchars($column['nombre']); ?></option>
<?php endforeach; ?>
</select>
</div>
<button type="submit" class="btn btn-primary mt-3">Guardar Tarjeta</button>
<button type="button" class="btn btn-secondary mt-3" onclick="resetForm()">Limpiar</button>
</form>
</div>
</div>
<!-- Lista de tarjetas existentes -->
<div class="card">
<div class="card-header">
<h5>Tarjetas Existentes</h5>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Producto</th>
<th>Imagen</th>
<th>Texto</th>
<th>Columna</th>
<th style="width: 120px;">Acciones</th>
</tr>
</thead>
<tbody>
<?php if (empty($info_cards)): ?>
<tr><td colspan="5" class="text-center">No hay tarjetas creadas.</td></tr>
<?php else: ?>
<?php foreach ($info_cards as $card): ?>
<tr>
<td><?php echo htmlspecialchars($card['producto_nombre'] ?: 'N/A'); ?></td>
<td>
<?php if (!empty($card['imagen_url'])): ?>
<img src="<?php echo htmlspecialchars($card['imagen_url']); ?>?t=<?php echo time(); ?>" alt="Imagen" style="width: 100px; height: auto; border-radius: 5px;">
<?php endif; ?>
</td>
<td><?php echo nl2br(htmlspecialchars($card['texto_informativo'])); ?></td>
<td><?php echo htmlspecialchars($card['column_nombre'] ?: 'Sin asignar'); ?></td>
<td>
<button class="btn btn-sm btn-info mb-1 w-100" onclick='editCard(<?php echo json_encode($card); ?>)'>Editar</button>
<a href="delete_info_producto.php?id=<?php echo $card['id']; ?>" class="btn btn-sm btn-danger w-100" onclick="return confirm('¿Seguro?')">Eliminar</a>
</td>
</tr>
<?php endforeach; ?>
<?php endif; ?>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<!-- Sección para Configuración de Banners y Textos -->
<div class="card mb-5">
<div class="card-header">
<h3>Imágenes de Cobertura</h3>
</div>
<div class="card-body">
<!-- Formulario para Banner de Cobertura -->
<div class="mb-4">
<h5>Banner de Cobertura</h5>
<form action="save_cobertura_banner.php" method="post" enctype="multipart/form-data">
<div class="form-group">
<label for="cobertura_banner">Actualizar imagen del banner (JPG, PNG, GIF)</label>
<input type="file" name="cobertura_banner" id="cobertura_banner" class="form-control-file" required>
</div>
<button type="submit" class="btn btn-primary mt-2">Guardar Banner</button>
</form>
<div class="mt-3">
<p>Imagen actual:</p>
<img src="assets/uploads/cobertura_banner.jpg?t=<?php echo time(); ?>" alt="Banner de Cobertura" style="width: 100%; max-width: 800px; height: auto; border-radius: 8px; object-fit: cover;">
</div>
</div>
<hr>
<!-- Formulario para Banner de Cobertura Xpress -->
<div class="mt-4">
<h5>Banner de Cobertura Xpress</h5>
<form action="save_cobertura_xpress_banner.php" method="post" enctype="multipart/form-data">
<div class="form-group">
<label for="cobertura_xpress_banner">Actualizar imagen del banner (JPG, PNG, GIF)</label>
<input type="file" name="cobertura_xpress_banner" id="cobertura_xpress_banner" class="form-control-file" required>
</div>
<button type="submit" class="btn btn-primary mt-2">Guardar Banner Xpress</button>
</form>
<div class="mt-3">
<p>Imagen actual:</p>
<img src="assets/uploads/cobertura_xpress_banner.jpg?t=<?php echo time(); ?>" alt="Banner de Cobertura Xpress" style="width: 100%; max-width: 800px; height: auto; border-radius: 8px; object-fit: cover;">
</div>
</div>
</div>
</div>
<!-- Sección para Gestionar Columnas (Añadir, Editar, Eliminar) --> <!-- Sección para Gestionar Columnas (Añadir, Editar, Eliminar) -->
<div class="card mb-5"> <div class="card mb-5">
<div class="card-header"> <div class="card-header">
<h3>Gestionar Columnas del Kanban</h3> <h3>Gestionar Columnas del Kanban</h3>
</div> </div>
<div class="card-body"> <div class="card-body">
<p>Aquí puedes añadir, editar y eliminar las columnas que se usarán en el tablero Kanban.</p> <!-- Formulario para añadir nueva columna -->
<a href="add_column.php" class="btn btn-success mb-3"> <div class="card mb-4">
<i class="fas fa-plus"></i> Añadir Nueva Columna <div class="card-header">
</a> <h6>Añadir Nueva Columna</h6>
</div>
<table class="table table-bordered table-striped"> <div class="card-body">
<thead class="table-dark"> <form action="add_column.php" method="post">
<tr> <div class="form-group">
<th>Nombre de la Columna</th> <label for="nombre">Nombre de la Columna</label>
<th style="width: 150px;">Acciones</th> <input type="text" name="nombre" id="nombre" class="form-control" required>
</tr> </div>
</thead> <button type="submit" class="btn btn-success mt-3">Añadir Columna</button>
<tbody> </form>
<?php if (empty($management_columns)): ?> </div>
</div>
<!-- Tabla de columnas existentes -->
<h6>Columnas Actuales</h6>
<div class="table-responsive">
<table class="table table-bordered table-striped">
<thead>
<tr> <tr>
<td colspan="2" class="text-center">No hay columnas definidas.</td> <th>Orden</th>
<th>Nombre</th>
<th>Acciones</th>
</tr> </tr>
<?php else: ?> </thead>
<?php foreach ($management_columns as $column): ?> <tbody>
<tr> <?php if (empty($management_columns)): ?>
<td><?php echo htmlspecialchars($column['nombre']); ?></td> <tr><td colspan="3" class="text-center">No hay columnas definidas.</td></tr>
<td> <?php else: ?>
<a href="edit_column.php?id=<?php echo $column['id']; ?>" class="btn btn-primary btn-sm"> <?php foreach ($management_columns as $col): ?>
<i class="fas fa-edit"></i> Editar <tr>
</a> <td><?php echo htmlspecialchars($col['orden']); ?></td>
<a href="delete_column.php?id=<?php echo $column['id']; ?>" class="btn btn-danger btn-sm" onclick="return confirm('¿Estás seguro de que quieres eliminar esta columna?');"> <td><?php echo htmlspecialchars($col['nombre']); ?></td>
<i class="fas fa-trash"></i> Eliminar <td>
</a> <a href="edit_column.php?id=<?php echo $col['id']; ?>" class="btn btn-sm btn-info">Editar</a>
</td> <a href="delete_column.php?id=<?php echo $col['id']; ?>" class="btn btn-sm btn-danger" onclick="return confirm('¿Estás seguro de que quieres eliminar esta columna?');">Eliminar</a>
</tr> </td>
<?php endforeach; ?> </tr>
<?php endif; ?> <?php endforeach; ?>
</tbody> <?php endif; ?>
</table> </tbody>
</table>
</div>
</div> </div>
</div> </div>
<!-- Sección para Configurar Visibilidad de Columnas --> <!-- Sección para Configurar Visibilidad de Columnas -->
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h3>Configurar Visibilidad de Columnas</h3> <h3>Configurar Visibilidad de Columnas en Kanban</h3>
</div> </div>
<div class="card-body"> <div class="card-body">
<p>Selecciona las columnas que deseas que sean visibles en el tablero Kanban.</p> <p>Selecciona las columnas que quieres que sean visibles en el tablero Kanban principal.</p>
<form method="POST"> <form action="configuracion.php" method="post">
<input type="hidden" name="save_visibility" value="1"> <input type="hidden" name="save_visibility" value="1">
<div class="row"> <div class="form-group">
<?php foreach ($available_columns_for_visibility as $column_name): ?> <?php foreach ($available_columns_for_visibility as $column_name): ?>
<div class="col-md-3"> <div class="form-check">
<div class="form-check"> <input class="form-check-input" type="checkbox" name="visible_columns[]" value="<?php echo htmlspecialchars($column_name); ?>" id="check_<?php echo htmlspecialchars($column_name); ?>"
<input class="form-check-input" type="checkbox" name="columns[]" value="<?php echo htmlspecialchars($column_name); ?>" id="col_<?php echo htmlspecialchars($column_name); ?>" <?php echo in_array($column_name, $visible_columns) ? 'checked' : ''; ?>> <?php echo (in_array($column_name, $visible_columns)) ? 'checked' : ''; ?>>
<label class="form-check-label" for="col_<?php echo htmlspecialchars($column_name); ?>"> <label class="form-check-label" for="check_<?php echo htmlspecialchars($column_name); ?>">
<?php echo htmlspecialchars($column_name); ?> <?php echo htmlspecialchars($column_name); ?>
</label> </label>
</div>
</div> </div>
<?php endforeach; ?> <?php endforeach; ?>
</div> </div>
<button type="submit" class="btn btn-primary mt-3">Guardar Visibilidad</button> <button type="submit" class="btn btn-primary mt-3">Guardar Visibilidad</button>
</form> </form>
</div> </div>
</div> </div>
</div> </div>
<?php require_once 'layout_footer.php'; ?> <script>
function editCard(card) {
document.getElementById('form-title').innerText = 'Editar Tarjeta';
document.getElementById('info-id').value = card.id;
document.getElementById('producto_id').value = card.producto_id;
document.getElementById('texto_informativo').value = card.texto_informativo;
document.getElementById('column_id').value = card.column_id;
document.getElementById('current_imagen').value = card.imagen_url;
const imagePreview = document.getElementById('image-preview');
imagePreview.innerHTML = '';
if (card.imagen_url) {
imagePreview.innerHTML = `<p class="mb-1">Imagen actual:</p><img src="${card.imagen_url}?t=${new Date().getTime()}" style="width: 100px; height: auto; border-radius: 5px;"/>`;
}
const formCard = document.querySelector('#form-title').closest('.card');
formCard.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
function resetForm() {
document.getElementById('form-title').innerText = 'Añadir Nueva Tarjeta';
document.getElementById('info-id').value = '';
document.querySelector('form[action="save_info_producto.php"]').reset();
document.getElementById('image-preview').innerHTML = '';
}
</script>
<?php require_once 'layout_footer.php'; ?>

View File

@ -3,80 +3,98 @@ $pageTitle = "Editar Columna del Kanban";
require_once 'layout_header.php'; require_once 'layout_header.php';
require_once 'db/config.php'; require_once 'db/config.php';
// Asegurarse de que el usuario sea administrador // 1. Validar rol de administrador
if ($_SESSION['user_role'] !== 'Administrador' && $_SESSION['user_role'] !== 'admin') { if (!isset($_SESSION['user_role']) || ($_SESSION['user_role'] !== 'Administrador' && $_SESSION['user_role'] !== 'admin')) {
echo "<div class='alert alert-danger'>Acceso denegado.</div>"; echo "<div class='alert alert-danger'>Acceso denegado.</div>";
require_once 'layout_footer.php'; require_once 'layout_footer.php';
exit(); exit();
} }
$message = ''; // 2. Validar el ID de la columna
$column = null; if (!isset($_GET['id']) || !filter_var($_GET['id'], FILTER_VALIDATE_INT)) {
if (!isset($_GET['id']) || !is_numeric($_GET['id'])) {
header('Location: configuracion.php'); header('Location: configuracion.php');
exit; exit;
} }
$column_id = $_GET['id']; $column_id = $_GET['id'];
$message = '';
$column_name = '';
try { try {
$pdo = db(); $pdo = db();
// Procesar el formulario cuando se envía // 3. Si se envía el formulario (POST), actualizar la base de datos
if ($_SERVER['REQUEST_METHOD'] === 'POST') { if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$nombre = trim($_POST['nombre'] ?? ''); $new_name = trim($_POST['nombre'] ?? '');
if (!empty($nombre)) { if (empty($new_name)) {
$message = "<div class='alert alert-warning'>El nombre no puede estar vacío.</div>";
// Volver a cargar el nombre actual para mostrarlo en el formulario
$stmt = $pdo->prepare('SELECT nombre FROM kanban_columns WHERE id = ?');
$stmt->execute([$column_id]);
$column_name = $stmt->fetchColumn();
} else {
$stmt = $pdo->prepare('UPDATE kanban_columns SET nombre = ? WHERE id = ?'); $stmt = $pdo->prepare('UPDATE kanban_columns SET nombre = ? WHERE id = ?');
if ($stmt->execute([$nombre, $column_id])) { if ($stmt->execute([$new_name, $column_id])) {
$_SESSION['success_message'] = "Columna actualizada a '" . htmlspecialchars($nombre) . "'."; $_SESSION['success_message'] = "Columna actualizada correctamente.";
header('Location: configuracion.php'); header('Location: configuracion.php');
exit; exit;
} else { } else {
$message = "<div class='alert alert-danger'>Error al actualizar la columna.</div>"; $message = "<div class='alert alert-danger'>Error al actualizar la columna.</div>";
$column_name = $new_name; // Mantener el valor que el usuario intentó guardar
} }
} else { }
$message = "<div class='alert alert-warning'>El nombre de la columna no puede estar vacío.</div>"; } else {
// 4. Si se carga la página (GET), obtener el nombre actual de la columna
$stmt = $pdo->prepare('SELECT nombre FROM kanban_columns WHERE id = ?');
$stmt->execute([$column_id]);
$column_name = $stmt->fetchColumn();
if ($column_name === false) {
echo "<div class='alert alert-danger'>La columna no existe o no se pudo encontrar.</div>";
require_once 'layout_footer.php';
exit;
} }
} }
// Obtener los datos de la columna para mostrar en el formulario
$stmt = $pdo->prepare('SELECT * FROM kanban_columns WHERE id = ?');
$stmt->execute([$column_id]);
$column = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$column) {
echo "<div class='alert alert-danger'>La columna no existe.</div>";
require_once 'layout_footer.php';
exit;
}
} catch (PDOException $e) { } catch (PDOException $e) {
// Manejo de errores de la base de datos
$message = "<div class='alert alert-danger'>Error de base de datos: " . $e->getMessage() . "</div>"; $message = "<div class='alert alert-danger'>Error de base de datos: " . $e->getMessage() . "</div>";
// Desactivar el formulario si hay un error grave
$column_name = false;
} }
?> ?>
<div class="container mt-5"> <div class="container mt-5">
<div class="card"> <div class="card mx-auto" style="max-width: 500px;">
<div class="card-header"> <div class="card-header">
<h2>Editar Columna del Kanban</h2> <h3>Editar Columna</h3>
</div> </div>
<div class="card-body"> <div class="card-body">
<?php echo $message; ?> <?php echo $message; ?>
<?php if ($column): ?>
<?php if ($column_name !== false): ?>
<form method="POST" action="edit_column.php?id=<?php echo $column_id; ?>"> <form method="POST" action="edit_column.php?id=<?php echo $column_id; ?>">
<div class="mb-3"> <div class="mb-3">
<label for="nombre" class="form-label">Nombre de la Columna</label> <label for="nombre" class="form-label">Nombre de la Columna</label>
<input type="text" class="form-control" id="nombre" name="nombre" value="<?php echo htmlspecialchars($column['nombre']); ?>" required> <input type="text" class="form-control" id="nombre" name="nombre" value="<?php echo htmlspecialchars($column_name); ?>" required>
</div> </div>
<button type="submit" class="btn btn-primary">Actualizar Columna</button> <button type="submit" class="btn btn-primary">
<a href="configuracion.php" class="btn btn-secondary">Cancelar</a> <i class="fas fa-save"></i> Actualizar
</button>
<a href="configuracion.php" class="btn btn-secondary">
<i class="fas fa-times"></i> Cancelar
</a>
</form> </form>
<?php else: ?>
<p>No se puede mostrar el formulario de edición debido a un error.</p>
<a href="configuracion.php" class="btn btn-primary">Volver a Configuración</a>
<?php endif; ?> <?php endif; ?>
</div> </div>
</div> </div>
</div> </div>
<?php require_once 'layout_footer.php'; ?> <?php require_once 'layout_footer.php'; ?>

View File

@ -16,7 +16,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
]); ]);
// Redirect back to the info page // Redirect back to the info page
header('Location: info_producto.php'); header('Location: configuracion.php');
exit; exit;
} catch (PDOException $e) { } catch (PDOException $e) {

View File

@ -1,46 +1,49 @@
<?php <?php
session_start(); session_start();
// 1. Verificar autenticación y rol
if (!isset($_SESSION['user_id'])) { if (!isset($_SESSION['user_id'])) {
header("Location: login.php"); header("Location: login.php");
exit; exit;
} }
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['banner_image'])) { // 2. Validar que sea una petición POST y que se haya enviado un archivo
$target_dir = "assets/uploads/"; if ($_SERVER['REQUEST_METHOD'] !== 'POST' || !isset($_FILES['banner_image']) || $_FILES['banner_image']['error'] !== UPLOAD_ERR_OK) {
$target_file = $target_dir . "cobertura_banner.jpg"; $_SESSION['error_message'] = "Error: No se recibió ningún archivo o hubo un error en la subida.";
$uploadOk = 1; header("Location: configuracion.php");
$imageFileType = strtolower(pathinfo($_FILES["banner_image"]["name"], PATHINFO_EXTENSION)); exit;
}
// Check if image file is a actual image or fake image $target_dir = "assets/uploads/";
$check = getimagesize($_FILES["banner_image"]["tmp_name"]); $target_file = $target_dir . "cobertura_banner.jpg";
if ($check !== false) { $image_tmp_name = $_FILES["banner_image"]["tmp_name"];
$uploadOk = 1; $image_name = $_FILES["banner_image"]["name"];
} else {
$_SESSION['error_message'] = "El archivo no es una imagen.";
$uploadOk = 0;
}
// Allow certain file formats // 3. Validar que el archivo sea una imagen real
if ($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" $check = getimagesize($image_tmp_name);
&& $imageFileType != "gif") { if ($check === false) {
$_SESSION['error_message'] = "Solo se permiten archivos JPG, JPEG, PNG y GIF."; $_SESSION['error_message'] = "El archivo subido no es una imagen válida.";
$uploadOk = 0; header("Location: configuracion.php");
} exit;
}
// Check if $uploadOk is set to 0 by an error // 4. Validar la extensión del archivo (JPG, PNG, JPEG, GIF)
if ($uploadOk == 0) { $imageFileType = strtolower(pathinfo($image_name, PATHINFO_EXTENSION));
// if everything is ok, try to upload file $allowed_types = ["jpg", "png", "jpeg", "gif"];
} else { if (!in_array($imageFileType, $allowed_types)) {
if (move_uploaded_file($_FILES["banner_image"]["tmp_name"], $target_file)) { $_SESSION['error_message'] = "Solo se permiten archivos de tipo JPG, JPEG, PNG y GIF.";
$_SESSION['success_message'] = "La imagen de cabecera ha sido actualizada."; header("Location: configuracion.php");
} else { exit;
$_SESSION['error_message'] = "Hubo un error al subir tu archivo."; }
}
} // 5. Intentar mover el archivo a su destino final
// La función move_uploaded_file es segura contra ataques de path traversal.
if (move_uploaded_file($image_tmp_name, $target_file)) {
$_SESSION['success_message'] = "La imagen del banner de Cobertura ha sido actualizada correctamente.";
} else { } else {
$_SESSION['error_message'] = "No se recibió ningún archivo."; $_SESSION['error_message'] = "Hubo un error inesperado al guardar la imagen.";
} }
header("Location: configuracion.php"); header("Location: configuracion.php");
exit; exit;
?> ?>

View File

@ -1,43 +1,48 @@
<?php <?php
session_start(); session_start();
// 1. Verificar autenticación
if (!isset($_SESSION['user_id'])) { if (!isset($_SESSION['user_id'])) {
header("Location: login.php"); header("Location: login.php");
exit; exit;
} }
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['banner_image_xpress'])) { // 2. Validar que sea una petición POST y que se haya enviado un archivo
$target_dir = "assets/uploads/"; if ($_SERVER['REQUEST_METHOD'] !== 'POST' || !isset($_FILES['banner_image_xpress']) || $_FILES['banner_image_xpress']['error'] !== UPLOAD_ERR_OK) {
$target_file = $target_dir . "cobertura_xpress_banner.jpg"; $_SESSION['error_message'] = "Error: No se recibió ningún archivo para Cobertura Xpress o hubo un error en la subida.";
$uploadOk = 1; header("Location: configuracion.php");
$imageFileType = strtolower(pathinfo($_FILES["banner_image_xpress"]["name"], PATHINFO_EXTENSION)); exit;
}
// Check if image file is a actual image or fake image $target_dir = "assets/uploads/";
$check = getimagesize($_FILES["banner_image_xpress"]["tmp_name"]); $target_file = $target_dir . "cobertura_xpress_banner.jpg";
if ($check !== false) { $image_tmp_name = $_FILES["banner_image_xpress"]["tmp_name"];
$uploadOk = 1; $image_name = $_FILES["banner_image_xpress"]["name"];
} else {
$_SESSION['error_message'] = "El archivo no es una imagen.";
$uploadOk = 0;
}
// Allow certain file formats // 3. Validar que el archivo sea una imagen real
if ($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" $check = getimagesize($image_tmp_name);
&& $imageFileType != "gif" && $imageFileType != "webp") { if ($check === false) {
$_SESSION['error_message'] = "Solo se permiten archivos JPG, JPEG, PNG, WEBP y GIF."; $_SESSION['error_message'] = "El archivo subido para Cobertura Xpress no es una imagen válida.";
$uploadOk = 0; header("Location: configuracion.php");
} exit;
}
if ($uploadOk == 1) { // 4. Validar la extensión del archivo (JPG, PNG, JPEG, GIF, WEBP)
if (move_uploaded_file($_FILES["banner_image_xpress"]["tmp_name"], $target_file)) { $imageFileType = strtolower(pathinfo($image_name, PATHINFO_EXTENSION));
$_SESSION['success_message'] = "La imagen de cabecera de Cobertura Xpress ha sido actualizada."; $allowed_types = ["jpg", "png", "jpeg", "gif", "webp"];
} else { if (!in_array($imageFileType, $allowed_types)) {
$_SESSION['error_message'] = "Hubo un error al subir tu archivo."; $_SESSION['error_message'] = "Solo se permiten archivos de tipo JPG, JPEG, PNG, GIF y WEBP.";
} header("Location: configuracion.php");
} exit;
}
// 5. Intentar mover el archivo a su destino final
if (move_uploaded_file($image_tmp_name, $target_file)) {
$_SESSION['success_message'] = "La imagen del banner de Cobertura Xpress ha sido actualizada correctamente.";
} else { } else {
$_SESSION['error_message'] = "No se recibió ningún archivo para Cobertura Xpress."; $_SESSION['error_message'] = "Hubo un error inesperado al guardar la imagen de Cobertura Xpress.";
} }
header("Location: configuracion.php"); header("Location: configuracion.php");
exit; exit;
?> ?>