Issue #3212398 by jake_milburn: [D7] Field API assumes serial/integer entity IDs, but the entity system does not

merge-requests/2343/head
mcdruid 2022-05-27 11:58:35 +01:00
parent d6e292baeb
commit 74e6ff207b
3 changed files with 44 additions and 0 deletions

View File

@ -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) {

View File

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

View File

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