Issue #2370305 by Gábor Hojtsy, yched: Refactor field type configuration schemas for DX, easier to find errors

8.0.x
Nathaniel Catchpole 2014-11-24 22:17:32 +00:00
parent 6714300ac1
commit 7822393c30
14 changed files with 271 additions and 354 deletions

View File

@ -378,12 +378,16 @@ field_config_base:
type: boolean
label: 'Translatable'
default_value:
type: field.[%parent.field_type].value
type: sequence
label: 'Default values'
sequence:
- type: field.value.[%parent.%parent.field_type]
label: 'Default value'
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 +421,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: mapping
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,16 +445,13 @@ 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:
type: sequence
field.value.string:
type: mapping
label: 'Default value'
sequence:
- type: mapping
label: 'Default'
mapping:
value:
type: string
@ -444,20 +459,17 @@ 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:
type: sequence
field.value.string_long:
type: mapping
label: 'Default value'
sequence:
- type: mapping
label: 'Default'
mapping:
value:
type: text
@ -465,7 +477,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,16 +485,13 @@ 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:
type: sequence
field.value.uri:
type: mapping
label: 'Default value'
sequence:
- type: mapping
label: 'Default'
mapping:
value:
type: string
@ -490,20 +499,17 @@ 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:
type: sequence
field.value.created:
type: mapping
label: 'Default value'
sequence:
- type: mapping
label: 'Default'
mapping:
value:
type: integer
@ -511,20 +517,17 @@ 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:
type: sequence
field.value.changed:
type: mapping
label: 'Default value'
sequence:
- type: mapping
label: 'Default'
mapping:
value:
type: integer
@ -532,7 +535,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 +543,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,12 +554,9 @@ field.entity_reference.field_settings:
type: entity_reference.[%parent.handler].handler_settings
label: 'Reference method settings'
field.entity_reference.value:
type: sequence
field.value.entity_reference:
type: mapping
label: 'Default value'
sequence:
- type: mapping
label: 'Default'
mapping:
target_id:
type: string
@ -567,7 +567,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,16 +578,12 @@ field.boolean.storage_settings:
type: string
label: 'Off label'
field.boolean.field_settings:
field.field_settings.boolean:
label: 'Boolean settings'
type: sequence
type: mapping
field.boolean.value:
type: sequence
label: 'Default value'
sequence:
- type: mapping
label: 'Default'
field.value.boolean:
type: mapping
mapping:
value:
type: integer
@ -595,25 +591,20 @@ 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:
type: sequence
field.value.email:
type: mapping
label: 'Default value'
sequence:
- type: mapping
label: 'Default'
mapping:
value:
type: email
@ -621,7 +612,7 @@ field.email.value:
# Schema for the configuration of the Integer field type.
field.integer.storage_settings:
field.storage_settings.integer:
type: mapping
label: 'Integer settings'
mapping:
@ -632,7 +623,7 @@ field.integer.storage_settings:
type: string
label: 'Database storage size'
field.integer.field_settings:
field.field_settings.integer:
type: mapping
label: 'Integer'
mapping:
@ -649,11 +640,8 @@ field.integer.field_settings:
type: string
label: 'Suffix'
field.integer.value:
type: sequence
label: 'Default value'
sequence:
- type: mapping
field.value.integer:
type: mapping
label: 'Default value'
mapping:
value:
@ -662,7 +650,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:
@ -673,9 +661,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
@ -690,11 +678,8 @@ field.decimal.field_settings:
type: string
label: 'Suffix'
field.decimal.value:
type: sequence
label: 'Default value'
sequence:
- type: mapping
field.value.decimal:
type: mapping
label: 'Default value'
mapping:
value:
@ -703,16 +688,13 @@ field.decimal.value:
# Schema for the configuration of the Float field type.
field.float.storage_settings:
type: sequence
label: 'Float settings'
sequence:
- type: string
label: 'setting'
field.float.field_settings:
field.storage_settings.float:
type: mapping
label: 'Float'
label: 'Float settings'
field.field_settings.float:
type: mapping
label: 'Float settings'
mapping:
min:
type: float
@ -727,11 +709,8 @@ field.float.field_settings:
type: string
label: 'Suffix'
field.float.value:
type: sequence
label: 'Default value'
sequence:
- type: mapping
field.value.float:
type: mapping
label: 'Default value'
mapping:
value:

View File

@ -154,8 +154,12 @@ class BaseFieldOverride extends FieldConfigBase {
* 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.

View File

@ -52,40 +52,38 @@ 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:
type: sequence
label: 'Settings'
sequence:
- type: mapping
label: 'Settings'
field.value.comment:
type: mapping
label: 'Default value'
mapping:
status:
type: integer
label: 'Status'
label: 'Comment status'
cid:
type: integer
label: 'Status'
label: 'Last comment ID'
last_comment_timestamp:
type: integer
label: 'Last comment timestamp'
last_comment_name:
type: integer
label: 'Name'
label: 'Last comment name'
last_comment_uid:
type: integer
label: 'UID'
label: 'Last comment user ID'
comment_count:
type: integer
label: 'Count'
label: 'Number of comments'
field.comment.field_settings:
field.field_settings.comment:
type: mapping
label: 'Comment settings'
mapping:

View File

@ -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,20 @@ 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:
type: sequence
field.value.datetime:
type: mapping
label: 'Default value'
sequence:
- type: sequence
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'
field.formatter.settings.datetime_default:
type: mapping

View File

@ -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'

View File

@ -138,9 +138,13 @@ class FieldConfig extends FieldConfigBase implements FieldConfigInterface {
$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 @@ class FieldConfig extends FieldConfigBase implements FieldConfigInterface {
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);
}

View File

@ -253,6 +253,13 @@ class FieldStorageConfig extends ConfigEntityBase implements FieldStorageConfigI
// 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 @@ class FieldStorageConfig extends ConfigEntityBase implements FieldStorageConfigI
}
$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 @@ class FieldStorageConfig extends ConfigEntityBase implements FieldStorageConfigI
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 @@ class FieldStorageConfig extends ConfigEntityBase implements FieldStorageConfigI
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));

View File

@ -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:
type: sequence
field.value.file:
type: mapping
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:

View File

@ -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,9 @@ field.image.field_settings:
type: field_default_image
label: 'Default value'
field.image.value:
type: sequence
field.value.image:
type: field_default_image
label: 'Default value'
sequence:
- type: mapping
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'
field.formatter.settings.image:
type: mapping

View File

@ -44,8 +44,6 @@ class FieldSettings extends ProcessPluginBase {
* A valid array of settings.
*/
public function getSettings($field_type, $global_settings, $widget_settings) {
$image_label = isset($widget_settings['alt']) ? $widget_settings['alt'] : '';
$title_label = isset($widget_settings['title']) ? $widget_settings['title'] : '';
$max_length = isset($global_settings['max_length']) ? $global_settings['max_length'] : '';
$max_length = empty($max_length) ? 255 : $max_length;
if (isset($global_settings['allowed_values'])) {
@ -74,12 +72,6 @@ class FieldSettings extends ProcessPluginBase {
'text' => array(
'max_length' => $max_length,
),
'image' => array(
'column_groups' => array(
'alt' => array('label' => $image_label),
'title' => array('label' => $title_label),
),
),
'datetime' => array('datetime_type' => 'datetime'),
'list_string' => array(
'allowed_values' => $allowed_values,

View File

@ -70,8 +70,6 @@ class MigrateFieldTest extends MigrateDrupalTestBase {
$field_storage = entity_load('field_storage_config', 'node.field_test_imagefield');
$this->assertEqual($field_storage->type, "image", t('Field type is @fieldtype. It should be image.', array('@fieldtype' => $field_storage->type)));
$settings = $field_storage->getSettings();
$this->assertEqual($settings['column_groups']['alt']['label'], 'Test alt');
$this->assertEqual($settings['column_groups']['title']['label'], 'Test title');
$this->assertEqual($settings['target_type'], 'file');
$this->assertEqual($settings['uri_scheme'], 'public');
$this->assertEqual($settings['default_image']['fid'], '');

View File

@ -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,23 +21,19 @@ 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:
type: sequence
field.value.list_integer:
type: mapping
label: 'Default value'
sequence:
- type: mapping
label: 'Default'
mapping:
value:
type: integer
label: 'Value'
field.list_float.storage_settings:
field.storage_settings.list_float:
type: mapping
label: 'List (float) settings'
mapping:
@ -58,23 +54,19 @@ 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:
type: sequence
field.value.list_float:
type: mapping
label: 'Default value'
sequence:
- type: mapping
label: 'Default'
mapping:
value:
type: string
label: 'Value'
field.list_string.storage_settings:
field.storage_settings.list_string:
type: mapping
label: 'List (text) settings'
mapping:
@ -95,17 +87,13 @@ 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:
type: sequence
field.value.list_string:
type: mapping
label: 'Default value'
sequence:
- type: mapping
label: 'Default'
mapping:
value:
type: string

View File

@ -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,11 +68,8 @@ field.taxonomy_term_reference.field_settings:
type: string
label: 'Reference method'
field.taxonomy_term_reference.value:
type: sequence
label: 'Default values'
sequence:
- type: mapping
field.value.taxonomy_term_reference:
type: mapping
label: 'Default value'
mapping:
target_id:

View File

@ -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,18 +16,13 @@ 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:
type: sequence
field.value.text:
type: mapping
label: 'Default value'
sequence:
- type: mapping
label: 'Default'
mapping:
value:
type: label
@ -36,22 +31,17 @@ 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:
type: sequence
field.value.text_long:
type: mapping
label: 'Default value'
sequence:
- type: mapping
label: 'Default'
mapping:
value:
type: text
@ -60,12 +50,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,12 +62,9 @@ field.text_with_summary.field_settings:
type: boolean
label: 'Summary input'
field.text_with_summary.value:
type: sequence
field.value.text_with_summary:
type: mapping
label: 'Default value'
sequence:
- type: mapping
label: 'Default'
mapping:
value:
type: text