Convert a Plain Text field to a Formatted (Rich) one
String and text fields have different table structure (additional format column) so, to convert a Text (plain) to Text (formatted) you have to create a new field and migrate the old data in it.
Here is a snippet of how would you migrate the data from a Plain Text field(field_my_old_field) to a new Formatted Text field(field_my_new_field) by using the configuration YML files of exported fields. Note that if you have a deployment workflow and you do it in HOOK_update()
then, you have to ensure the Database updates are triggered before the configurations are imported.
/**
* Implements hook_update().
*/
function HOOK_update_8001() {
try {
$config_path = config_get_config_directory(CONFIG_SYNC_DIRECTORY);
$source = new FileStorage($config_path);
$entityManager = \Drupal::entityTypeManager();
// Create field storage.
$entityManager->getStorage('field_storage_config')->create($source->read('field.storage.node.field_my_new_field'))->save();
// Create field instances.
$entityManager->getStorage('field_config')->create($source->read('field.field.node.content_type_1.field_my_new_field'))->save();
$entityManager->getStorage('field_config')->create($source->read('field.field.node.content_type_2.field_my_new_field'))->save();
}
catch (Exception $e) {
// Just making sure this won't brake anything.
}
$nids = \Drupal::entityQuery('node')->condition('type', [
'content_type_1',
'content_type_2',
], 'IN')->execute();
$nodes = \Drupal::entityTypeManager()->getStorage('node')->loadMultiple($nids);
$cnt = 0;
/** @var \Drupal\node\Entity\Node $node */
foreach ($nodes as $node) {
if ($node->hasField('field_my_new_field') && !$node->get('field_my_new_field')->isEmpty()) {
continue;
}
$node->field_my_new_field->value = $node->field_my_old_field->value;
$node->field_my_new_field->format = 'plain_text';
$node->save();
++$cnt;
}
drupal_set_message($cnt . ' fields migrated.');
}