View source
<?php
namespace Drupal\config_split_ignore\Plugin\ConfigFilter;
use Drupal\config_ignore\Plugin\ConfigFilter\IgnoreFilter;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Site\Settings;
use Drupal\Component\Utility\NestedArray;
class ConfigSplitIgnoreFilter extends IgnoreFilter {
const DELETION_PREFIX = '!';
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
$entity_storage = $container
->get('entity_type.manager')
->getStorage('config_split');
$config_factory = $container
->get('config.factory');
$ignored = [];
foreach ($entity_storage
->loadMultiple() as $config_split) {
$config_name = $config_split
->getConfigDependencyName();
$config = $config_factory
->get($config_name);
if (!empty($config
->get('status'))) {
$ignored = array_merge($ignored, $config_split
->getThirdPartySetting('config_split_ignore', 'entities', []));
}
}
$ignored = array_unique($ignored);
$container
->get('module_handler')
->invokeAll('config_split_ignore_settings_alter', [
&$ignored,
]);
$configuration['ignored'] = array_unique($ignored);
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('config.storage'));
}
protected function stringMatch($pattern, $string) {
$pattern = '/^' . preg_quote($pattern, '/') . '$/';
$pattern = str_replace('\\*', '.*', $pattern);
return (bool) preg_match($pattern, $string);
}
protected function matchConfigName($config_name) {
if (Settings::get('config_split_ignore_deactivate')) {
return FALSE;
}
if (in_array(static::FORCE_EXCLUSION_PREFIX . $config_name, $this->configuration['ignored'], TRUE)) {
return FALSE;
}
if (in_array(static::DELETION_PREFIX . $config_name, $this->configuration['ignored'], TRUE)) {
return FALSE;
}
foreach ($this->configuration['ignored'] as $config_ignore_setting) {
$ignore = explode(':', $config_ignore_setting, 2);
if ($this
->stringMatch($ignore[0], $config_name)) {
return TRUE;
}
}
return FALSE;
}
protected function activeRead($name, $data) {
$keys = [];
foreach ($this->configuration['ignored'] as $ignored) {
if (strpos($ignored, static::DELETION_PREFIX) === 0) {
continue;
}
$ignored = explode(':', $ignored, 2);
if ($this
->stringMatch($ignored[0], $name)) {
if (count($ignored) == 1) {
$active = $this->active
->read($name);
return $active ? $active : $data;
}
else {
$keys[] = $ignored[1];
}
}
}
$active = $this->active
->read($name);
if (!$active) {
return $data;
}
foreach ($keys as $key) {
$parts = explode('.', $key);
if (count($parts) == 1) {
if (isset($active[$key])) {
$data[$key] = $active[$key];
}
}
else {
$key_exists = FALSE;
$value = NestedArray::getValue($active, $parts, $key_exists);
if ($key_exists) {
NestedArray::setValue($data, $parts, $value, TRUE);
}
}
}
return $data;
}
public function filterWrite($name, array $data) {
return $data;
}
public function filterExists($name, $exists) {
if (in_array(static::DELETION_PREFIX . $name, $this->configuration['ignored'], TRUE)) {
return FALSE;
}
return $exists;
}
public function filterListAll($prefix, array $data) {
foreach ($data as $key => $config_name) {
if (in_array(static::DELETION_PREFIX . $config_name, $this->configuration['ignored'], TRUE)) {
unset($data[$key]);
}
}
if (!empty($this
->getFilteredStorage()
->getCollectionName())) {
$active_names = $this->active
->listAll($prefix);
$data = array_unique(array_merge($data, array_filter($active_names, [
$this,
'matchConfigName',
])));
}
return $data;
}
public function filterDelete($name, $delete) {
if ($delete && in_array(static::DELETION_PREFIX . $name, $this->configuration['ignored'], TRUE) && $this->source
->exists($name)) {
return FALSE;
}
return $delete;
}
public function filterDeleteAll($prefix, $delete) {
return !empty($this->configuration['ignored']) ? FALSE : $delete;
}
public function getIgnoredKeys() {
if (empty($this->configuration['ignored'])) {
return [];
}
$active_names = $this->active
->listAll();
$ignored_keys = [];
foreach ($this->configuration['ignored'] as $config_ignore_setting) {
$ignore = explode(':', $config_ignore_setting, 2);
$ignore_name_pattern = $ignore[0];
$ignore_key = isset($ignore[1]) ? $ignore[1] : '';
foreach ($active_names as $config_name) {
if ($config_ignore_setting === static::FORCE_EXCLUSION_PREFIX . $config_name) {
continue;
}
if ($config_ignore_setting === static::DELETION_PREFIX . $config_name) {
continue;
}
if ($this
->stringMatch($ignore_name_pattern, $config_name)) {
$ignored_keys[$config_name][$ignore_key] = TRUE;
}
}
}
foreach (array_keys($ignored_keys) as $ignore_name) {
if (isset($ignored_keys[$ignore_name][''])) {
$ignored_keys[$ignore_name] = [];
}
else {
$ignored_keys[$ignore_name] = array_keys($ignored_keys[$ignore_name]);
}
}
return $ignored_keys;
}
}