` | Hex color |
## Atributos Acai
| Atributo | Uso | Ejemplo |
|----------|-----|---------|
| `c-if` | Condicional | `
` |
| `c-else` | Rama else | `
` |
| `c-for` | Loop array | `
` |
| `c-for` (tabla) | Loop BD | `` |
| `c-hidden` | Variable oculta | `` |
| `c-class` | Clase condicional | `
` |
| `c-required` | Required condicional | `c-required="'2' not in camposquitar"` |
| `c-form` | Formulario | `
` |
## Filtros Twig
| Filtro | Uso |
|--------|-----|
| `get` | `'tabla' \| get(where, order, limit)` |
| `queryDB` | `'SELECT ... FROM cms_tabla' \| queryDB()` |
| `hook` | `'hooks/module_id/' \| hook({params})` |
| `module` | `'module_id' \| module({params})` |
| `imagec` | `path \| imagec(width)` |
| `translate` | `'texto' \| translate` (tabla `textos_generales`) |
| `raw` | `variable \| raw` |
| `truncate` | `text \| truncate(100)` |
| `json_decode` | `'json_string' \| json_decode` |
| `default` | `variable \| default('fallback')` |
| `length`, `upper`, `lower`, `trim`, `replace`, `split`, `filter` | Estándar Twig |
## Formato de datos para insert/update
| Tipo | Formato | Ejemplo |
|------|---------|---------|
| `textfield` | String | `"Texto"` |
| `textbox` | String multilínea | `"Línea 1\nLínea 2"` |
| `date`/datetime | `YYYY-MM-DD HH:mm:ss` | `"2025-12-03 10:30:00"` |
| `wysiwyg` | HTML string | `"Texto
"` |
| `list` | String o número | `"activo"` o `"1"` |
| `checkbox` | Número 1/0 | `1` o `0` |
| `multitext` | String JSON | `"[{\"item\":\"valor\"}]"` |
| `upload` | NO enviar — usar `upload_record_image` después |
## Variables globales
| Variable | Descripción |
|----------|-------------|
| `section_id` | ID único por instancia del módulo |
| `interno` | `true` dentro del editor CMS |
| `server.HTTP_HOST` | Dominio actual (sin protocolo) |
| `loop.index` | Índice 1-based en `c-for`/`{% for %}` |
| `loop.index is odd` / `is even` | Layouts alternados |
| `thisrecord` | Registro actual (solo en secciones generales) |
## Decisión rápida — qué tool usar
| Intención | Tool / workflow |
|-----------|-----------------|
| Crear módulo nuevo | `acai-write` `index-base.tpl` → `add_module_to_record` → `set_module_config_vars` |
| Editar template de módulo | `acai-view` → `acai-line-replace` |
| Ver datos de un módulo en una página | `get_module_config_vars` |
| Cambiar valores de un módulo | `set_module_config_vars` |
| Subir imagen a un módulo | Usa `uploadFields` de `set_module_config_vars` → `upload_record_image` (`tableName: "builder_custom"`) |
| Crear tabla nueva | `create_table` (pregunta `enlace`/`seoMetas` antes) → `create_field` |
| Crear detalle de registro | Sección general en `template/estandar/modulos/custom-{tableName}/` |
| Editar header / footer | `get_layout_field` → `set_layout_field` (NUNCA edites los `.tpl` directamente) |
| Añadir librería global | `list_global_libraries` → `add_global_library` (`top` o `bottom`) |
| Hook que se ejecuta antes de cada página | `acai-write` el `.php` → `set_hook_middleware({ middleWare: ["allurls"] })` |
| Generar imagen IA | `generate_image` → `upload_record_image` con `uploadUrl`/`fullUrl` |
| Buscar archivos | `acai-glob` |
| Buscar texto en archivos | `acai-grep` |
| URL del proyecto | `get_web_url` (añade `?pruebas=1`) |
| Navegar el preview del usuario | `navigate_browser` |
| Token JWT expirado (403) | `refresh_acai_token` |
| Necesito un doc no cargado | `read_doc({ name: "..." })` |
| Listado de docs | `list_docs()` |
## Errores comunes a evitar
- Editar `index.tpl`, `index-twig.tpl` o `builder.json` (autogenerados).
- Editar `layout.json` o `custom-header-twig/*` directamente (usa `set_layout_field`).
- Usar el `sectionId` como `recordId` para subir imágenes (es el `num` de `builder_custom`).
- Usar el nombre de la variable como `fieldName` (es el campo de relations: `image1`, no `imagenes`).
- Crear página por registro en `apartados` para detalles (usa `custom-{tableName}/`).
- Cambiar `enlace` o `controlador` de un registro existente.
- Usar `localhost:8080` o dominios de producción (siempre `get_web_url` + `?pruebas=1`).
- Crear archivos JSON de i18n (usa `| translate` + tabla `textos_generales`).
- Usar Twig dentro de `script.js` o `style.css` (estáticos — pasa valores via `data-*`).
- Llamar `mkdir` (usa `acai-write` directamente — crea el directorio padre).