Skip to content

Instantly share code, notes, and snippets.

@elistone
Created November 5, 2021 10:56
Show Gist options
  • Save elistone/6b65740988f96de0d60694068beb3689 to your computer and use it in GitHub Desktop.
Save elistone/6b65740988f96de0d60694068beb3689 to your computer and use it in GitHub Desktop.
Drupal 8/9 - Add new properties to a field type
/**
* Add new property to all fields of type FIELD_TYPE.
*/
function MYMODULE_update_8001() {
$field_type = 'FIELD_TYPE'; // ID of the FieldType you are updating
$new_properties = [
'FIELD_NAME' => [ // Field name should match the name in the schema
'description' => 'FIELD_DESCRIPTION', // Give your field a description
'type' => 'FIELD_TYPE', // @see: https://www.drupal.org/docs/7/api/schema-api/data-types/data-types-overview
]
];
$definition_update_manager = \Drupal::entityDefinitionUpdateManager();
/** @var \Drupal\Core\Entity\EntityFieldManagerInterface $field_manager */
$field_manager = \Drupal::service('entity_field.manager');
/** @var \Drupal\Core\Entity\EntityTypeManager $entity_type_manager */
$entity_type_manager = \Drupal::service('entity_type.manager');
$field_map = $field_manager->getFieldMapByFieldType($field_type);
$schema = \Drupal::database()->schema();
foreach ($field_map as $entity_type_id => $fields) {
$field_manager->clearCachedFieldDefinitions();
$storage_definitions = $field_manager->getFieldStorageDefinitions($entity_type_id);
$storage = $entity_type_manager->getStorage($entity_type_id);
/** @var \Drupal\Core\Entity\Sql\DefaultTableMapping $table_mapping */
$table_mapping = $storage->getTableMapping();
foreach ($fields as $field_name => $field) {
$storage_definition = $storage_definitions[$field_name];
if (!empty($storage_definition)) {
$column_names = $table_mapping->getColumnNames($field_name);
$table_names = [$table_mapping->getFieldTableName($field_name)];
if ($storage_definition->isRevisionable()) {
$table_names[] = $table_mapping->getDedicatedRevisionTableName($storage_definition);
}
foreach ($table_names as $table_name) {
foreach ($new_properties as $property_name => $property_spec) {
if (!$schema->fieldExists($table_name,
$column_names[$property_name])) {
$schema->addField($table_name, $column_names[$property_name],
$property_spec);
}
}
}
$definition_update_manager->updateFieldStorageDefinition($storage_definition);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment