Domain Config UI¶
Le module Domain Config UI fournit un moyen simple d'activer des surcharges de configuration par domaine directement depuis les formulaires de configuration existants. Lorsqu'un formulaire de configuration pris en charge est consulté dans un contexte de domaine, les utilisateurs disposant des droits adéquats voient un bouton en ligne permettant d'activer (ou de supprimer) une surcharge de configuration spécifique au domaine pour cet objet de configuration.
Fonctionnement¶
- Lorsqu'un utilisateur disposant des permissions appropriées visite un
formulaire de configuration d'administration sur un nom d'hôte de domaine
(par exemple,
https://one.example.com), le module inspecte le formulaire pour identifier le ou les objets de configuration sous-jacents. - Si la configuration peut être surchargée par domaine, un lien d'action
en ligne apparaît en haut du formulaire :
- Activer la configuration de domaine
- Supprimer la configuration de domaine (une fois celle-ci activée)
- Une fois activée, les modifications soumises via ce formulaire sont enregistrées en tant que surcharges par domaine, sans modifier la configuration globale.
Configurations non autorisées¶
Vous pouvez explicitement empêcher certains objets de configuration d'être surchargés par domaine. Lorsqu'un nom de configuration est interdit, le lien de basculement en ligne est masqué sur le formulaire correspondant.
Où configurer¶
- Interface : Administration > Configuration > Domain > Domain Config UI
(
/admin/config/domain/config-ui) - Clé de configuration :
domain_config_ui.settings: disallowed_configurations
Exemple¶
Pour interdire les surcharges au niveau du domaine pour le formulaire
Informations du site (system.site) et les paramètres de thème
(system.theme), définissez la configuration suivante (YAML), ou via le
formulaire de paramètres :
domain_config_ui.settings:
disallowed_configurations:
- system.site
- system.theme
Avec la configuration ci-dessus, le lien "Activer la configuration de domaine" n'apparaîtra plus sur :
- Informations du site :
/admin/config/system/site-information(system.site) - Pages d'apparence et de paramètres de thème correspondant à
system.theme
Notes¶
- Le module empêche également la surcharge de ses propres paramètres par défaut.
- La vérification est appliquée côté serveur via la fabrique de configuration, et pas seulement masquée dans l'interface.
Issue associée¶
Contrôle programmatique¶
Deux hooks alter permettent un contrôle avancé sur l'affichage du bouton de basculement et sur les objets de configuration éligibles aux surcharges par domaine.
Alter des configurations non autorisées¶
Empêcher les surcharges de domaine pour des noms de configuration spécifiques de manière globale :
/**
* Implements hook_domain_config_ui_disallowed_configurations_alter().
*/
function mymodule_domain_config_ui_disallowed_configurations_alter(array &$disallowed): void {
// Disallow domain overrides for image toolkit settings site-wide.
$disallowed[] = 'system.image';
}
Alter des routes non autorisées¶
Masquer entièrement le bouton de basculement sur des routes spécifiques (même si la configuration sous-jacente serait normalement autorisée) :
/**
* Implements hook_domain_config_ui_disallowed_routes_alter().
*/
function mymodule_domain_config_ui_disallowed_routes_alter(array &$routes): void {
// Do not show the toggle on the account settings page.
$routes[] = 'entity.user.admin_form';
}
Domaine d'édition de configuration (API développeur)¶
Par défaut, les formulaires de configuration lisent et écrivent dans le domaine négocié — celui résolu à partir de la requête courante (nom d'hôte, préfixe de chemin, etc.). Ce même domaine négocié pilote aussi le routing, la négociation de langue et la gestion des préfixes de chemin : il doit donc refléter la requête réelle et ne peut pas être simplement permuté pour éditer un autre domaine.
Pour permettre à du code d'éditer les surcharges d'un autre domaine sans
changer le domaine négocié, le module fournit le service
DomainConfigEditContext
(Drupal\domain_config_ui\DomainConfigEditContext). Il conserve un
domaine d'édition de configuration optionnel, restreint à un ensemble de
noms de configuration. La fabrique de configuration et DomainConfigUIManager
le consultent en priorité par rapport au domaine négocié, en retombant sur la
négociation lorsqu'aucun n'est défini.
/** @var \Drupal\domain_config_ui\DomainConfigEditContext $edit_context */
$edit_context = \Drupal::service(DomainConfigEditContext::class);
// Éditer uniquement les surcharges system.site de one_example_com ; tout le
// reste (ainsi que le routing, la langue et les préfixes de chemin) continue
// d'utiliser le domaine négocié.
$edit_context->setEditingDomain('one_example_com', ['system.site']);
Propriétés clés :
- Restreint par nom : seuls les noms de configuration que vous passez sont reciblés ; toute autre configuration continue de se résoudre sur le domaine négocié.
- La négociation n'est pas touchée : le routing, la langue et la gestion des préfixes de chemin utilisent toujours le domaine réel de la requête, si bien que l'URL courante continue de fonctionner — y compris sur les sites utilisant des préfixes de chemin de langue ou le mode domaine à préfixe de chemin.
- Rétrocompatible : lorsqu'aucun domaine d'édition n'est défini, chaque résolution retombe sur le domaine négocié ; le comportement est identique à celui obtenu sans utiliser le service.
- Le contrôle d'accès s'applique toujours : les écritures restent soumises à l'enregistrement par domaine et aux permissions de domaine de l'utilisateur, évaluées vis-à-vis du domaine d'édition — un utilisateur ne peut écrire que dans un domaine qu'il est autorisé à administrer.
Cette API alimente le sous-module Domain Configuration Switcher du projet
domain_extras, qui ajoute un sélecteur de domaine dans le formulaire.
Modifier la configuration de base (par défaut)¶
Passez DomainConfigEditContextInterface::BASE comme identifiant de domaine
pour modifier la configuration de base — les valeurs par défaut dont hérite
chaque domaine tant qu'il n'a pas son propre override par domaine — au lieu de
l'override d'un domaine précis. getDomainId() résout la sentinelle en NULL,
de sorte que la configuration factory écrit la configuration de base plutôt
qu'une collection de domaine, même lorsque le domaine négocié possède un
override enregistré.
use Drupal\domain_config_ui\DomainConfigEditContextInterface;
// Modifier la configuration system.site de base, indépendamment du domaine
// négocié. L'enregistrement écrit la valeur par défaut dont héritent les
// domaines sans override.
$edit_context->setEditingDomain(
DomainConfigEditContextInterface::BASE,
['system.site'],
);
Comme getDomainId() renvoie NULL en mode base, le hook_form_alter() de
domain_config_ui considère qu'aucun domaine d'édition n'est défini et ne
s'exécute pas : il n'ajoute ni le bouton d'activation/désactivation ni les
validateurs de permission. Le consommateur prend donc en charge l'interface
dans le formulaire et doit lui-même restreindre la modification de la
configuration de base derrière la permission set default domain
configuration.
Issue associée¶
Aperçu des permissions¶
Les permissions courantes utilisées par ce module incluent :
use domain config ui— voir et utiliser le bouton de basculement en ligne sur les formulaires autorisésadminister domain config ui— gérer les paramètresset default domain configuration— gérer les valeurs par défaut et spécifiques au domaine
Assurez-vous que les utilisateurs opèrent dans un contexte de domaine (c'est-à-dire en visitant le site sur le nom d'hôte d'un domaine) pour que le bouton de basculement soit disponible.
Le sous-module optionnel
Domain Config Language UI
apporte sa propre permission translate domain configuration pour gérer
les surcharges par langue qui s'ajoutent à celles par domaine.
Références de tests¶
Le dépôt inclut des tests fonctionnels et JavaScript qui illustrent le comportement attendu :
DomainConfigUISettingsTest— activation/suppression des surcharges depuis les formulaires courantsDomainConfigUIDisallowedConfigurationsTest— vérifie que l'ajout desystem.siteàdisallowed_configurationsmasque le bouton de basculement sur Informations du siteDomainConfigUIOptionsTestetDomainConfigUIPermissionsTest— couverture des permissions et des options
Ces tests peuvent servir d'exemples lors de l'intégration de cette fonctionnalité dans des modules personnalisés.
Sous-modules associés¶
Quand la configuration par domaine influence des éléments rendus à
partir de définitions de plugins mises en cache par langue (local
tasks, local actions, contextual links), un effet de bord apparaît :
sans cache key qui distingue aussi les domaines, le premier domaine
à peupler le cache fige le rendu pour tous les autres, qui se
retrouvent alors avec des éléments obsolètes. Le sous-module
domain_menu_extras
(projet domain_extras) corrige ce comportement en remplaçant les
plugin managers de menu par des variantes domain-aware. Activez-le
si vous êtes concerné.