Skip to content

Instantly share code, notes, and snippets.

@MustafaRaarujeed
Last active September 27, 2020 01:01
Show Gist options
  • Save MustafaRaarujeed/93190b38d17dd5340b9323c57b635efd to your computer and use it in GitHub Desktop.
Save MustafaRaarujeed/93190b38d17dd5340b9323c57b635efd to your computer and use it in GitHub Desktop.
<?php
use \Drupal\field\Entity\FieldConfig;
use \Drupal\field\Entity\FieldStorageConfig;
/**
* Change field_number from Number (integer) to Text (formatted)
*/
function field_migration_medium_update_9001() {
$entityType = 'node';
$oldFieldName = 'field_number';
$table = $entityType . '__' . $oldFieldName;
$revisionTable = $entityType . '_revision__' . $oldFieldName;
$newFieldsArray = [];
$database = \Drupal::database();
$rows = NULL;
$revisionRows = NULL;
if ($database->schema()->tableExists($table)) {
$rows = $database->select($table, 'n')->fields('n')->execute()
->fetchAll();
$revisionRows = $database->select($revisionTable, 'n')->fields('n')->execute()
->fetchAll();
}
// Get field storage config.
$fieldStorage = FieldStorageConfig::loadByName($entityType, $oldFieldName);
// Check if field storage config exist.
if (is_null($fieldStorage)) {
return t('Field Storage does not exist');
}
$newFieldStorage = $fieldStorage->toArray();
$newFieldStorage['type'] = 'text';
$newFieldStorage['settings'] = array(
'max_length' => 255
);
foreach ($fieldStorage->getBundles() as $bundle => $label) {
$field = FieldConfig::loadByName($entityType, $bundle, $oldFieldName);
$newField = $field->toArray();
$newField['field_type'] = 'text';
$newField['settings'] = array(
'max_length' => 255
);
$newFieldsArray[] = $newField;
}
$fieldStorage->delete();
field_purge_batch(40);
// Create new field storage.
$newFieldStorage = FieldStorageConfig::create($newFieldStorage);
$newFieldStorage->save();
// Create new fields.
foreach ($newFieldsArray as $field) {
$fieldConfig = FieldConfig::create($field);
$fieldConfig->save();
}
// Restore existing data in new fields.
if (!is_null($rows)) {
foreach ($rows as $row) {
$database->insert($table)
->fields((array) $row)
->execute();
}
}
if (!is_null($revisionRows)) {
foreach ($revisionRows as $row) {
$database->insert($revisionTable)
->fields((array) $row)
->execute();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment