--- title: "Glosario de Acai CMS" tags: [glossary, terms, planner] load_priority: 85 load_when: [glossary, planner_only] summary: "Definiciones cortas de términos clave de Acai CMS: sectionId, recordNum, apartados, builder_custom, custom-{tableName}, enlace, controlador, thisrecord, multiv2, c-form, hook middleware, JWT acai_token, web-base, template/estandar/, Builder vs Standard." --- # Glosario Acai CMS Definiciones cortas de los términos que aparecen en docs y prompts. Si te pierdes con un concepto, lo encuentras aquí en una línea. ## Estructura del proyecto **`template/estandar/`** — directorio donde viven los archivos custom del proyecto: módulos, CSS/JS globales, imágenes del template. Lo que el desarrollador edita. **`web-base`** — código compartido del CMS (motor de render, admin, APIs). Vive aparte y se monta como volumen Docker. **No tocar**. **`apartados`** — tabla principal de páginas del sitio. Cada registro es una página. Tiene `enlace`, `controlador`, jerarquía padre-hijo (`parentNum`). **`hooks/`** — directorio de hooks PHP globales. Convención: `hooks/hooks..php` → endpoint `/hooks//`. ## Páginas y registros **Builder vs Standard** — modos de renderizado de una página. Lo decide el campo `controlador` del registro: - **Builder**: `controlador.php` → contenido modular (módulos drag-drop). - **Standard**: `controlador_tabla.php` → contenido en campos del registro (`content` HTML). **`enlace`** — URL pública de un registro (con barras incluidas, ej. `/servicios/`). NUNCA modificar a posteriori (rompe SEO y enlaces internos). **`controlador`** — campo que define Builder vs Standard. NUNCA modificar a posteriori. **`recordNum` / `num`** — Primary key. Acai siempre usa `num` (entero), nunca `id`. **`_num`** — convención de foreign keys. `categoria_num` apunta al `num` de la tabla `categorias`. ## Módulos y secciones **Módulo** — componente visual reutilizable. Vive en `template/estandar/modulos//`. Se coloca en páginas Builder vía drag-drop. Archivos: `index-base.tpl` (source), `style.css`, `script.js`, `hook.php` (opcional). El compilador genera `index.tpl`, `index-twig.tpl`, `builder.json`. **Sección general** — módulo especial que el CMS enlaza por convención de nombre. Renderiza el detalle de un registro de una tabla con `enlace`. Convención: `template/estandar/modulos/custom-{tableName}/`. Recibe el registro como `thisrecord`. **`custom-{tableName}`** — convención de nombre de la sección general. NO usar `_detailPage`, NO crear página por registro en `apartados`. **`thisrecord`** — variable Twig disponible en secciones generales con el registro actual. Acceso a campos: `thisrecord.titulo`, `thisrecord.imagen[0].urlPath`, `thisrecord.categoria_num`. **`builder_custom`** — tabla interna de Acai donde el CMS guarda los valores de los módulos. Cuando el usuario rellena un módulo en una página Builder, los valores se persisten ahí. El `recordNum` para `upload_record_image` cuando subes a un módulo es el `num` de la fila correspondiente en `builder_custom`. **`sectionId`** — identificador único de una instancia de módulo en una página Builder. Lo devuelve `add_module_to_record`. **No es** el `recordNum` para uploads (eso es `num` de `builder_custom`). **`multiv2`** — tipo de campo del builder que permite arrays de objetos repetidos (ej. lista de servicios con título + descripción + icono cada uno). Se itera con `c-for`. ## Layout global **`layout.json`** — fichero (`cms/lib/plugins/builder_saas/layout.json`) con el header, footer, librerías globales, javascript/style globales, y los hooks registrados. **NUNCA editar a mano** — usar `set_layout_field` o las tools de hooks/librerías. **Hook middleware** — un hook global puede configurarse para auto-ejecutarse antes de renderizar páginas: vacío (solo on-demand), `["allurls"]` (todas las páginas) o `["cms_
-", ...]` (páginas específicas). Se configura con `set_hook_middleware`. **Auto-registro de hooks** — cuando creas/borras un fichero `hooks/hooks..php` con `acai-write`/`acai-delete`, el backend sincroniza automáticamente la entrada en `layout.json["hooks"]`. NO tocar `layout.json` a mano. ## Builder UI **`c-form`** — atributo que convierte un `
` en un formulario que persiste a una tabla del CMS. Sintaxis: ``. Se renderiza como form HTML con submit a un endpoint Acai. **`data-field-*`** — familia de atributos que marca un elemento como editable en el builder visual. Tipos: `textfield`, `headfield`, `textbox`, `wysiwyg`, `link`, `upload`, `uploadMulti`, `list`, `multiv2`, `checkbox`, `colorpicker`. **`c-if`, `c-for`, `c-class`, `c-hidden`, `c-required`** — atributos de lógica visual. **`c-if` usa un solo `=`** (`c-if="x = 1"`), Twig `{% if %}` usa **doble** `==`. ## Datos / API **CmsApi (alias `CocoDB`)** — librería PHP server-side para CRUD sobre las tablas del CMS. Métodos: `CmsApi::get(opts)`, `::insert(table, data)`, `::update(table, where, data)`, `::delete(table, where)`. Soporta `uploads`, `relations`, `translates`, `groupBy`, `aggregates` como opciones. **JWT `acai_token`** — token de auth del proyecto que vive en `.acai`. Caduca y se renueva con `refresh_acai_token` cuando da error 403. **`X-MCP-Secret`** — token de auth para clientes MCP externos (Claude Code, extensión VS Code). Vive en Redis. Es user-wide (autoriza todos los proyectos del usuario). ## Filtros Twig clave **`| get`** — query a una tabla del CMS. `'productos' | get('activo=1', 'orden ASC', 10)`. **`| queryDB`** — SQL crudo (con `cms_` prefix). `'SELECT * FROM cms_productos WHERE...' | queryDB()`. **`| hook`** — invoca un hook PHP desde Twig. `'hooks/calcular/' | hook({precio: 100})`. **`| imagec`** — optimiza una imagen al ancho dado. `imagen[0].urlPath | imagec(800)`. **`| translate`** — traduce vía tabla `textos_generales`. `'texto a traducir' | translate`.