Autosave: 20260205-060056
This commit is contained in:
parent
7917ea5f98
commit
306385f2ae
@ -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'; ?>
|
||||
@ -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'; ?>
|
||||
@ -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) {
|
||||
|
||||
@ -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;
|
||||
?>
|
||||
?>
|
||||
|
||||
@ -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;
|
||||
?>
|
||||
?>
|
||||
Loading…
x
Reference in New Issue
Block a user