diff --git a/core/modules/config/src/Form/ConfigSync.php b/core/modules/config/src/Form/ConfigSync.php index fef39a4..f73de96 100644 --- a/core/modules/config/src/Form/ConfigSync.php +++ b/core/modules/config/src/Form/ConfigSync.php @@ -37,18 +37,25 @@ class ConfigSync extends FormBase { protected $lock; /** - * The source configuration object. + * The staging configuration object. * * @var \Drupal\Core\Config\StorageInterface */ - protected $sourceStorage; + protected $stagingStorage; /** - * The target configuration object. + * The active configuration object. * * @var \Drupal\Core\Config\StorageInterface */ - protected $targetStorage; + protected $activeStorage; + + /** + * The snapshot configuration object. + * + * @var \Drupal\Core\Config\StorageInterface + */ + protected $snapshotStorage; /** * Event dispatcher. @@ -95,10 +102,12 @@ class ConfigSync extends FormBase { /** * Constructs the object. * - * @param \Drupal\Core\Config\StorageInterface $sourceStorage - * The source storage object. - * @param \Drupal\Core\Config\StorageInterface $targetStorage - * The target storage manager. + * @param \Drupal\Core\Config\StorageInterface $staging_storage + * The source storage. + * @param \Drupal\Core\Config\StorageInterface $active_storage + * The target storage. + * @param \Drupal\Core\Config\StorageInterface $snapshot_storage + * The snapshot storage. * @param \Drupal\Core\Lock\LockBackendInterface $lock * The lock object. * @param \Symfony\Component\EventDispatcher\EventDispatcherInterface $event_dispatcher @@ -114,9 +123,10 @@ class ConfigSync extends FormBase { * @param \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler * The theme handler */ - public function __construct(StorageInterface $sourceStorage, StorageInterface $targetStorage, LockBackendInterface $lock, EventDispatcherInterface $event_dispatcher, ConfigManagerInterface $config_manager, UrlGeneratorInterface $url_generator, TypedConfigManagerInterface $typed_config, ModuleHandlerInterface $module_handler, ThemeHandlerInterface $theme_handler) { - $this->sourceStorage = $sourceStorage; - $this->targetStorage = $targetStorage; + public function __construct(StorageInterface $staging_storage, StorageInterface $active_storage, StorageInterface $snapshot_storage, LockBackendInterface $lock, EventDispatcherInterface $event_dispatcher, ConfigManagerInterface $config_manager, UrlGeneratorInterface $url_generator, TypedConfigManagerInterface $typed_config, ModuleHandlerInterface $module_handler, ThemeHandlerInterface $theme_handler) { + $this->stagingStorage = $staging_storage; + $this->activeStorage = $active_storage; + $this->snapshotStorage = $snapshot_storage; $this->lock = $lock; $this->eventDispatcher = $event_dispatcher; $this->configManager = $config_manager; @@ -133,6 +143,7 @@ public static function create(ContainerInterface $container) { return new static( $container->get('config.storage.staging'), $container->get('config.storage'), + $container->get('config.storage.snapshot'), $container->get('lock'), $container->get('event_dispatcher'), $container->get('config.manager'), @@ -154,14 +165,35 @@ public function getFormId() { * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state) { + $snapshot_comparer = new StorageComparer($this->activeStorage, $this->snapshotStorage, $this->configManager); + if (!$form_state->getUserInput() && $snapshot_comparer->createChangelist()->hasChanges()) { + $change_list = array(); + foreach ($snapshot_comparer->getAllCollectionNames() as $collection) { + foreach ($snapshot_comparer->getChangelist(NULL, $collection) as $config_names) { + if (empty($config_names)) { + continue; + } + foreach ($config_names as $config_name) { + $change_list[] = $config_name; + } + } + } + sort($change_list); + $change_list_render = array( + '#theme' => 'item_list', + '#items' => $change_list, + ); + $change_list_html = drupal_render($change_list_render); + drupal_set_message($this->t('Your current configuration has changed. Changes to these configuration items will be lost on the next synchronization: !changes', array('!changes' => $change_list_html)), 'warning'); + } $form['actions'] = array('#type' => 'actions'); $form['actions']['submit'] = array( '#type' => 'submit', '#value' => $this->t('Import all'), ); - $source_list = $this->sourceStorage->listAll(); - $storage_comparer = new StorageComparer($this->sourceStorage, $this->targetStorage, $this->configManager); + $source_list = $this->stagingStorage->listAll(); + $storage_comparer = new StorageComparer($this->stagingStorage, $this->activeStorage, $this->configManager); if (empty($source_list) || !$storage_comparer->createChangelist()->hasChanges()) { $form['no_changes'] = array( '#type' => 'table', diff --git a/core/modules/config/src/Tests/ConfigExportImportUITest.php b/core/modules/config/src/Tests/ConfigExportImportUITest.php index b3f4905..442ada7 100644 --- a/core/modules/config/src/Tests/ConfigExportImportUITest.php +++ b/core/modules/config/src/Tests/ConfigExportImportUITest.php @@ -121,6 +121,12 @@ public function testExportImport() { $this->drupalGet('node/add'); $this->assertFieldByName("{$this->fieldName}[0][value]", '', 'Widget is displayed'); + + \Drupal::config('system.site') + ->set('slogan', $this->originalSlogan) + ->save(); + $this->drupalGet('admin/config/development/configuration'); + $this->assertText('Your current configuration has changed. Changes to these configuration items will be lost on the next synchronization: system.site'); } /**