Saltar a contenido

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 permitidos
  • administer domain config ui — gestionar los ajustes
  • set 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 comunes
  • DomainConfigUIDisallowedConfigurationsTest — verifica que añadir system.site a disallowed_configurations oculte el enlace de acción en Site Information
  • DomainConfigUIOptionsTest y DomainConfigUIPermissionsTest — 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.