From 74e6ff207b87af16334bc7b4ba862d2e965840af Mon Sep 17 00:00:00 2001 From: mcdruid Date: Fri, 27 May 2022 11:58:35 +0100 Subject: [PATCH] Issue #3212398 by jake_milburn: [D7] Field API assumes serial/integer entity IDs, but the entity system does not --- .../field_sql_storage.module | 12 ++++++++++ .../field_sql_storage/field_sql_storage.test | 23 +++++++++++++++++++ modules/field_ui/field_ui.admin.inc | 9 ++++++++ 3 files changed, 44 insertions(+) diff --git a/modules/field/modules/field_sql_storage/field_sql_storage.module b/modules/field/modules/field_sql_storage/field_sql_storage.module index deb08d0dac6..63161ab7d1d 100644 --- a/modules/field/modules/field_sql_storage/field_sql_storage.module +++ b/modules/field/modules/field_sql_storage/field_sql_storage.module @@ -212,6 +212,18 @@ function _field_sql_storage_schema($field) { ), ); + // If the target entity type uses a string for its entity ID then update + // the fields entity_id and revision_id columns from INT to VARCHAR. + if (!empty($field['entity_id_type']) && $field['entity_id_type'] === 'string') { + $current['fields']['entity_id']['type'] = 'varchar'; + $current['fields']['entity_id']['length'] = 128; + unset($current['fields']['entity_id']['unsigned']); + + $current['fields']['revision_id']['type'] = 'varchar'; + $current['fields']['revision_id']['length'] = 128; + unset($current['fields']['revision_id']['unsigned']); + } + $field += array('columns' => array(), 'indexes' => array(), 'foreign keys' => array()); // Add field columns. foreach ($field['columns'] as $column_name => $attributes) { diff --git a/modules/field/modules/field_sql_storage/field_sql_storage.test b/modules/field/modules/field_sql_storage/field_sql_storage.test index e46677be9c2..ad8d74926b9 100644 --- a/modules/field/modules/field_sql_storage/field_sql_storage.test +++ b/modules/field/modules/field_sql_storage/field_sql_storage.test @@ -104,6 +104,29 @@ class FieldSqlStorageTestCase extends DrupalWebTestCase { $this->assertFalse(array_key_exists($unavailable_language, $entity->{$this->field_name}), 'Field translation in an unavailable language ignored'); } + /** + * Tests adding a field with an entity ID type of string. + */ + function testFieldSqlSchemaForEntityWithStringIdentifier() { + // Test programmatically adding field with string ID. + $field_name = 'string_id_example'; + $field = array('field_name' => $field_name, 'type' => 'text', 'settings' => array('max_length' => 255), 'entity_id_type' => 'string'); + field_create_field($field); + $schema = drupal_get_schema('field_data_' . $field_name); + + $this->assertEqual($schema['fields']['entity_id']['type'], 'varchar'); + $this->assertEqual($schema['fields']['revision_id']['type'], 'varchar'); + + // Test programmatically adding field with default ID(int). + $field_name = 'default_id_example'; + $field = array('field_name' => $field_name, 'type' => 'text', 'settings' => array('max_length' => 255)); + field_create_field($field); + $schema = drupal_get_schema('field_data_' . $field_name); + + $this->assertEqual($schema['fields']['entity_id']['type'], 'int'); + $this->assertEqual($schema['fields']['revision_id']['type'], 'int'); + } + /** * Reads mysql to verify correct data is * written when using insert and update. diff --git a/modules/field_ui/field_ui.admin.inc b/modules/field_ui/field_ui.admin.inc index 1bdaa45ddce..8ae489f3036 100644 --- a/modules/field_ui/field_ui.admin.inc +++ b/modules/field_ui/field_ui.admin.inc @@ -795,6 +795,14 @@ function field_ui_field_overview_form_submit($form, &$form_state) { $destinations = array(); + // Check if the target entity uses a non numeric ID. + $entity_info = entity_get_info($entity_type); + if (!empty($entity_info['entity_id_type']) && $entity_info['entity_id_type'] === 'string') { + $entity_id_type = 'string'; + } else { + $entity_id_type = NULL; + } + // Create new field. $field = array(); if (!empty($form_values['_add_new_field']['field_name'])) { @@ -804,6 +812,7 @@ function field_ui_field_overview_form_submit($form, &$form_state) { 'field_name' => $values['field_name'], 'type' => $values['type'], 'translatable' => $values['translatable'], + 'entity_id_type' => $entity_id_type, ); $instance = array( 'field_name' => $field['field_name'],