getBasename('.yml')] = $file->getPath(); } $ct = config_typed(); foreach (Drupal::service('config.storage')->listAll() as $name) { if ($ct->hasConfigSchema($name)) { $storage = new FileStorage($files[$name]); if ($base = $storage->read($name)) { $keys[$name] = array(); $changed = FALSE; _assemble($base, $changed, $keys[$name], config($name)->get(), $ct->get($name)); if ($changed) { $storage->write($name, $base); } } else { #echo "$name\n"; } } else { #echo "No schema for file $name\n"; } } #print_r($keys); function _assemble(&$base, &$changed, &$keys, $array, $schema, $prefix = '') { $mapping = $schema instanceof Drupal\Core\Config\Schema\Mapping; $sequence = $schema instanceof Drupal\Core\Config\Schema\Sequence; foreach ($array as $k => $v) { if (!isset($base[$k])) { continue; } $new_schema = FALSE; if ($mapping) { try { $new_schema = $schema->get($k); } catch (\InvalidArgumentException $e) { #echo "No schema for $k\n"; continue; } } if ($sequence) { $new_schema = $schema[$k]; } if (is_array($v)) { _assemble($base[$k], $changed, $keys, $v, $new_schema, "$prefix$k."); } elseif ($new_schema) { $class = get_class($new_schema); $old = $base[$k]; switch ($class) { case 'Drupal\Core\TypedData\Plugin\DataType\String': case 'Drupal\Core\TypedData\Plugin\DataType\Uri': case 'Drupal\Core\TypedData\Plugin\DataType\Email': case 'Drupal\Core\Config\Schema\Property': break; case 'Drupal\Core\TypedData\Plugin\DataType\Integer': $base[$k] = (int)$base[$k]; break; case 'Drupal\Core\TypedData\Plugin\DataType\Boolean': $changed = TRUE; $base[$k] = (bool)$base[$k]; break; default: echo "$class\n"; } $changed = $changed || $base[$k] !== $old; } else { #echo "No schema for $name $prefix$k\n"; } } }