listAll() as $name) { if ($ct->hasConfigSchema($name)) { $parts = explode('.', $name); $module = $parts[0]; $storage = new FileStorage("core/modules/$module/config"); if ($base = $storage->read($name)) { $keys[$name] = array(); _assemble($base, $keys[$name], config($name)->get(), $ct->get($name)); $storage->write($name, $base); } } else { #echo "No schema for file $name\n"; } } #print_r($keys); function _assemble(&$base, &$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) { $new_schema = FALSE; if ($mapping) { try { $new_schema = $schema->get($k); } catch (\InvalidArgumentException $e) { continue; } } if ($sequence) { $new_schema = $schema[$k]; } if (is_array($v)) { _assemble($base[$k], $keys, $v, $new_schema, "$prefix$k."); } elseif ($new_schema) { $class = get_class($new_schema); 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': $base[$k] = (bool)$base[$k]; break; default: echo "$class\n"; } } else { #echo "No schema for $name $prefix$k\n"; } } }