Scripts de upgrade — actualizaciones de modulos
Actualizado: 2024-12-01
Cuando publicas una nueva version de tu modulo, los scripts de upgrade se ejecutan automaticamente para migrar la base de datos y la configuracion de los usuarios que actualizan desde versiones anteriores. Sin ellos, los usuarios tendrian que desinstalar y reinstalar el modulo.
#El directorio upgrade/
Estructura del directorio upgrade/ en un modulo
bash
modules/mymodule/
├── upgrade/
│ ├── upgrade-1.1.0.php # Script que ejecuta la migracion a 1.1.0
│ ├── upgrade-1.2.0.php # Script que ejecuta la migracion a 1.2.0
│ ├── upgrade-2.0.0.php # Script que ejecuta la migracion a 2.0.0
│ └── index.php # Seguridad: <?php exit;
└── mymodule.php
# Cuando un usuario actualiza de 1.0.0 a 2.0.0,
# PrestaShop ejecuta en orden:
# upgrade-1.1.0.php, upgrade-1.2.0.php, upgrade-2.0.0.php
#Convencion de nombres
upgrade/upgrade-1.1.0.php — estructura del script
php
<?php
/**
* Script de upgrade a la version 1.1.0 de mymodule.
* Se ejecuta automaticamente cuando el modulo se actualiza desde < 1.1.0
*/
if (!defined('_PS_VERSION_')) { exit; }
/**
* La funcion DEBE llamarse upgrade_module_{version-con-guiones}
* Version 1.1.0 -> upgrade_module_1_1_0
* Version 2.0.0 -> upgrade_module_2_0_0
*/
function upgrade_module_1_1_0(Module $module): bool
{
$success = true;
// Tu logica de migracion aqui
// Si devuelve false, el upgrade se considera fallido
// y PrestaShop mostrara un error
return $success;
}
#Script de migracion de base de datos
upgrade/upgrade-1.2.0.php — ejemplo de migracion de DB
php
<?php
if (!defined('_PS_VERSION_')) { exit; }
function upgrade_module_1_2_0(Module $module): bool
{
$db = Db::getInstance();
$success = true;
// ── AÑADIR COLUMNA ──
if (!$db->execute(
'ALTER TABLE `' . _DB_PREFIX_ . 'mymodule_item`
ADD COLUMN `sort_order` INT(11) UNSIGNED NOT NULL DEFAULT 0
AFTER `description`'
)) {
$module->_errors[] = 'Error al añadir columna sort_order';
$success = false;
}
// ── CREAR TABLA NUEVA ──
if (!$db->execute(
'CREATE TABLE IF NOT EXISTS `' . _DB_PREFIX_ . 'mymodule_item_shop` (
`id_mymodule_item` int(11) UNSIGNED NOT NULL,
`id_shop` int(11) UNSIGNED NOT NULL,
PRIMARY KEY (`id_mymodule_item`, `id_shop`)
) ENGINE=' . _MYSQL_ENGINE_ . ' DEFAULT CHARSET=utf8mb4'
)) {
$module->_errors[] = 'Error al crear tabla mymodule_item_shop';
$success = false;
}
// ── MIGRAR DATOS EXISTENTES ──
if ($success) {
$items = $db->executeS('SELECT id_mymodule_item FROM `' . _DB_PREFIX_ . 'mymodule_item`');
$idShop = (int) Configuration::get('PS_SHOP_DEFAULT');
foreach ($items as $item) {
$db->insert('mymodule_item_shop', [
'id_mymodule_item' => (int) $item['id_mymodule_item'],
'id_shop' => $idShop,
]);
}
}
return $success;
}
#Actualizar Configuration en el upgrade
upgrade/upgrade-2.0.0.php — renombrar claves de Configuration
php
<?php
if (!defined('_PS_VERSION_')) { exit; }
function upgrade_module_2_0_0(Module $module): bool
{
// Migrar clave de configuracion antigua a nueva
$oldValue = Configuration::get('MYMODULE_OLD_API_KEY');
if ($oldValue !== false) {
Configuration::updateValue('MYMODULE_API_KEY', $oldValue);
Configuration::deleteByName('MYMODULE_OLD_API_KEY');
}
// Añadir nueva clave con valor por defecto
if (Configuration::get('MYMODULE_CACHE_TTL') === false) {
Configuration::updateValue('MYMODULE_CACHE_TTL', 3600);
}
// Registrar nuevo hook
if (!$module->registerHook('displayProductExtraContent')) {
$module->_errors[] = 'Error al registrar hook displayProductExtraContent';
return false;
}
return true;
}
Descargar en Markdown
Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.