diff --git a/cms/lib/classes/AcaiAPI.php b/cms/lib/classes/AcaiAPI.php index 722bbeb..8cd0688 100644 --- a/cms/lib/classes/AcaiAPI.php +++ b/cms/lib/classes/AcaiAPI.php @@ -1018,7 +1018,11 @@ class AcaiAPI foreach ($pools as &$pool) { $ids = array_keys($pool['ids']); if (!$ids) continue; - $related = self::get($pool['table'], $pool['valueField'] . ' IN (' . implode(',', $ids) . ')', null, null, [ + // Los ids salen del valor guardado del campo `list` (mediumtext), asi + // que se escapan antes de interpolarlos: sin esto es una inyeccion SQL + // de segundo orden. Alineado con core_client. + $ids = array_map(function ($id) { return mysql_real_escape_string((string) $id); }, $ids); + $related = self::get($pool['table'], $pool['valueField'] . " IN ('" . implode("','", $ids) . "')", null, null, [ 'relationsDepth' => $subDepth, 'translates' => $options['translates'], 'uploads' => $options['uploads'], @@ -1381,8 +1385,14 @@ class AcaiAPI // traducciones, aux_*...) no tienen columnas de auditoria y el // INSERT/UPDATE reventaria con "Unknown column". Misma semantica que // CocoDB legacy (prepareBaseSQL solo aƱadia estos campos con schema). - if (!$ignoreSchema) { + // El caller manda si trae el valor; si no, se genera. Aplica a INSERT y a + // UPDATE: un update sin updatedDate explicita tiene que sellar la fecha. + // (El bucle de campos de abajo escribe el valor del caller cuando viene, + // asi que el guard evita ponerlo dos veces en el SET.) + if (!$ignoreSchema && !isset($record['updatedDate'])) { $setParts[] = '`updatedDate` = ?'; $params[] = $now; + } + if (!$ignoreSchema && !isset($record['updatedByUserNum'])) { $setParts[] = '`updatedByUserNum` = ?'; $params[] = $user; } @@ -1456,6 +1466,23 @@ class AcaiAPI $value = self::coerceValue($value, $schemaField); } + // Un campo `date` NUNCA acepta cadena vacia: MySQL la rechaza con + // "Incorrect datetime value" tanto si la columna es NOT NULL como si + // es nullable. El Admin clasico ya lo resuelve poniendo la fecha + // actual cuando el campo no viene (menus/default/save.php:287, + // "default date fields to current date"), pero AcaiAPI nunca replico + // esa regla: por eso un alta con la fecha vacia moria con un 400 + // "Error al insertar" sin ningun detalle, y bastaba UN campo fecha + // para que dejara de entrar cualquier registro en la tabla. + // - INSERT: mismo comportamiento que el Admin -> fecha actual. + // - UPDATE: se omite la columna, para no pisar con "hoy" un valor + // ya guardado solo porque el caller mando la clave vacia. + if ($schemaField && isset($schemaField['type']) && $schemaField['type'] === 'date' + && ($value === null || (is_string($value) && trim($value) === ''))) { + if (!$isInsert) continue; + $value = $now; + } + if ($value === null) continue; if (is_array($value)) $value = json_encode($value);