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
@@ -18,6 +18,13 @@ function hook_config_ignore_settings_alter(array &$settings) {
$settings[] = 'field.*';
}
+/**
+ * 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 80534e2..894f5a2 100644
--- a/config_ignore.install
+++ b/config_ignore.install
@@ -13,9 +13,17 @@ function config_ignore_update_8201() {
}
/**
- * Remove index from configuration export.
+ * 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();
+}
+
+/**
+ * Remove index from configuration export.
+ */
+function config_ignore_update_8203() {
$config = \Drupal::configFactory()->getEditable('config_ignore.settings');
$ignored_config_entities = $config->get('ignored_config_entities') ?: [];
$config->set('ignored_config_entities', array_values($ignored_config_entities));
diff --git a/src/Form/Settings.php b/src/Form/Settings.php
index 16f05fd..e73a27e 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);
}
@@ -67,6 +77,9 @@ Examples:
$config_ignore_settings_array = array_filter($config_ignore_settings_array);
$config_ignore_settings_array = array_values($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..a87ad26
--- /dev/null
+++ b/src/Plugin/ConfigFilter/CollectionIgnore.php
@@ -0,0 +1,172 @@
+active = $active;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+ // Get the list of ignored config collections.
+ $ignored_collections = $container->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,
+ $container->get('config.storage')
+ );
+ }
+
+ /**
+ * Match a storage collection name against list of ignored collections.
+ *
+ * @return bool
+ * True, if the storage collection is to be ignored, false otherwise.
+ */
+ protected function matchCollectionName() {
+ $collection_name = $this->getSourceStorage()->getCollectionName();
+ if (empty($collection_name) || 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(self::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 filterRead($name, $data) {
+ if (!$this->matchCollectionName()) {
+ return parent::filterRead($name, $data);
+ }
+
+ $filtered_data = $this->active->read($name);
+ if (!$filtered_data) {
+ return $data;
+ }
+
+ return $filtered_data;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function filterReadMultiple(array $names, array $data) {
+ if (!$this->matchCollectionName()) {
+ return parent::filterReadMultiple($names, $data);
+ }
+
+ $filtered_data = [];
+ foreach ($names as $name) {
+ if (!array_key_exists($name, $data)) {
+ $data[$name] = [];
+ }
+ $filtered_data[$name] = $this->active->read($name);
+ if (!$filtered_data[$name]) {
+ $filtered_data[$name] = $data[$name];
+ }
+ }
+ return $filtered_data;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function filterExists($name, $exists) {
+ if (!$this->matchCollectionName()) {
+ parent::filterExists($name, $exists);
+ }
+
+ return $exists || $this->active->exists($name);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function filterListAll($prefix, array $data) {
+ if (!$this->matchCollectionName()) {
+ parent::filterListAll($prefix, $data);
+ }
+
+ $active_names = $this->active->listAll($prefix);
+ // Return the data with the active names which are ignored merged in.
+ return array_unique(array_merge($data, $active_names));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function filterCreateCollection($collection) {
+ return new static($this->configuration, $this->pluginId, $this->pluginDefinition, $this->active->createCollection($collection));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function filterGetAllCollectionNames(array $collections) {
+ // Add active collection names as there could be ignored config in them.
+ return array_merge($collections, $this->active->getAllCollectionNames());
+ }
+
+}