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
$pageTitle = "Configuración del Kanban";
$pageTitle = "Configuración General";
require_once 'layout_header.php';
require_once 'db/config.php';
@ -12,119 +12,306 @@ if ($_SESSION['user_role'] !== 'Administrador' && $_SESSION['user_role'] !== 'ad
$conn = db();
// --- Gestión de Columnas ---
// 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) : [];
// --- Procesamiento de Formularios ---
// Guardar visibilidad de columnas del Kanban
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['save_visibility'])) {
$new_visible_columns = $_POST['columns'] ?? [];
$json_columns = json_encode($new_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);
$visible_columns = $_POST['visible_columns'] ?? [];
$json_visible_columns = json_encode($visible_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()) {
echo "<div class='alert alert-success'>Configuración de visibilidad guardada.</div>";
$visible_columns = $new_visible_columns; // Actualizar para mostrar el cambio inmediatamente
$_SESSION['success_message'] = 'Visibilidad de columnas actualizada.';
} 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";
$stmt_all_db_columns = $conn->query($all_db_columns_query);
// --- Carga de Datos para la Vista ---
// 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);
// --- 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">
<!-- 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) -->
<div class="card mb-5">
<div class="card-header">
<h3>Gestionar Columnas del Kanban</h3>
</div>
<div class="card-body">
<p>Aquí puedes añadir, editar y eliminar las columnas que se usarán en el tablero Kanban.</p>
<a href="add_column.php" class="btn btn-success mb-3">
<i class="fas fa-plus"></i> Añadir Nueva Columna
</a>
<table class="table table-bordered table-striped">
<thead class="table-dark">
<tr>
<th>Nombre de la Columna</th>
<th style="width: 150px;">Acciones</th>
</tr>
</thead>
<tbody>
<?php if (empty($management_columns)): ?>
<!-- Formulario para añadir nueva columna -->
<div class="card mb-4">
<div class="card-header">
<h6>Añadir Nueva Columna</h6>
</div>
<div class="card-body">
<form action="add_column.php" method="post">
<div class="form-group">
<label for="nombre">Nombre de la Columna</label>
<input type="text" name="nombre" id="nombre" class="form-control" required>
</div>
<button type="submit" class="btn btn-success mt-3">Añadir Columna</button>
</form>
</div>
</div>
<!-- Tabla de columnas existentes -->
<h6>Columnas Actuales</h6>
<div class="table-responsive">
<table class="table table-bordered table-striped">
<thead>
<tr>
<td colspan="2" class="text-center">No hay columnas definidas.</td>
<th>Orden</th>
<th>Nombre</th>
<th>Acciones</th>
</tr>
<?php else: ?>
<?php foreach ($management_columns as $column): ?>
<tr>
<td><?php echo htmlspecialchars($column['nombre']); ?></td>
<td>
<a href="edit_column.php?id=<?php echo $column['id']; ?>" class="btn btn-primary btn-sm">
<i class="fas fa-edit"></i> Editar
</a>
<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?');">
<i class="fas fa-trash"></i> Eliminar
</a>
</td>
</tr>
<?php endforeach; ?>
<?php endif; ?>
</tbody>
</table>
</thead>
<tbody>
<?php if (empty($management_columns)): ?>
<tr><td colspan="3" class="text-center">No hay columnas definidas.</td></tr>
<?php else: ?>
<?php foreach ($management_columns as $col): ?>
<tr>
<td><?php echo htmlspecialchars($col['orden']); ?></td>
<td><?php echo htmlspecialchars($col['nombre']); ?></td>
<td>
<a href="edit_column.php?id=<?php echo $col['id']; ?>" class="btn btn-sm btn-info">Editar</a>
<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>
</td>
</tr>
<?php endforeach; ?>
<?php endif; ?>
</tbody>
</table>
</div>
</div>
</div>
<!-- Sección para Configurar Visibilidad de Columnas -->
<div class="card">
<div class="card-header">
<h3>Configurar Visibilidad de Columnas</h3>
<h3>Configurar Visibilidad de Columnas en Kanban</h3>
</div>
<div class="card-body">
<p>Selecciona las columnas que deseas que sean visibles en el tablero Kanban.</p>
<form method="POST">
<p>Selecciona las columnas que quieres que sean visibles en el tablero Kanban principal.</p>
<form action="configuracion.php" method="post">
<input type="hidden" name="save_visibility" value="1">
<div class="row">
<div class="form-group">
<?php foreach ($available_columns_for_visibility as $column_name): ?>
<div class="col-md-3">
<div class="form-check">
<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' : ''; ?>>
<label class="form-check-label" for="col_<?php echo htmlspecialchars($column_name); ?>">
<?php echo htmlspecialchars($column_name); ?>
</label>
</div>
<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); ?>"
<?php echo (in_array($column_name, $visible_columns)) ? 'checked' : ''; ?>>
<label class="form-check-label" for="check_<?php echo htmlspecialchars($column_name); ?>">
<?php echo htmlspecialchars($column_name); ?>
</label>
</div>
<?php endforeach; ?>
</div>
<button type="submit" class="btn btn-primary mt-3">Guardar Visibilidad</button>
</form>
</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 'db/config.php';
// Asegurarse de que el usuario sea administrador
if ($_SESSION['user_role'] !== 'Administrador' && $_SESSION['user_role'] !== 'admin') {
// 1. Validar rol de administrador
if (!isset($_SESSION['user_role']) || ($_SESSION['user_role'] !== 'Administrador' && $_SESSION['user_role'] !== 'admin')) {
echo "<div class='alert alert-danger'>Acceso denegado.</div>";
require_once 'layout_footer.php';
exit();
}
$message = '';
$column = null;
if (!isset($_GET['id']) || !is_numeric($_GET['id'])) {
// 2. Validar el ID de la columna
if (!isset($_GET['id']) || !filter_var($_GET['id'], FILTER_VALIDATE_INT)) {
header('Location: configuracion.php');
exit;
}
$column_id = $_GET['id'];
$message = '';
$column_name = '';
try {
$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') {
$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 = ?');
if ($stmt->execute([$nombre, $column_id])) {
$_SESSION['success_message'] = "Columna actualizada a '" . htmlspecialchars($nombre) . "'.";
if ($stmt->execute([$new_name, $column_id])) {
$_SESSION['success_message'] = "Columna actualizada correctamente.";
header('Location: configuracion.php');
exit;
} else {
$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) {
// Manejo de errores de la base de datos
$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="card">
<div class="card mx-auto" style="max-width: 500px;">
<div class="card-header">
<h2>Editar Columna del Kanban</h2>
<h3>Editar Columna</h3>
</div>
<div class="card-body">
<?php echo $message; ?>
<?php if ($column): ?>
<?php if ($column_name !== false): ?>
<form method="POST" action="edit_column.php?id=<?php echo $column_id; ?>">
<div class="mb-3">
<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>
<button type="submit" class="btn btn-primary">Actualizar Columna</button>
<a href="configuracion.php" class="btn btn-secondary">Cancelar</a>
<button type="submit" class="btn btn-primary">
<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>
<?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; ?>
</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
header('Location: info_producto.php');
header('Location: configuracion.php');
exit;
} catch (PDOException $e) {

View File

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

View File

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