Domain Config UI¶
El módulo Domain Config UI proporciona una forma ligera de activar sobrescrituras de configuración por dominio directamente desde los formularios de configuración existentes. Al visitar un formulario de configuración compatible dentro de un contexto de dominio, los usuarios con los privilegios apropiados verán un enlace de acción en línea para activar (o eliminar) una sobrescritura específica de dominio para ese objeto de configuración.
Cómo funciona¶
- Cuando un usuario con los permisos apropiados visita un formulario
de configuración de administración en un host de dominio (por
ejemplo,
https://one.example.com), el módulo inspecciona el formulario para identificar los objetos de configuración subyacentes. - Si se permite sobrescribir la configuración por dominio, aparece un
enlace de acción en línea en la parte superior del formulario:
- Enable domain configuration
- Remove domain configuration (después de haberla activado)
- Una vez activada, los cambios enviados desde ese formulario se almacenan como sobrescrituras por dominio, sin alterar la configuración global.
Configuraciones no permitidas¶
Puede impedir explícitamente que ciertos objetos de configuración sean sobrescritos por dominio. Cuando un nombre de configuración está marcado como no permitido, el enlace de acción en línea se oculta en el formulario correspondiente.
Dónde configurar¶
- UI: Administración > Configuración > Domain > Domain Config UI
(
/admin/config/domain/config-ui) - Clave de configuración:
domain_config_ui.settings: disallowed_configurations
Ejemplo¶
Para prohibir las sobrescrituras a nivel de dominio del formulario Site
Information (system.site) y la configuración del tema
(system.theme), establezca lo siguiente en su configuración (YAML),
o a través del formulario de ajustes:
domain_config_ui.settings:
disallowed_configurations:
- system.site
- system.theme
Con la configuración anterior, el enlace "Enable domain configuration" ya no aparecerá en:
- Site Information:
/admin/config/system/site-information(system.site) - Las páginas de apariencia y configuración de tema asociadas a
system.theme
Notas¶
- El módulo también impide sobrescribir su propia configuración por defecto.
- La verificación se aplica del lado del servidor a través de la config factory, no solo se oculta en la interfaz de usuario.
Issue relacionado¶
Control programático¶
Dos alter hooks permiten un control avanzado sobre dónde se muestra el enlace de acción y qué objetos de configuración son elegibles para sobrescrituras por dominio.
Alter de configuraciones no permitidas¶
Impide las sobrescrituras de dominio para nombres de configuración específicos de forma global:
/**
* Implements hook_domain_config_ui_disallowed_configurations_alter().
*/
function mymodule_domain_config_ui_disallowed_configurations_alter(array &$disallowed): void {
// No permitir sobrescrituras de dominio para la configuración
// del toolkit de imágenes en todo el sitio.
$disallowed[] = 'system.image';
}
Alter de rutas no permitidas¶
Oculta el enlace de acción completamente en rutas específicas (incluso si la configuración subyacente normalmente estaría permitida):
/**
* Implements hook_domain_config_ui_disallowed_routes_alter().
*/
function mymodule_domain_config_ui_disallowed_routes_alter(array &$routes): void {
// No mostrar el enlace de acción en la página de configuración
// de cuentas.
$routes[] = 'entity.user.admin_form';
}
Dominio de edición de configuración (API para desarrolladores)¶
Por defecto, los formularios de configuración leen y escriben en el dominio negociado — el resuelto a partir de la petición actual (nombre de host, prefijo de ruta, etc.). Ese mismo dominio negociado también controla el routing, la negociación de idioma y la gestión de prefijos de ruta, por lo que debe reflejar la petición real y no puede simplemente cambiarse para editar otro dominio.
Para permitir que el código edite las sobrescrituras de otro dominio sin
cambiar el dominio negociado, el módulo proporciona el servicio
DomainConfigEditContext
(Drupal\domain_config_ui\DomainConfigEditContext). Mantiene un dominio de
edición de configuración opcional, acotado a un conjunto de nombres de
configuración. La fábrica de configuración y DomainConfigUIManager lo
consultan con prioridad sobre el dominio negociado, recurriendo a la
negociación cuando no hay ninguno definido.
/** @var \Drupal\domain_config_ui\DomainConfigEditContext $edit_context */
$edit_context = \Drupal::service(DomainConfigEditContext::class);
// Editar solo las sobrescrituras system.site de one_example_com; todo lo demás
// (y el routing, el idioma y los prefijos de ruta) sigue usando el dominio
// negociado.
$edit_context->setEditingDomain('one_example_com', ['system.site']);
Propiedades clave:
- Acotado por nombre: solo se redirigen los nombres de configuración que indiques; cualquier otra configuración sigue resolviéndose en el dominio negociado.
- La negociación no se toca: el routing, el idioma y la gestión de prefijos de ruta siempre usan el dominio real de la petición, de modo que la URL actual sigue funcionando — incluso en sitios que usan prefijos de ruta de idioma o el modo de dominio con prefijo de ruta.
- Retrocompatible: cuando no hay un dominio de edición definido, cada resolución recae en el dominio negociado; el comportamiento es idéntico a no usar el servicio.
- El control de acceso sigue aplicándose: las escrituras siguen sujetas al registro por dominio y a los permisos de dominio del usuario, evaluados frente al dominio de edición — un usuario solo puede escribir en un dominio que pueda administrar.
Esta API impulsa el submódulo Domain Configuration Switcher del proyecto
domain_extras, que añade un selector de dominio en el formulario.
Editar la configuración base (predeterminada)¶
Pase DomainConfigEditContextInterface::BASE como identificador de dominio
para editar la configuración base — los valores predeterminados que hereda
cada dominio mientras no tenga su propio override por dominio — en lugar del
override de un dominio concreto. getDomainId() resuelve el centinela a NULL,
de modo que la configuration factory escribe la configuración base en lugar de
una colección de dominio, incluso cuando el dominio negociado tiene un override
registrado.
use Drupal\domain_config_ui\DomainConfigEditContextInterface;
// Editar la configuración system.site base, independientemente del dominio
// negociado. Al guardar se escribe el valor predeterminado que heredan los
// dominios sin override.
$edit_context->setEditingDomain(
DomainConfigEditContextInterface::BASE,
['system.site'],
);
Como getDomainId() devuelve NULL en modo base, el hook_form_alter() de
domain_config_ui considera que no hay ningún dominio de edición definido y no se
ejecuta: no añade ni el botón de activación/desactivación ni los validadores de
permiso. Por tanto, el consumidor se encarga de la interfaz en el formulario y
debe restringir él mismo la edición de la configuración base detrás del permiso
set default domain configuration.
Issue relacionado¶
Resumen de permisos¶
Los permisos comunes utilizados por este módulo incluyen:
use domain config ui— ver y utilizar el enlace de acción en línea en los formularios permitidosadminister domain config ui— gestionar los ajustesset default domain configuration— gestionar los valores por defecto frente a los específicos de dominio
Asegúrese de que los usuarios operen dentro de un contexto de dominio (es decir, visitando el sitio en un host de dominio) para que el enlace de acción esté disponible.
El submódulo opcional
Domain Config Language UI
aporta su propio permiso translate domain configuration para gestionar
las sobrescrituras por idioma que se añaden a las de por dominio.
Referencias de pruebas¶
El repositorio incluye pruebas funcionales y JavaScript que ilustran el comportamiento esperado:
DomainConfigUISettingsTest— activar/eliminar sobrescrituras desde formularios comunesDomainConfigUIDisallowedConfigurationsTest— verifica que añadirsystem.siteadisallowed_configurationsoculte el enlace de acción en Site InformationDomainConfigUIOptionsTestyDomainConfigUIPermissionsTest— cobertura de permisos y opciones
Estas pruebas pueden servir como ejemplos al integrar la funcionalidad en módulos personalizados.
Submódulos relacionados¶
Cuando la configuración por dominio afecta elementos generados a
partir de definiciones de plugins cacheadas por idioma (local tasks,
local actions, contextual links), aparece un efecto colateral: sin
una cache key que también distinga los dominios, el primer dominio
que llena el cache fija el resultado para los demás, que terminan
mostrando elementos desactualizados. El submódulo
domain_menu_extras
(proyecto domain_extras) corrige este comportamiento sustituyendo
los plugin managers de menú por variantes domain-aware. Actívalo si
te afecta.