diff --git a/core/lib/Drupal/Core/Database/Driver/mysql/Schema.php b/core/lib/Drupal/Core/Database/Driver/mysql/Schema.php index 51b7c1aa3a..44b560c242 100644 --- a/core/lib/Drupal/Core/Database/Driver/mysql/Schema.php +++ b/core/lib/Drupal/Core/Database/Driver/mysql/Schema.php @@ -434,9 +434,9 @@ public function addField($table, $field, $spec, $keys_new = []) { ->execute(); } if (isset($spec['initial_from_field'])) { - if (is_array($spec['initial_from_field'])) { - $expression = 'COALESCE(' . $spec['initial_from_field']['field_name'] . ', :default_initial_value)'; - $arguments = [':default_initial_value' => $spec['initial_from_field']['default_value']]; + if (isset($spec['initial'])) { + $expression = 'COALESCE(' . $spec['initial_from_field'] . ', :default_initial_value)'; + $arguments = [':default_initial_value' => $spec['initial']]; } else { $expression = $spec['initial_from_field']; diff --git a/core/lib/Drupal/Core/Database/Driver/pgsql/Schema.php b/core/lib/Drupal/Core/Database/Driver/pgsql/Schema.php index 3d8019c23e..58c6587661 100644 --- a/core/lib/Drupal/Core/Database/Driver/pgsql/Schema.php +++ b/core/lib/Drupal/Core/Database/Driver/pgsql/Schema.php @@ -568,9 +568,9 @@ public function addField($table, $field, $spec, $new_keys = []) { ->execute(); } if (isset($spec['initial_from_field'])) { - if (is_array($spec['initial_from_field'])) { - $expression = 'COALESCE(' . $spec['initial_from_field']['field_name'] . ', :default_initial_value)'; - $arguments = [':default_initial_value' => $spec['initial_from_field']['default_value']]; + if (isset($spec['initial'])) { + $expression = 'COALESCE(' . $spec['initial_from_field'] . ', :default_initial_value)'; + $arguments = [':default_initial_value' => $spec['initial']]; } else { $expression = $spec['initial_from_field']; diff --git a/core/lib/Drupal/Core/Database/Driver/sqlite/Schema.php b/core/lib/Drupal/Core/Database/Driver/sqlite/Schema.php index 40222e0741..8c0ce54dc4 100644 --- a/core/lib/Drupal/Core/Database/Driver/sqlite/Schema.php +++ b/core/lib/Drupal/Core/Database/Driver/sqlite/Schema.php @@ -333,9 +333,9 @@ public function addField($table, $field, $specification, $keys_new = []) { ->execute(); } if (isset($specification['initial_from_field'])) { - if (is_array($specification['initial_from_field'])) { - $expression = 'COALESCE(' . $specification['initial_from_field']['field_name'] . ', :default_initial_value)'; - $arguments = [':default_initial_value' => $specification['initial_from_field']['default_value']]; + if (isset($specification['initial'])) { + $expression = 'COALESCE(' . $specification['initial_from_field'] . ', :default_initial_value)'; + $arguments = [':default_initial_value' => $specification['initial']]; } else { $expression = $specification['initial_from_field']; @@ -366,9 +366,9 @@ public function addField($table, $field, $specification, $keys_new = []) { } elseif (isset($specification['initial_from_field'])) { // If we have a initial value, copy it over. - if (is_array($specification['initial_from_field'])) { - $expression = 'COALESCE(' . $specification['initial_from_field']['field_name'] . ', :default_initial_value)'; - $arguments = [':default_initial_value' => $specification['initial_from_field']['default_value']]; + if (isset($specification['initial'])) { + $expression = 'COALESCE(' . $specification['initial_from_field'] . ', :default_initial_value)'; + $arguments = [':default_initial_value' => $specification['initial']]; } else { $expression = $specification['initial_from_field']; diff --git a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php index f94ad4ff2e..9c123417ca 100644 --- a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php +++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php @@ -1829,12 +1829,7 @@ protected function getSharedTableFieldSchema(FieldStorageDefinitionInterface $st $initial_value = reset($initial_storage_value); } - if ($initial_value_from_field = $storage_definition->getInitialValueFromField()) { - $initial_value_field_name = $initial_value_from_field['field_name']; - // @todo Implement initial default value support for multi-value fields - // in https://www.drupal.org/node/2883851. - $initial_default_value = reset($initial_value_from_field['default_value']); - + if ($initial_value_field_name = $storage_definition->getInitialValueFromField()) { // Check that the field used for populating initial values is valid. We // must use the last installed version of that, as the new field might // be created in an update function and the storage definition of the @@ -1852,10 +1847,7 @@ protected function getSharedTableFieldSchema(FieldStorageDefinitionInterface $st throw new FieldException("Illegal initial value definition on {$storage_definition->getName()}: Both fields have to be stored in the shared entity tables."); } - $initial_value_from_field = [ - 'field_name' => $table_mapping->getColumnNames($initial_value_from_field['field_name']), - 'default_value' => $initial_default_value, - ]; + $initial_value_from_field = $table_mapping->getColumnNames($initial_value_field_name); } } @@ -1889,13 +1881,8 @@ protected function getSharedTableFieldSchema(FieldStorageDefinitionInterface $st if ($initial_value && isset($initial_value[$field_column_name])) { $schema['fields'][$schema_field_name]['initial'] = drupal_schema_get_field_value($column_schema, $initial_value[$field_column_name]); } - elseif (!empty($initial_value_from_field)) { - $schema['fields'][$schema_field_name]['initial_from_field'] = [ - 'field_name' => $initial_value_from_field['field_name'][$field_column_name], - 'default_value' => $initial_value_from_field['default_value'] - ? drupal_schema_get_field_value($column_schema, $initial_value_from_field['default_value'][$field_column_name]) - : NULL, - ]; + if (!empty($initial_value_from_field)) { + $schema['fields'][$schema_field_name]['initial_from_field'] = $initial_value_from_field[$field_column_name]; } } diff --git a/core/lib/Drupal/Core/Field/BaseFieldDefinition.php b/core/lib/Drupal/Core/Field/BaseFieldDefinition.php index f787232a60..8a0cfd3752 100644 --- a/core/lib/Drupal/Core/Field/BaseFieldDefinition.php +++ b/core/lib/Drupal/Core/Field/BaseFieldDefinition.php @@ -604,24 +604,8 @@ public function getInitialValueFromField() { * @return $this */ public function setInitialValueFromField($field_name, $default_value = NULL) { - if ($default_value === NULL) { - $default_value = []; - } - // Unless the default value is an empty array, we may need to transform it. - if (!is_array($default_value) || !empty($default_value)) { - if (!is_array($default_value)) { - $default_value = [[$this->getMainPropertyName() => $default_value]]; - } - elseif (is_array($default_value) && !is_numeric(array_keys($default_value)[0])) { - $default_value = [0 => $default_value]; - } - } - - $this->definition['initial_value_from_field'] = [ - 'field_name' => $field_name, - 'default_value' => $default_value, - ]; - + $this->definition['initial_value_from_field'] = $field_name; + $this->setInitialValue($default_value); return $this; } diff --git a/core/tests/Drupal/KernelTests/Core/Database/SchemaTest.php b/core/tests/Drupal/KernelTests/Core/Database/SchemaTest.php index 321f720ab1..82280369b2 100644 --- a/core/tests/Drupal/KernelTests/Core/Database/SchemaTest.php +++ b/core/tests/Drupal/KernelTests/Core/Database/SchemaTest.php @@ -530,10 +530,8 @@ public function testSchemaAddField() { ['not null' => TRUE, 'initial_from_field' => 'serial_column'], [ 'not null' => TRUE, - 'initial_from_field' => [ - 'field_name' => 'test_nullable_field', - 'default_value' => 100, - ], + 'initial_from_field' => 'test_nullable_field', + 'initial' => 100, ], ]; @@ -660,7 +658,7 @@ protected function assertFieldCharacteristics($table_name, $field_name, $field_s } // Check that the initial value from another field has been registered. - if (isset($field_spec['initial_from_field']) && !is_array($field_spec['initial_from_field'])) { + if (isset($field_spec['initial_from_field']) && !isset($field_spec['initial'])) { // There should be no row with a value different than // $field_spec['initial_from_field']. $count = db_select($table_name) @@ -671,7 +669,7 @@ protected function assertFieldCharacteristics($table_name, $field_name, $field_s ->fetchField(); $this->assertEqual($count, 0, 'Initial values from another field filled out.'); } - elseif (isset($field_spec['initial_from_field']) && is_array($field_spec['initial_from_field'])) { + elseif (isset($field_spec['initial_from_field']) && isset($field_spec['initial'])) { // There should be no row with a value different than '100'. $count = db_select($table_name) ->fields($table_name, ['serial_column'])