This commit is contained in:
lizandrogd
2026-01-13 00:11:44 -05:00
parent 6c95f0c277
commit 1abe5bba2d
8 changed files with 1811 additions and 73 deletions
+41 -16
View File
@@ -35,7 +35,19 @@ try {
$db->beginTransaction();
try {
// Verificar estructura de tabla antes de insertar
// Verificar si es actualización o creación
$isUpdate = isset($input['id']) && !empty($input['id']);
$menuId = $isUpdate ? intval($input['id']) : null;
if ($isUpdate) {
// Verificar que el menú existe
$existingMenu = $db->fetch("SELECT id FROM menus WHERE id = ?", [$menuId]);
if (!$existingMenu) {
throw new Exception('Menú no encontrado para actualizar');
}
}
// Verificar estructura de tabla antes de insertar/actualizar
$tableStructure = $db->fetchAll("DESCRIBE menus");
$availableColumns = array_column($tableStructure, 'Field');
@@ -44,13 +56,14 @@ try {
// Adaptar datos a la estructura real de la tabla
$menuData = [];
// Campos básicos que deberían existir
// La tabla usa 'name' para la clave del menú
if (in_array('name', $availableColumns)) {
$menuData['name'] = $input['menu_key'] ?? $input['name']; // Usar menu_key como name
$menuData['name'] = $input['menu_key'] ?? $input['name'] ?? 'menu_' . time();
}
// La tabla usa 'title' para el nombre visible del menú
if (in_array('title', $availableColumns)) {
$menuData['title'] = $input['name'] ?? 'Nuevo Menú'; // Usar name como title
$menuData['title'] = $input['name'] ?? $input['title'] ?? 'Nuevo Menú';
}
if (in_array('description', $availableColumns)) {
@@ -66,28 +79,37 @@ try {
}
if (in_array('is_active', $availableColumns)) {
$menuData['is_active'] = ($input['status'] === 'active') ? 1 : 0;
// Mapear status a is_active: 'active' -> 1, cualquier otra cosa -> 0
$menuData['is_active'] = (($input['status'] ?? 'active') === 'active') ? 1 : 0;
}
if (in_array('order_position', $availableColumns)) {
// Obtener próxima posición
if (in_array('order_position', $availableColumns) && !$isUpdate) {
// Solo establecer order_position para menús nuevos
$maxOrder = $db->fetch("SELECT COALESCE(MAX(order_position), 0) as max_order FROM menus");
$menuData['order_position'] = ($maxOrder['max_order'] ?? 0) + 1;
}
if (in_array('created_at', $availableColumns)) {
if (in_array('created_at', $availableColumns) && !$isUpdate) {
$menuData['created_at'] = date('Y-m-d H:i:s');
}
if (in_array('updated_at', $availableColumns)) {
$menuData['updated_at'] = date('Y-m-d H:i:s');
}
// Crear o actualizar menú
if ($isUpdate) {
$result = $db->update('menus', $menuData, 'id = :menu_id', ['menu_id' => $menuId]);
if (!$result || $result->rowCount() === 0) {
throw new Exception('No se pudo actualizar el menú');
}
} else {
$menuId = $db->insert('menus', $menuData);
if (!$menuId) {
throw new Exception('Error insertando menú');
}
}
// Procesar opciones si las hay
$optionsCount = 0;
@@ -113,19 +135,22 @@ try {
}
}
// Actualizar contador de opciones
$db->execute("UPDATE menus SET options_count = :count WHERE id = :id", [
'count' => $optionsCount,
'id' => $menuId
]);
// Actualizar contador de opciones solo si la columna existe
if (in_array('options_count', $availableColumns)) {
$db->execute("UPDATE menus SET options_count = :count WHERE id = :id", [
'count' => $optionsCount,
'id' => $menuId
]);
}
$db->commit();
echo json_encode([
'success' => true,
'message' => 'Menú guardado correctamente',
'message' => $isUpdate ? 'Menú actualizado correctamente' : 'Menú guardado correctamente',
'menu_id' => $menuId,
'options_created' => $optionsCount
'options_created' => $optionsCount,
'action' => $isUpdate ? 'updated' : 'created'
]);
} catch (Exception $e) {