«Call to undefined method Tools::jsonDecode()» al pasar a PS 8
Un compañero no podía actualizar con 1-Click Upgrade: el error apuntaba a override/classes/Hook.php, que usaba Tools::jsonDecode(), eliminada en PrestaShop 8. Aprendes a localizar qué módulo dejó ese override, cómo corregirlo y por qué los overrides son lo primero que hay que revisar antes de cualquier actualización.
Un compañero de la comunidad intentaba actualizar con el módulo 1-Click Upgrade y la actualización se paraba con este error:
[INTERNAL] /override/classes/Hook.php line 33 -
Error: Call to undefined method Tools::jsonDecode()La respuesta la encontró otro miembro del grupo en la documentación oficial: Tools::jsonDecode() ya no existe en PrestaShop 8. El fallo no estaba en la actualización sino en un override antiguo que seguía llamándola.
Por qué pasa
Un override sustituye una clase del núcleo por una versión tuya o de un módulo. Mientras la versión de PrestaShop no cambia, funciona. Al actualizar, el núcleo cambia por debajo y el override no: si usa funciones que se han eliminado, o si la función que sustituye ha cambiado de parámetros, la tienda se rompe.
En PrestaShop 8 se eliminaron varias funciones que llevaban años marcadas como obsoletas, entre ellas Tools::jsonDecode() y Tools::jsonEncode(). La lista completa está en la guía de cambios de PrestaShop 8.0. Se sustituyen por las funciones nativas de PHP:
// Antes (falla en PrestaShop 8)
$datos = Tools::jsonDecode($json, true);
$json = Tools::jsonEncode($datos);
// Ahora
$datos = json_decode($json, true);
$json = json_encode($datos);Cómo arreglarlo
- Localiza quién creó el override. Abre el fichero que señala el error. Cuando un módulo instala un override, PrestaShop deja comentarios con el nombre del módulo encima de cada método que añade.
- Actualiza ese módulo a una versión compatible con PrestaShop 8, si existe. Es lo correcto: el módulo reinstalará su override ya corregido.
- Si el módulo está abandonado, corrige el override a mano cambiando las llamadas como en el ejemplo, o desinstala el módulo si ya no lo usas.
- Borra la caché de clases:
var/cache/prod/class_index.phpy su equivalente endev. - Vuelve a lanzar la actualización.
El mismo problema con otra cara
En febrero de 2024 otra persona del grupo llegó con una tienda heredada que daba error en el carrito. Gustavo, de la comunidad, lo vio enseguida: un override en override/classes/Cart.php de un módulo de transporte. Casi seguro habían actualizado PrestaShop y no el módulo. El error decía que la función del override no coincidía con la del núcleo, que ahora tenía parámetros nuevos.
Su solución: o desactivar el módulo, o pedir que lo actualicen, o abrir el override, comparar la función con la de classes/Cart.php y añadirle los parámetros que indica el error. Lo segundo es lo limpio; lo tercero, lo rápido para salir del paso.
Antes de cualquier actualización
- Haz inventario de la carpeta
override: qué ficheros hay, qué módulo instaló cada uno y si ese módulo tiene versión para tu destino. - Prueba la tienda con los overrides desactivados. En Parámetros avanzados → Rendimiento hay una opción para desactivar todos los overrides. Si con ella la tienda funciona en la versión nueva, sabes que el problema está ahí.
- Actualiza primero en una copia, nunca en producción.
Si te has atascado con un override o con una actualización a medias, en Rekire lo resolvemos dentro de un bono de horas de soporte.
Esto salió en @PrestashopEsp, la mayor comunidad PrestaShop de España en Telegram. Ver la conversación