mcp tablas

This commit is contained in:
Jordan Diaz
2026-04-25 08:51:17 +00:00
parent 62239cb0a5
commit e84a36c83d
17 changed files with 535 additions and 497 deletions

View File

@@ -119,6 +119,56 @@ Do NOT modify web-base files — they are shared across all projects.
14. All CmsApi/Twig variables and field names should be extracted from the schemas in `cms/data/schema/<nombre_de_tabla>.ini.php` before use. Do not guess variable names or field types.
15. NEVER make up a field or table name. Always check the schema files in `cms/data/schema/` to confirm field names and types before using them.
## Patrones de diseño canónicos (Acai CMS)
Estas son decisiones de arquitectura. Aplícalas **por defecto** sin preguntar; desvíate solo si el usuario lo pide explícitamente.
### Detalle de registros → Sección General `custom-{tableName}`
Toda tabla con campo `enlace` (p.ej. `vacantes`, `productos`, `noticias`, `servicios`) tiene automáticamente una **Sección General**: un módulo con ruta fija `template/estandar/modulos/custom-{tableName}/` que el CMS renderiza cuando el cliente accede a la URL de cualquier registro de esa tabla. Accede a los datos del registro via `thisrecord.campo`.
**Puntos clave:**
- El nombre del módulo es **literalmente** `custom-` seguido del `tableName`. Ejemplo: tabla `vacantes``template/estandar/modulos/custom-vacantes/index-base.tpl`.
- El CMS lo enlaza automáticamente por convención de nombre. **NO existe ni se configura `_detailPage`.**
- Se crea/edita como cualquier otro módulo: `acai_write` sobre `index-base.tpl` dispara el compile.
- Dentro del Twig, el registro actual está en `thisrecord` (p.ej. `thisrecord.titulo`, `thisrecord.descripcion`, `thisrecord.imagen[0].urlPath`).
**Flujo correcto para una funcionalidad tipo "vacantes":**
1. **Crear la tabla** con `enlace=true` (`create_table`) y añadir los campos (`create_field`).
2. **Crear la sección general** `template/estandar/modulos/custom-{tableName}/index-base.tpl` con el Twig que renderiza `thisrecord.*`. Añade `style.css` y `script.js` si hace falta.
3. (Opcional) **Crear un módulo de listado** `template/estandar/modulos/{tableName}_listado/` que consulte los registros y enlace a cada `enlace`.
4. (Opcional) **Crear la página índice** `/{tableName}/` como registro normal en `apartados` (tipo Builder) y añadirle el módulo de listado.
**Reglas duras:**
- **NO** crees una página por registro en `apartados` (ni una página "detalle" genérica). El detalle ya lo resuelve la sección general.
- **NO** uses ni configures `_detailPage` — no existe.
- **NO** construyas URLs con query params (`?id=5`) ni hagas fetch desde JS para cargar el registro.
- **NO** uses hooks para cargar el registro — `thisrecord` ya está disponible.
- **NO** inventes otro nombre de módulo para el detalle: debe ser `custom-{tableName}` exacto.
Ver `docs/pages-and-records.md` y `docs/modular-system.md` para los detalles.
### Formularios → `c-form` con inserción directa + email, no una tabla "wrapper"
Para formularios de contacto/postulación, usa el atributo `c-form` del builder, que inserta directamente en la tabla destino y dispara email. No creas lógica custom de POST/hook si `c-form` cubre el caso. Solo crea una tabla propia (p.ej. `postulaciones`) si quieres gestionar esos registros desde el admin.
### Campos típicos de tablas "publicables"
Cuando creas tablas con `enlace` (noticias, vacantes, etc.), añade por defecto:
- `fecha_publicacion` (date) — para ordenar y filtrar
- `fecha_expiracion` (date, opcional) — oculta el registro automáticamente cuando caduca
- `visible` (checkbox) — control manual
No añadas campos "estado" calculados cuando ya tienes `visible` + fechas.
### Embeber formularios en detalle
Si un detalle necesita un formulario (postular, pedir info), embebe el módulo del formulario **dentro** de la Sección General del detalle pasándole el `num` del registro actual:
```twig
<form_postular :vacante_num="thisrecord.num"></form_postular>
```
No pongas el formulario como sección suelta del listado.
## MCP Tools
This project has MCP tools for managing modules, records, media, and more. **Before starting any task, consult the tools reference for the correct workflow.**