diff --git a/config/install/config_ignore.settings.yml b/config/install/config_ignore.settings.yml
index 629b342..c89e103 100644
--- a/config/install/config_ignore.settings.yml
+++ b/config/install/config_ignore.settings.yml
@@ -1 +1,2 @@
ignored_config_entities: { }
+ignored_config_collections: { }
diff --git a/config/schema/config_ignore.schema.yml b/config/schema/config_ignore.schema.yml
index 9930f0d..889c34c 100644
--- a/config/schema/config_ignore.schema.yml
+++ b/config/schema/config_ignore.schema.yml
@@ -7,3 +7,8 @@ config_ignore.settings:
label: 'List of ignored configurations'
sequence:
type: string
+ ignored_config_collections:
+ type: sequence
+ label: 'List of ignored configuration storage collections'
+ sequence:
+ type: string
diff --git a/config_ignore.api.php b/config_ignore.api.php
index 89e9f91..1054e84 100644
--- a/config_ignore.api.php
+++ b/config_ignore.api.php
@@ -19,5 +19,12 @@ function hook_config_ignore_settings_alter(array &$settings) {
}
/**
+ * Alter the list of config entities that should be ignored.
+ */
+function hook_config_ignore_collections_alter(array &$collections) {
+ $collections[] = 'language.*';
+}
+
+/**
* @} End of "addtogroup hooks".
*/
diff --git a/config_ignore.install b/config_ignore.install
index 222809e..621b61c 100644
--- a/config_ignore.install
+++ b/config_ignore.install
@@ -11,3 +11,11 @@
function config_ignore_update_8201() {
\Drupal::getContainer()->get('module_installer')->install(['config_filter']);
}
+
+/**
+ * Update schema with storage collection ignore value.
+ */
+function config_ignore_update_8202() {
+ $config = \Drupal::configFactory()->getEditable('config_ignore.settings');
+ $config->set('ignored_config_collections', [])->save();
+}
diff --git a/src/Form/Settings.php b/src/Form/Settings.php
index 8029db0..f1f0ecc 100644
--- a/src/Form/Settings.php
+++ b/src/Form/Settings.php
@@ -54,6 +54,16 @@ Examples:
'#default_value' => implode(PHP_EOL, $config_ignore_settings->get('ignored_config_entities')),
'#size' => 60,
];
+
+ $form['ignored_config_collections'] = [
+ '#type' => 'textarea',
+ '#rows' => 10,
+ '#title' => $this->t('Configuration storage collections to ignore'),
+ '#description' => $this->t('Use the same format for including/excluding/wildcarding as above (e.g. language.* for ignoring all language collections).'),
+ '#default_value' => implode(PHP_EOL, $config_ignore_settings->get('ignored_config_collections')),
+ '#size' => 60,
+ ];
+
return parent::buildForm($form, $form_state);
}
@@ -66,6 +76,9 @@ Examples:
$config_ignore_settings_array = preg_split("[\n|\r]", $values['ignored_config_entities']);
$config_ignore_settings_array = array_filter($config_ignore_settings_array);
$config_ignore_settings->set('ignored_config_entities', $config_ignore_settings_array);
+ $config_collection_storage_array = preg_split("[\n|\r]", $values['ignored_config_collections']);
+ $config_collection_storage_array = array_filter($config_collection_storage_array);
+ $config_ignore_settings->set('ignored_config_collections', $config_collection_storage_array);
$config_ignore_settings->save();
parent::submitForm($form, $form_state);
diff --git a/src/Plugin/ConfigFilter/CollectionIgnore.php b/src/Plugin/ConfigFilter/CollectionIgnore.php
new file mode 100644
index 0000000..a5f1d50
--- /dev/null
+++ b/src/Plugin/ConfigFilter/CollectionIgnore.php
@@ -0,0 +1,82 @@
+get('config.factory')->get('config_ignore.settings')->get('ignored_config_collections') ?: [];
+ // Allow hooks to alter the list.
+ $container->get('module_handler')->invokeAll('config_ignore_collections_alter', [&$ignored_collections]);
+ // Set the list in the plugin configuration.
+ $configuration['ignored_collections'] = $ignored_collections;
+
+ return new static(
+ $configuration,
+ $plugin_id,
+ $plugin_definition
+ );
+ }
+
+ /**
+ * Match a storage collection name against list of ignored collections.
+ *
+ * @param string $collection_name
+ * The name of the collection to match against all ignored collections.
+ *
+ * @return bool
+ * True, if the storage collection is to be ignored, false otherwise.
+ */
+ protected function matchCollectionName($collection_name) {
+ if (Settings::get('config_ignore_deactivate')) {
+ // Allow deactivating config_ignore in settings.php. Do not match any name
+ // in that case and allow a normal configuration import to happen.
+ return FALSE;
+ }
+
+ // If the string is an excluded collection, don't ignore it.
+ if (in_array(static::FORCE_EXCLUSION_PREFIX . $collection_name, $this->configuration['ignored_collections'], TRUE)) {
+ return FALSE;
+ }
+
+ foreach ($this->configuration['ignored_collections'] as $ignored) {
+ if (fnmatch($ignored, $collection_name)) {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function filterGetAllCollectionNames(array $collections) {
+ $collections = array_filter($collections, function ($collection) {
+ return !$this->matchCollectionName($collection);
+ });
+ return $collections;
+ }
+}