Score:2

Update FieldStorageConfig for a field in an update hook properly?

in flag

I need to update the allowed values option on an list_integer field. For reasons at the moment, I can't just update and export the configuration and import it on production until we implement config_ignore. I also do not want to edit several block types to update a few field(s) coming up across several environments - so if I can script it and save time that is what I want to do.

In an update hook, I am trying this:

/**
 * Update the result options for the Result Count field.
 */
function mymodule_update_8001(&$sandbox) {
  $allowed_values = [];

  for ($x = 1; $x < 16; $x++) {
    $allowed_values[$x] = (string) $x;
  }

  $allowed_values[50] = '50';
  $allowed_values[75] = '75';
  $allowed_values[100] = '100';

  $old_config = FieldStorageConfig::load('block_content.field_result_count');
  $new_config = $old_config->createDuplicate();
  $new_config->original = $new_config;
  $new_config->enforceIsNew(FALSE);
  $new_config
    ->setSetting('allowed_values', $allowed_values)
    ->save();
}

It appeared to add the new values to the field, but the terminal spit this out when running the database update:

>  [warning] assert(): Cannot load the "field_storage_config" entity with NULL ID. failed EntityStorageBase.php:249
>  [warning] array_flip(): Can only flip STRING and INTEGER values! EntityStorageBase.php:266

Is this the proper way to update an existing field?

4uk4 avatar
cn flag
Can't you just load, modify and save the config entity? Do you need the three extra lines for creating a duplicate?
Kevin avatar
in flag
So no duplicate needed? Was going off an example I saw online.
4uk4 avatar
cn flag
No, cloning and setting the original is done by core automatically if needed. The example is probably from core entity base classes.
Hermann Schwarz avatar
cn flag
This example (https://www.hook42.com/blog/ride-danger-zone-how-update-drupal-8-field-settings-without-losing-any-data) *doesn't* work because of these lines `$new_config = $old_config->createDuplicate(); $new_config->original = $new_config; $new_config->enforceIsNew(FALSE);`
Score:2
in flag

Was almost there initially, but thanks to 4k4 this is one way to amend an allowed value list with new values:

/**
 * Implements hook_install().
 *
 * The first action updates the result options for the Result Count field.
 * Options should be 1-15, 50, 75 and 100.
 */
function mymodule_update_8001(&$sandbox) {
  $allowed_values = [];

  for ($x = 1; $x < 16; $x++) {
    $allowed_values[$x] = (string) $x;
  }

  $allowed_values[50] = '50';
  $allowed_values[75] = '75';
  $allowed_values[100] = '100';

  $config = FieldStorageConfig::load('ENTITY_TYPE.FIELD_ID');
  $config
    ->setSetting('allowed_values', $allowed_values)
    ->save();
}
mangohost

Post an answer

Most people don’t grasp that asking a lot of questions unlocks learning and improves interpersonal bonding. In Alison’s studies, for example, though people could accurately recall how many questions had been asked in their conversations, they didn’t intuit the link between questions and liking. Across four studies, in which participants were engaged in conversations themselves or read transcripts of others’ conversations, people tended not to realize that question asking would influence—or had influenced—the level of amity between the conversationalists.