一键导入
crear-extension
Crea extensiones de FacturaScripts para modificar modelos, controladores o vistas del core o de otros plugins sin modificar su código fuente.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Crea extensiones de FacturaScripts para modificar modelos, controladores o vistas del core o de otros plugins sin modificar su código fuente.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Crea un modelo de FacturaScripts con su clase PHP y archivo XML de tabla.
Configura la ruta de módulos MCP locales privados en ~/.fs-claude.json
Redacta en pantalla (sin crear ningún archivo) un texto en formato markdown, listo para copiar y pegar, que explica las novedades, mejoras y correcciones de un plugin o proyecto de FacturaScripts a partir de un rango de commits o de versiones. Activa esta skill siempre que el usuario pida "redacta las novedades", "escribe la noticia de los cambios", "genera el changelog", "qué ha cambiado desde la versión X", "resume los cambios entre la versión X y la Y", "prepara el anuncio de la nueva versión", o cualquier variación en la que se pida comunicar qué se ha hecho en un rango de commits o entre dos versiones.
Guía para añadir una nueva conexión de FacturaScripts al archivo de configuración
Sincroniza modelos del MCP fs-mcp con sus fuentes (FacturaScripts core o plugins privados). Detecta columnas nuevas/modificadas/eliminadas, mantiene las descripciones unificadas en los archivos de overrides, regenera la metadata y compila si hace falta. Soporta uno o varios modelos, ruta local o URL de GitHub, y un modo "refresh masivo" para auditar todos los modelos del catálogo y actualizar la versión registrada de FacturaScripts.
Responde preguntas sobre cómo usar FacturaScripts consultando la documentación oficial de usuarios a través del agente especializado `docs-expert`. ACTIVAR SIEMPRE que el usuario pregunte cómo hacer una operación, dónde encontrar una función, cómo fluye un proceso (presupuesto→factura), cómo gestionar clientes, inventario, compras, contabilidad, o cualquier aspecto práctico de uso del ERP. También activar cuando Claude necesite explorar la documentación de usuario antes de responder sobre procedimientos — no esperar a que el usuario pregunte explícitamente. No esperes a que mencione "documentación" — si la pregunta o tarea involucra procedimientos operativos en FacturaScripts, activa esta skill.
| name | crear-extension |
| description | Crea extensiones de FacturaScripts para modificar modelos, controladores o vistas del core o de otros plugins sin modificar su código fuente. |
Las extensiones permiten añadir funcionalidad a clases del core o de otros plugins sin modificar su código fuente.
Antes de crear los archivos a mano, considera usar la herramienta CLI:
fsmaker extension
fsmaker solicita el tipo de extensión (tabla, modelo, controlador, XMLView o vista Twig) y el nombre de la clase a extender, y genera el archivo base con la estructura correcta. Los apartados siguientes documentan la estructura completa para cuando necesites ajustar o completar la extensión manualmente.
Archivo: Plugins/MiPlugin/Extension/Model/NombreModelo.php
<?php
namespace FacturaScripts\Plugins\MiPlugin\Extension\Model;
use Closure;
class NombreModelo
{
// Se ejecuta ANTES de guardar el modelo
public function saveInsert(): Closure
{
return function () {
// $this es el modelo original
// Código a ejecutar antes de insertar
};
}
// Se ejecuta DESPUÉS de guardar
public function saveUpdate(): Closure
{
return function () {
// Código a ejecutar después de actualizar
};
}
// Se ejecuta al eliminar
public function delete(): Closure
{
return function () {
// Código a ejecutar al eliminar
};
}
// Se ejecuta en test() (validación)
public function test(): Closure
{
return function () {
// Añadir validaciones extra
// Retorna void, el pipe continúa
};
}
}
false, impide el borradofalse, impide el guardadofalse, lo impidefalse, lo impidefalse, lo impideArchivo: Plugins/MiPlugin/Extension/Controller/ListProducto.php
<?php
namespace FacturaScripts\Plugins\MiPlugin\Extension\Controller;
use Closure;
class ListProducto
{
public function createViews(): Closure
{
return function () {
// Añadir nueva pestaña al listado de productos
$this->addView('ListMiModelo', 'MiModelo', 'mi-modelo')
->addOrderBy(['name'], 'name')
->addSearchFields(['name']);
};
}
}
false, detiene el controladorArchivo: Plugins/MiPlugin/Extension/XMLView/EditProducto.xml
<?xml version="1.0" encoding="UTF-8"?>
<view>
<columns>
<group name="options" numcolumns="12" valign="bottom">
<column name="usado">
<widget type="checkbox" fieldname="usado" />
</column>
</group>
</columns>
</view>
Usar el atributo overwrite="true" en la columna que se desea modificar:
<?xml version="1.0" encoding="UTF-8"?>
<view>
<columns>
<group name="options" numcolumns="12" valign="bottom">
<column name="usado" overwrite="true">
<widget type="select" fieldname="usado" translate="true" required="true">
<values title="yes">1</values>
<values title="no">0</values>
</widget>
</column>
</group>
</columns>
</view>
Sin overwrite="true", la columna se añade de nuevo en lugar de reemplazar la existente.
Nota: Si la vista original ha sido modificada desde el botón de opciones, puede que no se muestre el campo añadido, ya que prevalecerá el estado guardado en la base de datos.
Los XMLView de extensión se fusionan automáticamente con el original.
Archivo: Plugins/MiPlugin/Extension/Table/productos.xml
<?xml version="1.0" encoding="UTF-8"?>
<table>
<column>
<name>mi_campo</name>
<type>character varying(100)</type>
</column>
</table>
Las extensiones de tabla también se fusionan automáticamente.
Permite añadir contenido en ubicaciones (hooks) definidas en plantillas Twig de otros plugins o del core, sin sobrescribir la plantilla original.
Para que una plantilla pueda ser extendida, debe llamar a getIncludeViews() en cada posición donde permita extensiones:
<html>
<head>
{% for includeView in getIncludeViews('MiPlantilla', 'head') %}
{% include includeView['path'] %}
{% endfor %}
</head>
<body>
{% for includeView in getIncludeViews('MiPlantilla', 'body') %}
{% include includeView['path'] %}
{% endfor %}
</body>
</html>
Los archivos se guardan en Extension/View/ con la nomenclatura obligatoria:
NOMBRE_PLANTILLA_UBICACION.html.twig (orden por defecto: 10)
NOMBRE_PLANTILLA_UBICACION_ORDEN.html.twig (orden personalizado)
Ejemplos:
Extension/View/MiPlantilla_head.html.twig → orden 10 (por defecto)Extension/View/MiPlantilla_head_05.html.twig → carga antes (orden 5)Extension/View/MiPlantilla_body_20.html.twig → carga después (orden 20)Si varios plugins extienden la misma ubicación, se ordenan numéricamente. Sin número se asume 10 y se ordenan alfabéticamente entre ellos.
Ejemplo de contenido del archivo de extensión:
{# Extension/View/MiPlantilla_head_05.html.twig #}
<meta name="description" content="Mi descripción"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
Las extensiones de vistas HTML se cargan automáticamente, no hace falta registrarlas en Init.php.
Las extensiones de PHP (modelos y controladores) deben cargarse en Init.php:
public function init(): void
{
// Extensiones de modelos
$this->loadExtension(new Extension\Model\Producto());
$this->loadExtension(new Extension\Model\Cliente());
// Extensiones de controladores
$this->loadExtension(new Extension\Controller\ListProducto());
$this->loadExtension(new Extension\Controller\EditProducto());
}
Init.phpCore/Base, Core/Model/Base ni Core/Lib/ExtendedControllerpipe()). Si la función que se quiere modificar no tiene pipe(), la única opción es usar herencia PHP convencionalreturn function() { ... }& en parámetros por referencia dentro del return function()Para consultar la documentación oficial completa sobre extensiones de modelos, controladores y vistas, invoca el agente docs-expert que te proporcionará detalles completos directamente desde la documentación oficial del framework.