diff --git a/core/config/schema/core.data_types.schema.yml b/core/config/schema/core.data_types.schema.yml index 4f6ef0c..da51c95 100644 --- a/core/config/schema/core.data_types.schema.yml +++ b/core/config/schema/core.data_types.schema.yml @@ -378,12 +378,12 @@ field_config_base: type: boolean label: 'Translatable' default_value: - type: field.[%parent.field_type].value + type: field.value.[%parent.field_type] default_value_callback: type: string label: 'Default value callback' settings: - type: field.[%parent.field_type].field_settings + type: field.field_settings.[%parent.field_type] third_party_settings: type: sequence label: 'Third party settings' @@ -417,9 +417,23 @@ core.date_format.*: type: string label: 'Default language' +# Generic field settings schemas. + +field.storage_settings.*: + type: mapping + label: 'Settings' + +field.field_settings.*: + type: mapping + label: 'Settings' + +field.value.*: + type: sequence + label: 'Default value' + # Schema for the configuration of the String field type. -field.string.storage_settings: +field.storage_settings.string: type: mapping label: 'String settings' mapping: @@ -427,11 +441,11 @@ field.string.storage_settings: type: integer label: 'Maximum length' -field.string.field_settings: - type: sequence +field.field_settings.string: + type: mapping label: 'String settings' -field.string.value: +field.value.string: type: sequence label: 'Default value' sequence: @@ -444,15 +458,15 @@ field.string.value: # Schema for the configuration of the String (long) field type. -field.string_long.storage_settings: - type: field.string.storage_settings +field.storage_settings.string_long: + type: field.storage_settings.string label: 'String (long) settings' -field.string_long.field_settings: - type: field.string.field_settings +field.field_settings.string_long: + type: field.field_settings.string label: 'String (long) settings' -field.string_long.value: +field.value.string_long: type: sequence label: 'Default value' sequence: @@ -465,7 +479,7 @@ field.string_long.value: # Schema for the configuration of the URI field type. -field.uri.storage_settings: +field.storage_settings.uri: type: mapping label: 'URI settings' mapping: @@ -473,11 +487,11 @@ field.uri.storage_settings: type: integer label: 'Maximum length' -field.uri.field_settings: - type: sequence +field.field_settings.uri: + type: mapping label: 'URI settings' -field.uri.value: +field.value.uri: type: sequence label: 'Default value' sequence: @@ -490,15 +504,15 @@ field.uri.value: # Schema for the configuration of the Created field type. -field.created.storage_settings: - type: sequence +field.storage_settings.created: + type: mapping label: 'Created timestamp settings' -field.created.field_settings: - type: sequence +field.field_settings.created: + type: mapping label: 'Created timestamp settings' -field.created.value: +field.value.created: type: sequence label: 'Default value' sequence: @@ -511,15 +525,15 @@ field.created.value: # Schema for the configuration of the Changed field type. -field.changed.storage_settings: - type: sequence +field.storage_settings.changed: + type: mapping label: 'Changed timestamp settings' -field.changed.field_settings: - type: sequence +field.field_settings.changed: + type: mapping label: 'Changed timestamp settings' -field.changed.value: +field.value.changed: type: sequence label: 'Default value' sequence: @@ -532,7 +546,7 @@ field.changed.value: # Schema for the configuration of the Entity reference field type. -field.entity_reference.storage_settings: +field.storage_settings.entity_reference: type: mapping label: 'Entity reference settings' mapping: @@ -540,7 +554,7 @@ field.entity_reference.storage_settings: type: string label: 'Type of item to reference' -field.entity_reference.field_settings: +field.field_settings.entity_reference: type: mapping label: 'Entity reference settings' mapping: @@ -551,7 +565,7 @@ field.entity_reference.field_settings: type: entity_reference.[%parent.handler].handler_settings label: 'Reference method settings' -field.entity_reference.value: +field.value.entity_reference: type: sequence label: 'Default value' sequence: @@ -567,7 +581,7 @@ field.entity_reference.value: # Schema for the configuration of the Boolean field type. -field.boolean.storage_settings: +field.storage_settings.boolean: type: mapping label: 'Boolean settings' mapping: @@ -578,11 +592,11 @@ field.boolean.storage_settings: type: string label: 'Off label' -field.boolean.field_settings: +field.field_settings.boolean: + type: mapping label: 'Boolean settings' - type: sequence -field.boolean.value: +field.value.boolean: type: sequence label: 'Default value' sequence: @@ -595,20 +609,15 @@ field.boolean.value: # Schema for the configuration of the Email field type. -field.email.storage_settings: - type: sequence +field.storage_settings.email: + type: mapping label: 'Email settings' - sequence: - - type: string -field.email.field_settings: - type: sequence +field.field_settings.email: + type: mapping label: 'Email settings' - sequence: - - type: string - label: 'Setting' -field.email.value: +field.value.email: type: sequence label: 'Default value' sequence: @@ -621,16 +630,17 @@ field.email.value: # Schema for the configuration of the Integer field type. -field.integer.storage_settings: - type: sequence +field.storage_settings.integer: + type: mapping label: 'Integer settings' - sequence: - - type: string - label: 'setting' + mapping: + unsigned: + type: boolean + label: 'Unsigned' -field.integer.field_settings: +field.field_settings.integer: type: mapping - label: 'Integer' + label: 'Integer settings' mapping: min: type: integer @@ -648,7 +658,7 @@ field.integer.field_settings: type: string label: 'Database storage size' -field.integer.value: +field.value.integer: type: sequence label: 'Default value' sequence: @@ -661,7 +671,7 @@ field.integer.value: # Schema for the configuration of the Decimal field type. -field.decimal.storage_settings: +field.storage_settings.decimal: type: mapping label: 'Decimal settings' mapping: @@ -672,9 +682,9 @@ field.decimal.storage_settings: type: integer label: 'Scale' -field.decimal.field_settings: +field.field_settings.decimal: type: mapping - label: 'Decimal' + label: 'Decimal settings' mapping: min: type: float @@ -689,7 +699,7 @@ field.decimal.field_settings: type: string label: 'Suffix' -field.decimal.value: +field.value.decimal: type: sequence label: 'Default value' sequence: @@ -702,16 +712,13 @@ field.decimal.value: # Schema for the configuration of the Float field type. -field.float.storage_settings: - type: sequence +field.storage_settings.float: + type: mapping label: 'Float settings' - sequence: - - type: string - label: 'setting' -field.float.field_settings: +field.field_settings.float: type: mapping - label: 'Float' + label: 'Float settings' mapping: min: type: float @@ -726,7 +733,7 @@ field.float.field_settings: type: string label: 'Suffix' -field.float.value: +field.value.float: type: sequence label: 'Default value' sequence: diff --git a/core/lib/Drupal/Core/Field/Entity/BaseFieldOverride.php b/core/lib/Drupal/Core/Field/Entity/BaseFieldOverride.php index 9fbe75c..b6b2a3c 100644 --- a/core/lib/Drupal/Core/Field/Entity/BaseFieldOverride.php +++ b/core/lib/Drupal/Core/Field/Entity/BaseFieldOverride.php @@ -154,8 +154,12 @@ protected function getBaseFieldDefinition() { * BaseFieldOverride::allowBundleRename() has not been called. */ public function preSave(EntityStorageInterface $storage) { - // Set the default instance settings. - $this->settings += \Drupal::service('plugin.manager.field.field_type')->getDefaultFieldSettings($this->getType()); + // Filter out unknown settings and make sure all settings are present, so + // that a complete field definition is passed to the various hooks and + // written to config. + $field_type_manager = \Drupal::service('plugin.manager.field.field_type'); + $default_settings = $field_type_manager->getDefaultFieldSettings($this->getType()); + $this->settings = array_intersect_key($this->settings, $default_settings) + $default_settings; // Call the parent's presave method to perform validate and calculate // dependencies. diff --git a/core/modules/comment/config/schema/comment.schema.yml b/core/modules/comment/config/schema/comment.schema.yml index 8b8c6a3..b835af0 100644 --- a/core/modules/comment/config/schema/comment.schema.yml +++ b/core/modules/comment/config/schema/comment.schema.yml @@ -56,16 +56,17 @@ comment.type.*: type: text label: 'Description' -field.comment.storage_settings: - type: sequence - label: 'Settings' - sequence: - - type: string - label: 'Setting' +field.storage_settings.comment: + type: mapping + label: 'Comment settings' + mapping: + comment_type: + label: 'Comment type' + type: string -field.comment.value: +field.value.comment: type: sequence - label: 'Settings' + label: 'Default value' sequence: - type: mapping label: 'Settings' @@ -89,7 +90,7 @@ field.comment.value: type: integer label: 'Count' -field.comment.field_settings: +field.field_settings.comment: type: mapping label: 'Comment settings' mapping: diff --git a/core/modules/datetime/config/schema/datetime.schema.yml b/core/modules/datetime/config/schema/datetime.schema.yml index 3086164..f6bb3bd 100644 --- a/core/modules/datetime/config/schema/datetime.schema.yml +++ b/core/modules/datetime/config/schema/datetime.schema.yml @@ -1,6 +1,6 @@ # Schema for the configuration files of the Datetime module. -field.datetime.storage_settings: +field.storage_settings.datetime: type: mapping label: 'Datetime settings' mapping: @@ -8,23 +8,23 @@ field.datetime.storage_settings: type: string label: 'Date type' -field.datetime.field_settings: - type: sequence - label: 'Settings' - sequence: - - type: string +field.field_settings.datetime: + type: mapping + label: 'Datetime settings' -field.datetime.value: +field.value.datetime: type: sequence label: 'Default value' sequence: - - type: sequence + - type: mapping label: 'Default value' - sequence: - - type: string - label: 'Type' - - type: string - label: 'Value' + mapping: + default_date_type: + type: string + label: 'Default date type' + default_date: + type: string + label: 'Default date value' entity_view_display.field.datetime_default: type: entity_field_view_display_base diff --git a/core/modules/field/config/schema/field.schema.yml b/core/modules/field/config/schema/field.schema.yml index 184dc2f..429c929 100644 --- a/core/modules/field/config/schema/field.schema.yml +++ b/core/modules/field/config/schema/field.schema.yml @@ -25,7 +25,7 @@ field.storage.*.*: type: string label: 'Type' settings: - type: field.[%parent.type].storage_settings + type: field.storage_settings.[%parent.type] module: type: string label: 'Module' diff --git a/core/modules/field/src/Entity/FieldConfig.php b/core/modules/field/src/Entity/FieldConfig.php index 87f4400..a8d9c0a 100644 --- a/core/modules/field/src/Entity/FieldConfig.php +++ b/core/modules/field/src/Entity/FieldConfig.php @@ -138,9 +138,13 @@ public function preSave(EntityStorageInterface $storage) { $storage_definition = $this->getFieldStorageDefinition(); + // Filter out unknown settings and make sure all settings are present, so + // that a complete field definition is passed to the various hooks and + // written to config. + $default_settings = $field_type_manager->getDefaultFieldSettings($storage_definition->type); + $this->settings = array_intersect_key($this->settings, $default_settings) + $default_settings; + if ($this->isNew()) { - // Set the default field settings. - $this->settings += $field_type_manager->getDefaultFieldSettings($storage_definition->type); // Notify the entity storage. $entity_manager->getStorage($this->entity_type)->onFieldDefinitionCreate($this); } @@ -155,8 +159,6 @@ public function preSave(EntityStorageInterface $storage) { if ($storage_definition->uuid() != $this->original->getFieldStorageDefinition()->uuid()) { throw new FieldException("Cannot change an existing field's storage."); } - // Set the default field settings. - $this->settings += $field_type_manager->getDefaultFieldSettings($storage_definition->type); // Notify the entity storage. $entity_manager->getStorage($this->entity_type)->onFieldDefinitionUpdate($this, $this->original); } diff --git a/core/modules/field/src/Entity/FieldStorageConfig.php b/core/modules/field/src/Entity/FieldStorageConfig.php index 6b89e38..9ae0fc4 100644 --- a/core/modules/field/src/Entity/FieldStorageConfig.php +++ b/core/modules/field/src/Entity/FieldStorageConfig.php @@ -253,6 +253,13 @@ public function preSave(EntityStorageInterface $storage) { // Clear the derived data about the field. unset($this->schema); + // Filter out unknown settings and make sure all settings are present, so + // that a complete field definition is passed to the various hooks and + // written to config. + $field_type_manager = \Drupal::service('plugin.manager.field.field_type'); + $default_settings = $field_type_manager->getDefaultStorageSettings($this->type); + $this->settings = array_intersect_key($this->settings, $default_settings) + $default_settings; + if ($this->isNew()) { $this->preSaveNew($storage); } @@ -303,10 +310,6 @@ protected function preSaveNew(EntityStorageInterface $storage) { } $this->module = $field_type['provider']; - // Make sure all settings are present, so that a complete field - // definition is passed to the various hooks and written to config. - $this->settings += $field_type_manager->getDefaultStorageSettings($this->type); - // Notify the entity manager. $entity_manager->onFieldStorageDefinitionCreate($this); } @@ -333,7 +336,6 @@ public function calculateDependencies() { protected function preSaveUpdated(EntityStorageInterface $storage) { $module_handler = \Drupal::moduleHandler(); $entity_manager = \Drupal::entityManager(); - $field_type_manager = \Drupal::service('plugin.manager.field.field_type'); // Some updates are always disallowed. if ($this->type != $this->original->type) { @@ -343,10 +345,6 @@ protected function preSaveUpdated(EntityStorageInterface $storage) { throw new FieldException("Cannot change the entity type for an existing field storage."); } - // Make sure all settings are present, so that a complete field - // definition is passed to the various hooks and written to config. - $this->settings += $field_type_manager->getDefaultStorageSettings($this->type); - // See if any module forbids the update by throwing an exception. This // invokes hook_field_storage_config_update_forbid(). $module_handler->invokeAll('field_storage_config_update_forbid', array($this, $this->original)); diff --git a/core/modules/file/config/schema/file.schema.yml b/core/modules/file/config/schema/file.schema.yml index 0babe38..b7303a1 100644 --- a/core/modules/file/config/schema/file.schema.yml +++ b/core/modules/file/config/schema/file.schema.yml @@ -22,7 +22,7 @@ file.settings: type: path label: 'Directory' -field.file.storage_settings: +field.storage_settings.file: type: base_entity_reference_field_settings label: 'File settings' mapping: @@ -36,12 +36,9 @@ field.file.storage_settings: type: string label: 'Upload destination' -field.file.value: +field.value.file: type: sequence label: 'Default value' - sequence: - - type: string - label: 'Value' base_file_field_field_settings: type: mapping @@ -59,7 +56,7 @@ base_file_field_field_settings: type: string label: 'Maximum upload size' -field.file.field_settings: +field.field_settings.file: type: base_file_field_field_settings label: 'File settings' mapping: diff --git a/core/modules/image/config/schema/image.schema.yml b/core/modules/image/config/schema/image.schema.yml index ef03075..af0dfee 100644 --- a/core/modules/image/config/schema/image.schema.yml +++ b/core/modules/image/config/schema/image.schema.yml @@ -83,15 +83,15 @@ image.settings: type: boolean label: 'Suppress the itok query string for image derivatives' -field.image.storage_settings: - type: field.file.storage_settings +field.storage_settings.image: + type: field.storage_settings.file label: 'Image settings' mapping: default_image: type: field_default_image label: 'Default value' -field.image.field_settings: +field.field_settings.image: type: base_file_field_field_settings label: 'Image settings' mapping: @@ -117,28 +117,12 @@ field.image.field_settings: type: field_default_image label: 'Default value' -field.image.value: +field.value.image: type: sequence label: 'Default value' sequence: - - type: mapping + - type: field_default_image label: 'Default image' - mapping: - fid: - type: integer - label: 'File ID' - alt: - type: string - label: 'Alternative text' - title: - type: string - label: 'Title text' - width: - type: integer - label: 'Width' - height: - type: integer - label: 'Height' entity_view_display.field.image: type: entity_field_view_display_base diff --git a/core/modules/options/config/schema/options.schema.yml b/core/modules/options/config/schema/options.schema.yml index f0d444a..a0d2c2b 100644 --- a/core/modules/options/config/schema/options.schema.yml +++ b/core/modules/options/config/schema/options.schema.yml @@ -1,6 +1,6 @@ # Schema for the configuration files of the Options module. -field.list_integer.storage_settings: +field.storage_settings.list_integer: type: mapping label: 'List (integer) settings' mapping: @@ -21,12 +21,11 @@ field.list_integer.storage_settings: type: string label: 'Allowed values function' -field.list_integer.field_settings: - label: 'List (integer)' +field.field_settings.list_integer: + label: 'List (integer) settings' type: mapping - mapping: { } -field.list_integer.value: +field.value.list_integer: type: sequence label: 'Default value' sequence: @@ -37,7 +36,7 @@ field.list_integer.value: type: integer label: 'Value' -field.list_float.storage_settings: +field.storage_settings.list_float: type: mapping label: 'List (float) settings' mapping: @@ -58,12 +57,11 @@ field.list_float.storage_settings: type: string label: 'Allowed values function' -field.list_float.field_settings: - label: 'List (float)' +field.field_settings.list_float: + label: 'List (float) settings' type: mapping - mapping: { } -field.list_float.value: +field.value.list_float: type: sequence label: 'Default value' sequence: @@ -74,7 +72,7 @@ field.list_float.value: type: string label: 'Value' -field.list_string.storage_settings: +field.storage_settings.list_string: type: mapping label: 'List (text) settings' mapping: @@ -95,12 +93,11 @@ field.list_string.storage_settings: type: string label: 'Allowed values function' -field.list_string.field_settings: - label: 'List (float)' +field.field_settings.list_string: + label: 'List (text) settings' type: mapping - mapping: { } -field.list_string.value: +field.value.list_string: type: sequence label: 'Default value' sequence: diff --git a/core/modules/taxonomy/config/schema/taxonomy.schema.yml b/core/modules/taxonomy/config/schema/taxonomy.schema.yml index e9aed2b..bd0bf73 100644 --- a/core/modules/taxonomy/config/schema/taxonomy.schema.yml +++ b/core/modules/taxonomy/config/schema/taxonomy.schema.yml @@ -39,7 +39,7 @@ taxonomy.vocabulary.*: sequence: - type: taxonomy.vocabulary.third_party.[%key] -field.taxonomy_term_reference.storage_settings: +field.storage_settings.taxonomy_term_reference: type: base_entity_reference_field_settings label: 'Taxonomy term reference settings' mapping: @@ -60,7 +60,7 @@ field.taxonomy_term_reference.storage_settings: type: integer value: 'Parent' -field.taxonomy_term_reference.field_settings: +field.field_settings.taxonomy_term_reference: type: mapping label: 'Taxonomy term reference settings' mapping: @@ -68,7 +68,7 @@ field.taxonomy_term_reference.field_settings: type: string label: 'Reference method' -field.taxonomy_term_reference.value: +field.value.taxonomy_term_reference: type: sequence label: 'Default values' sequence: diff --git a/core/modules/text/config/schema/text.schema.yml b/core/modules/text/config/schema/text.schema.yml index f211cbf..84beb56 100644 --- a/core/modules/text/config/schema/text.schema.yml +++ b/core/modules/text/config/schema/text.schema.yml @@ -8,7 +8,7 @@ text.settings: type: integer label: 'Default summary length' -field.text.storage_settings: +field.storage_settings.text: type: mapping label: 'Text (formatted) settings' mapping: @@ -16,13 +16,11 @@ field.text.storage_settings: type: integer label: 'Maximum length' -field.text.field_settings: +field.field_settings.text: type: mapping label: 'Text (formatted) settings' - sequence: - - type: string -field.text.value: +field.value.text: type: sequence label: 'Default value' sequence: @@ -36,17 +34,15 @@ field.text.value: type: string label: 'Text format' -field.text_long.storage_settings: +field.storage_settings.text_long: label: 'Text (formatted, long) settings' type: mapping - mapping: { } -field.text_long.field_settings: +field.field_settings.text_long: label: 'Text (formatted, long) settings' type: mapping - mapping: { } -field.text_long.value: +field.value.text_long: type: sequence label: 'Default value' sequence: @@ -60,12 +56,11 @@ field.text_long.value: type: string label: 'Text format' -field.text_with_summary.storage_settings: +field.storage_settings.text_with_summary: label: 'Text (formatted, long, with summary) settings' type: mapping - mapping: { } -field.text_with_summary.field_settings: +field.field_settings.text_with_summary: type: mapping label: 'Text (formatted, long, with summary) settings' mapping: @@ -73,7 +68,7 @@ field.text_with_summary.field_settings: type: boolean label: 'Summary input' -field.text_with_summary.value: +field.value.text_with_summary: type: sequence label: 'Default value' sequence: