Refine hooks distinction, add assets/, rename twig-filters

- Clarify module hook vs file hook: when to use each, different call URLs
- Add schema path (cms/data/schema/) to reglas importantes
- Add assets/ and hook.php to module file structure
- Fix variable assignment example: use string syntax for get()
- Rename twig-filters.md → twig-reference.md (covers more than filters)
- Move Global Variables from modular-system.md to twig-reference.md
- Update all references in CLAUDE.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-26 11:42:15 +00:00
parent 39661ad0da
commit ed35d4e313
4 changed files with 52 additions and 24 deletions

View File

@@ -56,34 +56,51 @@ El `.htaccess` de Acai añade `tipo=barra` a cada request. Si envías `tipo` com
**Usar nombres alternativos:** `account_type`, `user_tipo`, `record_tipo`, etc.
#### Módulos fantasma interceptan hooks
Si `save_module` crea un directorio `modulos/auth_signup/hook.php`, este intercepta la URL `/hooks/auth_signup/` porque `addModulesHooksToLayout()` se ejecuta ANTES que `addFilesHooksToLayout()`.
#### Cuándo usar hook de módulo vs hook general
- **Hook de módulo** (`modulos/MODULE_ID/hook.php`): cuando el hook solo lo usa ese módulo. Ej: un módulo `calculadora` con su propio `hook.php`.
- **Hook general** (`hooks/hooks.{nombre}.php`): cuando la lógica se usa desde varias partes del sitio (login, carrito, etc.).
**Regla:** Nunca crear un directorio en `modulos/` solo para tener un hook. Para lógica server-side, usar siempre hooks generales en `hooks/hooks.{nombre}.php`. Si aparecen módulos fantasma por accidente, borrar el directorio.
Nunca crear un directorio en `modulos/` **solo** para tener un hook sin módulo visual. Si `save_module` crea un módulo fantasma (ej: `modulos/auth_signup/`), este intercepta `/hooks/auth_signup/` porque `addModulesHooksToLayout()` se ejecuta ANTES que `addFilesHooksToLayout()`. Si aparecen fantasmas, borrar el directorio.
### Cómo Llamar Hooks
**Desde HTML (recomendado para módulos):**
La URL del endpoint depende del tipo de hook:
- **Hook de módulo:** `/modulos/MODULE_ID/hook.php` (se llama con el path del módulo)
- **Hook general:** `/hooks/nombre/`
#### Desde HTML (recomendado para módulos)
```html
<hook result="myVar" endpoint="/hooks/module_id/" :param1="value1" :param2="'string'"></hook>
<!-- Hook de módulo -->
<hook result="myVar" endpoint="/modulos/calculadora/hook.php" :param1="value1"></hook>
<!-- Hook general -->
<hook result="myVar" endpoint="/hooks/auth_login/" :param1="value1"></hook>
<p>{{ myVar.message }}</p>
```
**Desde Twig:**
#### Desde Twig
```twig
{% set resultado = 'hooks/mimodulo/' | hook({param1: 100, param2: 'texto'}) %}
<p>{{ resultado.message }}</p>
{# Hook de módulo #}
{% set resultado = 'modulos/calculadora/hook.php' | hook({param1: 100}) %}
{# Hook general #}
{% set resultado = 'hooks/auth_login/' | hook({param1: 100}) %}
```
**Desde JavaScript:** (ver [CmsApi JS](#cmsapi-javascript--client-side) para callback + Promise)
#### Desde JavaScript
(ver [CmsApi JS](#cmsapi-javascript--client-side) para callback + Promise)
```js
CmsApi.hook('/hooks/mimodulo/', {param1: 100, param2: 'texto'}).then(res => console.log(res));
// Hook de módulo
CmsApi.hook('/modulos/calculadora/hook.php', {param1: 100}).then(res => console.log(res));
// Hook general
CmsApi.hook('/hooks/auth_login/', {param1: 100}).then(res => console.log(res));
```
**Desde otro Hook PHP:**
#### Desde otro Hook PHP
```php
<?php
$result = hook("/hooks/mimodulo/", ["param1" => 100, "param2" => "texto"]);
$result = hook("/hooks/auth_login/", ["param1" => 100]);
$mensaje = $result["message"];
?>
```
@@ -188,7 +205,7 @@ CmsApi::delete('productos',
- Nombres de tabla **sin** prefijo `cms_`
- Primary key siempre es `num`, nunca `id`
- Foreign keys: consultar siempre el schema (ver [Gotchas de BD](#gotchas-de-base-de-datos))
- Foreign keys: consultar siempre el schema en `cms/data/schema/` (ver [Gotchas de BD](#gotchas-de-base-de-datos))
- Upload fields: no se manejan via insert/update
- Operadores: `=`, `!=`, `>`, `>=`, `<`, `<=`, `LIKE`, `IN`
- **Traducción en PHP:** Usar `t_var()` para todo texto visible al usuario: