一键导入
crear-controlador
Crea controladores de FacturaScripts (Controller con vista Twig, ListController, EditController o PanelController) con su vista asociada.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Crea controladores de FacturaScripts (Controller con vista Twig, ListController, EditController o PanelController) con su vista asociada.
用 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-controlador |
| description | Crea controladores de FacturaScripts (Controller con vista Twig, ListController, EditController o PanelController) con su vista asociada. |
Cuando el usuario pida crear un controlador, determina el tipo adecuado y genera el código.
Antes de crear los archivos a mano, considera usar la herramienta CLI:
fsmaker controller
fsmaker solicita el nombre del controlador, el tipo (ListController, EditController, etc.) y genera el PHP y el XMLView asociado. Los apartados siguientes documentan la estructura completa para cuando necesites crearlos o ajustarlos manualmente.
| Tipo | Uso | Nombre convención |
|---|---|---|
Controller | Página personalizada con vista HTML Twig libre | NombreLibre |
ListController | Listado de registros con filtros | ListNombreModelo |
EditController | Formulario de edición de un registro | EditNombreModelo |
PanelController | Combinación de vistas (cabecera + pestañas) | EditNombreModelo |
Usar cuando se necesita una página completamente personalizada con una plantilla .html.twig en lugar de un XMLView. Ideal para dashboards, páginas de configuración visual, formularios custom, etc.
Archivo PHP: Plugins/MiPlugin/Controller/MiPagina.php
<?php
namespace FacturaScripts\Plugins\MiPlugin\Controller;
use FacturaScripts\Core\Template\Controller;
class MiPagina extends Controller
{
// Propiedades públicas accesibles desde la vista con {{ fsc.miPropiedad }}
public string $miVariable = '';
public function getPageData(): array
{
$data = parent::getPageData();
$data['title'] = 'mi-pagina'; // clave de traducción
$data['menu'] = 'admin'; // ventas, purchases, accounting, admin...
$data['icon'] = 'fas fa-home';
// $data['showonmenu'] = false; // descomentar para ocultar del menú
return $data;
}
public function run(): void
{
parent::run();
// Leer parámetros de URL o formulario
$id = $this->request->query('id');
$valor = $this->request->input('campo');
// Asignar datos que la vista usará como {{ fsc.miVariable }}
$this->miVariable = 'Hola mundo';
// Seleccionar la plantilla (por defecto usa el nombre de la clase)
$this->setTemplate('MiPagina'); // carga View/MiPagina.html.twig
}
}
Vista Twig: Plugins/MiPlugin/View/MiPagina.html.twig
{% extends "Master/MenuTemplate.html.twig" %}
{# Usar "Master/MicroTemplate.html.twig" si no se quiere el menú superior #}
{% block body %}
{{ parent() }}
<div class="container-fluid">
<div class="row">
<div class="col">
<h1>{{ trans('mi-pagina') }}</h1>
{# Acceder a propiedades públicas del controlador #}
<p>{{ fsc.miVariable }}</p>
{# URL del controlador actual #}
<p>URL: {{ fsc.url() }}</p>
{# Formulario con token de seguridad #}
<form method="post" action="{{ fsc.url() }}">
{{ formToken() }}
<input type="text" name="campo" class="form-control">
<button type="submit" class="btn btn-primary">
{{ trans('save') }}
</button>
</form>
</div>
</div>
</div>
{% endblock %}
{% block css %}
{{ parent() }}
{# CSS adicional aquí #}
{% endblock %}
{% block javascripts %}
{{ parent() }}
{# JavaScript adicional aquí #}
{% endblock %}
View/ (no en XMLView/) y tiene extensión .html.twig.setTemplate('NombreVista') carga View/NombreVista.html.twig.public del controlador son accesibles en Twig como {{ fsc.propiedad }}.{{ formToken() }} en formularios POST para seguridad CSRF.$this->redirect('OtroControlador');$this->setTemplate('false');Archivo: Plugins/MiPlugin/Controller/ListNombreModelo.php
<?php
namespace FacturaScripts\Plugins\MiPlugin\Controller;
use FacturaScripts\Core\Lib\ExtendedController\ListController;
class ListNombreModelo extends ListController
{
public function getPageData(): array
{
$page = parent::getPageData();
$page['title'] = 'nombre-modelo'; // clave de traducción
$page['menu'] = 'sales'; // ventas, purchases, accounting, admin
$page['icon'] = 'fas fa-list';
return $page;
}
protected function createViews()
{
$this->createViewsNombreModelo();
}
protected function createViewsNombreModelo(string $viewName = 'ListNombreModelo'): void
{
$this->addView($viewName, 'NombreModelo', 'nombre-modelo', 'fas fa-list')
->addOrderBy(['name'], 'name')
->addOrderBy(['creation_date'], 'date', 2)
->addSearchFields(['name']);
}
}
XMLView: Plugins/MiPlugin/XMLView/ListNombreModelo.xml
<?xml version="1.0" encoding="UTF-8"?>
<view>
<columns>
<column name="name" order="100">
<widget type="text" fieldname="name" />
</column>
<column name="creation-date" order="200">
<widget type="date" fieldname="creation_date" />
</column>
<column name="active" display="center" order="300">
<widget type="checkbox" fieldname="active" />
</column>
</columns>
</view>
Archivo: Plugins/MiPlugin/Controller/EditNombreModelo.php
<?php
namespace FacturaScripts\Plugins\MiPlugin\Controller;
use FacturaScripts\Core\Lib\ExtendedController\EditController;
class EditNombreModelo extends EditController
{
public function getModelClassName(): string
{
return 'NombreModelo';
}
public function getPageData(): array
{
$page = parent::getPageData();
$page['title'] = 'nombre-modelo';
$page['menu'] = 'sales';
$page['icon'] = 'fas fa-edit';
$page['showonmenu'] = false; // No mostrar en el menú principal
return $page;
}
}
XMLView: Plugins/MiPlugin/XMLView/EditNombreModelo.xml
<?xml version="1.0" encoding="UTF-8"?>
<view>
<columns>
<group name="data" numcolumns="8">
<column name="name" numcolumns="8" order="100">
<widget type="text" fieldname="name" required="true" />
</column>
<column name="creation-date" numcolumns="4" order="200">
<widget type="date" fieldname="creation_date" />
</column>
</group>
<group name="options" numcolumns="4">
<column name="active" order="100">
<widget type="checkbox" fieldname="active" />
</column>
</group>
</columns>
</view>
Divide la pantalla en zona de navegación (izquierda) y zona de contenido (derecha) con múltiples pestañas. Admite vistas de tipo EditView, ListView, EditListView y HtmlView.
Archivo: Plugins/MiPlugin/Controller/EditNombreModelo.php
<?php
namespace FacturaScripts\Plugins\MiPlugin\Controller;
use FacturaScripts\Core\Where;
use FacturaScripts\Core\Lib\ExtendedController\PanelController;
class EditNombreModelo extends PanelController
{
public function getPageData(): array
{
$page = parent::getPageData();
$page['title'] = 'nombre-modelo';
$page['menu'] = 'sales';
$page['icon'] = 'fas fa-edit';
$page['showonmenu'] = false;
return $page;
}
protected function createViews(): void
{
// Primera pestaña: formulario de edición del modelo principal (cabecera)
$this->addEditView('EditNombreModelo', 'NombreModelo', 'nombre-modelo', 'fas fa-edit');
// Segunda pestaña: listado de registros relacionados
$this->addListView('ListOtroModelo', 'OtroModelo', 'otro-modelo', 'fas fa-list');
// Opcional: posición de las pestañas
// $this->setTabsPosition('bottom'); // left | top | bottom | left-bottom
}
protected function loadData($viewName, $view): void
{
switch ($viewName) {
case 'EditNombreModelo':
$code = $this->request->query('code');
$view->loadData($code);
break;
case 'ListOtroModelo':
// Filtrar los registros relacionados por la PK del modelo principal
$where = [Where::eq('id_nombre_modelo', $this->getModel()->id())];
$view->loadData('', $where);
break;
}
}
}
XMLView cabecera: Plugins/MiPlugin/XMLView/EditNombreModelo.xml
<?xml version="1.0" encoding="UTF-8"?>
<view>
<columns>
<group name="data" numcolumns="8">
<column name="name" numcolumns="8" order="100">
<widget type="text" fieldname="name" required="true" />
</column>
<column name="creation-date" numcolumns="4" order="200">
<widget type="date" fieldname="creation_date" />
</column>
</group>
<group name="options" numcolumns="4">
<column name="active" order="100">
<widget type="checkbox" fieldname="active" />
</column>
</group>
</columns>
</view>
XMLView pestaña relacionada: Plugins/MiPlugin/XMLView/ListOtroModelo.xml
<?xml version="1.0" encoding="UTF-8"?>
<view>
<columns>
<column name="name" order="100">
<widget type="text" fieldname="name" />
</column>
<column name="creation-date" order="200">
<widget type="date" fieldname="creation_date" />
</column>
</columns>
</view>
$this->hasData = true; dentro de loadData().addEditView(), addListView(), addEditListView(), addHtmlView().'ListOtroModelo-1', 'ListOtroModelo-2'.sales — Ventaspurchases — Comprasaccounting — Contabilidadwarehouse — Almacénadmin — Administrador// En createViewsNombreModelo():
->addFilterCheckbox($viewName, 'active', 'active')
->addFilterDatePicker($viewName, 'creation_date', 'date')
->addFilterSelect($viewName, 'estado', 'state', 'estados', 'nombre')
->addFilterPeriod($viewName, 'creation_date', 'period')
Para consultar la documentación oficial completa sobre controladores y vistas HTML, invoca el agente docs-expert que te proporcionará detalles completos directamente desde la documentación oficial del framework.