diff --git a/core/lib/Drupal/Core/Config/DefinitionLookup.php b/core/lib/Drupal/Core/Config/DefinitionLookup.php new file mode 100644 index 0000000..901a50a --- /dev/null +++ b/core/lib/Drupal/Core/Config/DefinitionLookup.php @@ -0,0 +1,64 @@ +configDefinitions[$module_name])) { + $definition_file = DRUPAL_ROOT . '/' . drupal_get_path('module', $module_name) . '/' . $module_name . '.config-definition.yml'; + $this->configDefinitions[$module_name] = file_exists($definition_file) ? YAML::parse($definition_file) : array(); + } + $definition = array(); + foreach ($this->configDefinitions[$module_name] as $config_name_selector => $object_definitions) { + if ($this->selectorMatches($config_name_selector, $config_name)) { + foreach ($object_definitions as $config_key_selector => $element_definitions) { + if ($this->selectorMatches($config_key_selector, $config_key)) { + $definition = array_merge($definition, $element_definitions); + } + } + } + } + $this->storage[$offset] = $definition; + $this->persist($offset); + return $definition; + } + + /** + * Returns TRUE if the subject matches the pattern. + */ + protected function selectorMatches($pattern, $subject) { + $subject_parts = explode('.', $subject); + $pattern_parts = explode('.', $pattern); + if (count($subject_parts) == count($pattern_parts)) { + $diff = array_diff_assoc($pattern_parts, $subject_parts); + $matches = (empty($diff) || (array_unique($diff) === array('%'))); + return $matches; + } + } + +} diff --git a/core/lib/Drupal/Core/CoreBundle.php b/core/lib/Drupal/Core/CoreBundle.php index e1147ac..4f17388 100644 --- a/core/lib/Drupal/Core/CoreBundle.php +++ b/core/lib/Drupal/Core/CoreBundle.php @@ -115,6 +115,12 @@ public function build(ContainerBuilder $container) { ->setFactoryMethod('getConnection') ->addArgument('slave'); $container->register('typed_data', 'Drupal\Core\TypedData\TypedDataManager'); + + // Register the configuration element definition lookup service. + $container->register('config.definition_lookup', 'Drupal\Core\Config\DefinitionLookup') + ->addArgument('config:definitions') + ->addArgument('cache'); + // Add the user's storage for temporary, non-cache data. $container->register('lock', 'Drupal\Core\Lock\DatabaseLockBackend'); $container->register('user.tempstore', 'Drupal\user\TempStoreFactory') diff --git a/core/modules/config/lib/Drupal/config/Tests/ConfigDefinitionTest.php b/core/modules/config/lib/Drupal/config/Tests/ConfigDefinitionTest.php new file mode 100644 index 0000000..c661758 --- /dev/null +++ b/core/modules/config/lib/Drupal/config/Tests/ConfigDefinitionTest.php @@ -0,0 +1,40 @@ + 'Configuration definitions', + 'description' => 'Tests getting definitions of configuration elements.', + 'group' => 'Configuration', + ); + } + + /** + * Tests getting definitions of configuration elements. + */ + function testLookup() { + $lookup = drupal_container()->get('config.definition_lookup'); + $this->assertEqual($lookup['system.site:page.front'], array('label' => 'Default front page')); + } + +} diff --git a/core/modules/contact/contact.config-definition.yml b/core/modules/contact/contact.config-definition.yml new file mode 100644 index 0000000..fb82747 --- /dev/null +++ b/core/modules/contact/contact.config-definition.yml @@ -0,0 +1,15 @@ +contact.category.%: + id: + label: 'Id' + label: + label: 'Label' + translatable: true + recipients: + label: 'Recipients' + translatable: true + reply: + label: 'Reply' + translatable: true + weight: + type: integer + label: 'Weight' diff --git a/core/modules/image/image.config-definition.yml b/core/modules/image/image.config-definition.yml new file mode 100644 index 0000000..c13be1a --- /dev/null +++ b/core/modules/image/image.config-definition.yml @@ -0,0 +1,66 @@ +image.style.%: + name: + label: 'Machine name' + label: + label: 'Label' + translatable: true + effects: + label: 'Style effects' + effects.%: + label: 'Image effect' + effects.%.weight: + type: integer + label: 'Weight' + effects.%.ieid: + label: 'IEID' + effects.%.name: + label: 'Machine name' + effects.%.data: + label: 'Data' + include: 'image.effect.[%parent.name]' + +image.effect.image_crop: + width: + type: integer + label: 'Width' + height: + type: integer + label: 'Height' + anchor: + label: 'Anchor' + +image.effect.image_resize: + width: + type: integer + label: 'Width' + height: + type: integer + label: 'Height' + +image.effect.image_rotate: + degrees: + label: 'Rotation angle' + bgcolor: + label: 'Background color' + random: + type: boolean + label: 'Randomize' + +image.effect.scale: + width: + type: integer + label: 'Width' + height: + type: integer + label: 'Height' + upscale: + type: boolean + label: 'Upscale' + +image.effect.scale_and_crop: + width: + type: integer + label: 'Width' + height: + type: integer + label: 'Height' diff --git a/core/modules/system/system.config-definition.yml b/core/modules/system/system.config-definition.yml new file mode 100644 index 0000000..3b3bf2f --- /dev/null +++ b/core/modules/system/system.config-definition.yml @@ -0,0 +1,25 @@ +system.site: + name: + label: 'Site name' + translatable: true + mail: + label: 'Site mail' + slogan: + label: 'Site slogan' + translatable: true + page: + label: 'Default pages' + page.403: + label: 'Default 403 (access denied) page' + page.404: + label: 'Default 404 (not found) page' + page.front: + label: 'Default front page' + +system.maintenance: + enabled: + type: boolean + label: 'Put site into maintenance mode' + message: + label: 'Message to display when in maintenance mode' + translatable: true diff --git a/core/modules/user/user.config-definition.yml b/core/modules/user/user.config-definition.yml new file mode 100644 index 0000000..2c7a631 --- /dev/null +++ b/core/modules/user/user.config-definition.yml @@ -0,0 +1,11 @@ +user.mail: + "": + label: 'User mails' + %: + label: 'Mail text' + %.subject: + label: 'Subject' + translatable: true + %.body: + label: 'Body' + translatable: true