Migración de plugins antiguos
No existe el código perfecto. Crear un framework con nuevas funciones que sea compatible hacia atrás por los siglos de los siglos es el santo grial de los informáticos. Hasta ahora, nadie lo ha conseguido, y cada cierto tiempo es necesario romper la compatibilidad con plugins antiguos, a veces poco y otras, mucho.
🧰 fsmaker
Tenemos una herramienta en línea de comandos para simplificar el desarrollo de plugins y, entre las muchas opciones que tiene, está la opción upgrade, para hacer automáticamente los cambios necesarios para adaptar el plugin a la última versión de FacturaScripts:
⚙️ Cambios en la v2025
- El requisito mínimo es ahora PHP 8.0.
- 📌 Todos los plugins que tengan min_version < 2025 se consideran incompatibles.
- Los modelos deben heredar ahora de
Core/Template/**ModelClass**y usarCore/Template/**ModelTrait**(en lugar de los archivos deCore/Model/Base). - Los modelos que antes heredaban de ModelOnChangeClass deben heredar ahora de
Core/Template/**ModelClass**(no pierden funciones, los nuevos modelos ya incorporan esos cambios). Cambia las menciones de$this->previousData[KEY]por$this->getOriginal(KEY). - El método clear() de los modelos debe terminar en void.
- El método all() de los modelos ya no tiene el límite de 50 elementos por defecto.
- Se ha reemplazado la clase Request de Symfony por una propia y compatible. Conoce nuestra nueva clase Request.
- También hemos reemplazado la clase Response de Symfony por otra propia y compatible. Consulta la nueva clase Response.
- En los listados se reemplazó
codeporcodespara los checkbox. Además, ahora hay que usar$this->request->request->getArray('codes')para obtener el array.
⚙️ Cambios en la v2024
- El requisito mínimo es ahora PHP 7.4.
- La clase CronClass se encuentra ahora en
Core/Templatey ha sido rediseñada para facilitar la creación de tareas programadas. - La clase InitClass también se ha movido a
Core/Template. Revisa la documentación del Init.php.
⚙️ Cambios en la v2023
- El requisito mínimo es ahora PHP 7.3.
- La clase
Core/Base/**Cache**ha sido reemplazada por Core/Cache. - La función
getClientIp()de la clase IpFilter ha sido reemplazada por la misma función enCore/Session. - La clase
Core/App/**WebRender**ha sido reemplazada porCore/Html. - La clase
Core/Base/**PluginManager**ha sido reemplazada por Core/Plugins. - La clase
Core/Base/**DownloadTools**ha sido reemplazada por Core/Http. - La clase
Core/App/**AppSettings**ha sido reemplazada por Core/Tools. - La clase
Core/Base/**ToolBox**ha sido reemplazada porCore/**Tools**. - Las llamadas a
i18n.trans()en las plantillas HTML han sido reemplazadas portrans(). - Las llamadas a
appSettings.get()en las plantillas HTML han sido reemplazadas porsettings(). - Las llamadas a
fsc.toolBox().coins().format()en las plantillas HTML han sido reemplazadas pormoney(). - Las llamadas a
fsc.toolBox().numbers().format()en las plantillas HTML han sido reemplazadas pornumber().
⚙️ Cambios en la v2022
La versión 2022 requiere como mínimo PHP 7.2. Además, se puede requerir una versión superior de PHP desde el archivo facturascripts.ini del plugin. También se han abandonado los gidview y se han rediseñado los formularios de albaranes, facturas, pedidos, presupuestos y asientos.
📌 Min version >= 2020
Todos los plugins que tengan en su archivo facturascripts.ini un min_version menor que 2020 se consideran incompatibles con la versión 2022.
📌 Forzado del tipo de retorno en muchas funciones
Para reducir los errores de programación y facilitar las herramientas de análisis de código, se han forzado los tipos de retorno de muchas funciones. Por ejemplo, la función getPageData() de los controladores debe forzar el tipo de retorno array:

La diferencia está en que getPageData(): array indica a PHP que lo que devuelve la función debe ser un array o, de lo contrario, debe detener la ejecución. Lo mismo aplica para la función getModelClassName() de los EditController, que debe forzar el retorno de string:
<?php
namespace FacturaScripts\Core\Controller;
class EditFabricante extends \FacturaScripts\Core\Lib\ExtendedController\EditController
{
public function getModelClassName(): string
{
return 'Fabricante';
}
}
En los modelos, se debe forzar el tipo de retorno de las siguientes funciones (si las tiene el modelo):
- delete(): bool
- install(): string
- loadFromCode($code, array $where = [], array $order = []): bool
- primaryColumn(): string
- primaryDescriptionColumn(): string
- tableName(): string
- test(): bool
- save(): bool
- saveInsert(array $values = []): bool
- saveUpdate(array $values = []): bool
- url(string $type = 'auto', string $list = 'List'): string
🔄 Calculator sustituye a BusinessDocTool
Se ha reemplazado la clase BusinessDocTool para calcular los totales de facturas, albaranes, pedidos y presupuestos:
$tools = new BusinessDocumentTools();
$tools->recalculate($albaran);
Ahora se debe usar la nueva clase Calculator:
$lines = $albaran->getLines();
Calculator::calculate($albaran, $lines, true);
⚙️ Cambios en la v2020
Los modelos de más de una tabla, conocidos como ModelView, se renombraron a JoinModel.
⚙️ Cambios en la v2018
La versión 2018 es un rediseño completo, por lo que no tiene compatibilidad con la versión 2017 o anteriores. Hemos renombrado las carpetas existentes y añadido algunas nuevas. La nueva estructura queda así:
- Controller: anteriormente llamada controller. Contiene todos los controladores del plugin.
- Model: anteriormente llamada model. Contiene todos los modelos del plugin.
- Table: anteriormente llamada model/table. Contiene los archivos XML con la estructura de cada tabla usada por los modelos del plugin.
- View: anteriormente llamada view. Contiene las vistas HTML usadas por el plugin.