From 076a419c5f174cc4f158092f847775b1adeb37cb Mon Sep 17 00:00:00 2001 From: Dane Powell Date: Thu, 26 Oct 2017 15:03:44 -0700 Subject: [PATCH] Issue #2915036 by Dane Powell, tim.plunkett: Fixed view modes not updating in response to new fields. --- core/modules/field/field.module | 43 ++++++++++++++++ .../tests/src/Kernel/DisplayModeUpdateTest.php | 59 ++++++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 core/modules/field/tests/src/Kernel/DisplayModeUpdateTest.php diff --git a/core/modules/field/field.module b/core/modules/field/field.module index 1a18b91d73..166abf4e2c 100644 --- a/core/modules/field/field.module +++ b/core/modules/field/field.module @@ -6,6 +6,8 @@ */ use Drupal\Core\Config\ConfigImporter; +use Drupal\Core\Entity\Entity\EntityFormDisplay; +use Drupal\Core\Entity\Entity\EntityViewDisplay; use Drupal\Core\Entity\EntityTypeInterface; use Drupal\Core\Entity\DynamicallyFieldableEntityStorageInterface; use Drupal\field\ConfigImporterFieldPurger; @@ -347,6 +349,47 @@ function field_form_config_admin_import_form_alter(&$form, FormStateInterface $f } } +/** + * Implements hook_ENTITY_TYPE_insert() for 'field_config'. + * + * Allow other view modes to update their configuration for the new field. + * Otherwise, configuration for view modes won't get updated until the mode + * is used for the first time, creating noise in config diffs. + * + * @see https://www.drupal.org/node/2915036 + */ +function field_field_config_insert(FieldConfigInterface $field) { + if ($field->isSyncing()) { + // Don't change anything during a configuration sync. + return; + } + + $entity_type_id = $field->getTargetEntityTypeId(); + $bundle = $field->getTargetBundle(); + + $entity_display_repository = \Drupal::service('entity_display.repository'); + $view_modes = $entity_display_repository->getViewModes($entity_type_id); + $form_modes = $entity_display_repository->getFormModes($entity_type_id); + + // Update view modes. + foreach ($view_modes as $view_mode_id => $view_mode) { + if ($view_mode['status']) { + if ($display = EntityViewDisplay::load($entity_type_id . '.' . $bundle . '.' . $view_mode_id)) { + $display->save(); + } + } + } + + // Update form modes. + foreach ($form_modes as $form_mode_id => $form_mode) { + if ($form_mode['status']) { + if ($form_display = EntityFormDisplay::load($entity_type_id . '.' . $bundle . '.' . $form_mode_id)) { + $form_display->save(); + } + } + } +} + /** * Implements hook_ENTITY_TYPE_update() for 'field_storage_config'. * diff --git a/core/modules/field/tests/src/Kernel/DisplayModeUpdateTest.php b/core/modules/field/tests/src/Kernel/DisplayModeUpdateTest.php new file mode 100644 index 0000000000..7773239f0d --- /dev/null +++ b/core/modules/field/tests/src/Kernel/DisplayModeUpdateTest.php @@ -0,0 +1,59 @@ + 'entity_test.foobar', + 'targetEntityType' => 'entity_test', + 'status' => TRUE, + 'enabled' => TRUE, + ])->save(); + + $display = EntityViewDisplay::create([ + 'targetEntityType' => 'entity_test', + 'bundle' => 'entity_test', + 'mode' => 'foobar', + 'status' => TRUE, + ]); + $display->save(); + $this->assertArrayNotHasKey('field_test', \Drupal::config($config_name)->get('hidden')); + + $field_storage = FieldStorageConfig::create([ + 'field_name' => 'field_test', + 'entity_type' => 'entity_test', + 'type' => 'test_field', + 'cardinality' => 1, + ]); + $field_storage->save(); + + FieldConfig::create([ + 'field_storage' => $field_storage, + 'bundle' => 'entity_test', + ])->save(); + + $display = EntityViewDisplay::load('entity_test.entity_test.foobar'); + $this->assertArrayHasKey('field_test', \Drupal::config($config_name)->get('hidden')); + + } + +} -- 2.14.1