# Archivo de configuración `.crudl` [← Volver al índice](../crudl.md) El archivo `.crudl` permite personalizar las vistas, los scripts y las plantillas de un sistema CRUD-L **sin modificar sus archivos**, y hacerlo de forma distinta para cada host atendido por la misma instalación. Es el mecanismo natural para atender a varios clientes con un mismo código base, cuando cada uno requiere formularios, estilos o comportamientos propios. Su uso es opcional. Si el archivo no existe, el marco funciona con la resolución de rutas predeterminada. ## Ubicación La función `crudl.load_config()`, invocada desde el punto de entrada, busca el archivo en tres ubicaciones y usa la primera que exista: 1. `_config/{host}/{@base_path}.crudl` 2. `_config/{@base_path}.crudl` 3. `{@base_path}.crudl` Donde `{host}` es el valor del encabezado `Host` de la solicitud, o el nombre del servidor si aquél no está disponible. Si `@base_path` termina en diagonal, se retira antes de componer el nombre. **Ejemplo.** Con `@base_path = "misistema/entidades"` y una solicitud a `clienteA.midominio.com`, se buscará en este orden: ``` _config/clienteA.midominio.com/misistema/entidades.crudl _config/misistema/entidades.crudl misistema/entidades.crudl ``` Esta cascada permite una configuración común para todos los hosts, con anulaciones por host. Si el archivo existe pero no puede interpretarse como JSON válido, la configuración se ignora en silencio y el marco continúa con la resolución predeterminada. ## Estructura ```json { "httm_template": "web/clienteA/_protected/plantilla.htt", "entities": { "cliente": { "httm_template": "web/clienteA/_protected/plantilla-catalogos.htt", "views": { "form.dk": "web/clienteA/vistas/cliente-form.dk", "list.dk": "web/clienteA/vistas/cliente-list.dk" }, "scripts": { "form.dk": "web/clienteA/scripts/cliente-form.js" } }, "factura": { "views": { "form.dk": "web/clienteA/vistas/factura-captura.dk" } } } } ``` | Clave | Ámbito | Descripción | |---|---|---| | `httm_template` | Raíz | Plantilla envolvente predeterminada para todas las entidades. | | `entities` | Raíz | Contenedor de configuraciones por tipo de entidad. | | `entities.{tipo}.httm_template` | Entidad | Plantilla envolvente para esa entidad. Tiene prioridad sobre la de la raíz. | | `entities.{tipo}.views.{nombre}` | Entidad | Ruta alterna del archivo de vista. | | `entities.{tipo}.scripts.{nombre}` | Entidad | Ruta del archivo de script asociado a esa vista. | Los nombres bajo `views` y `scripts` son los nombres de archivo de vista tal como los tiene configurados el sistema, es decir, los valores de `@form_view`, `@list_view` y `@error_view`. Con la configuración predeterminada son `form.dk`, `list.dk` y `error.dk`. ## Sustitución de vistas Cuando una entidad declara una ruta alterna para una vista, esa ruta encabeza la cadena de resolución. Si el archivo indicado no existe, se continúa con la búsqueda normal: carpeta de la entidad, ruta común y carpeta del marco. La cadena completa de resolución está en [Implementación de las vistas](vistas.md#resolución-de-la-vista). ## Scripts asociados El texto del archivo declarado bajo `scripts` se entrega a la vista en el miembro `script` del contexto: ``` script{ $"#<@@(@crud_context,'$script')>" } ``` Permite mantener el JavaScript de una vista fuera del archivo de la vista, y sustituirlo por host sin duplicar la vista completa. Es útil cuando el comportamiento del cliente cambia entre instalaciones pero el formulario es el mismo. Si el archivo declarado no existe, el miembro llega vacío. ## Plantillas `httm_template` indica la plantilla que envuelve la salida cuando se produce un error en modo HTML. El valor de la entidad tiene prioridad sobre el de la raíz. Si no se declara ninguno, se usa `{@base_path}/{@path_root}/_protected/default.htt`. Ver [Plantillas e inclusiones automáticas](../website.md). ## Relación con routes.json `.crudl` y `routes.json` son archivos distintos con propósitos distintos: | | `.crudl` | `routes.json` | |---|---|---| | Configura | Vistas, scripts, plantillas | Patrones de ruta y entidades | | Se carga con | `crudl.load_config()` | `crudl.loadRoutesJSON()` | | Se busca en | `_config/{host}/...` | `{@path_root}/{@base_path}/` | | Varía por host | Sí | No | Ver [Enrutamiento y enmascaramiento de URL](enrutamiento.md#definición-declarativa-con-routesjson). ## Documentos relacionados * [Instalación y configuración](instalacion.md) * [Implementación de las vistas](vistas.md) * [Enrutamiento y enmascaramiento de URL](enrutamiento.md)