function TypedConfigManager::replaceVariable

Same name and namespace in other branches
  1. 9 core/lib/Drupal/Core/Config/TypedConfigManager.php \Drupal\Core\Config\TypedConfigManager::replaceVariable()
  2. 10 core/lib/Drupal/Core/Config/TypedConfigManager.php \Drupal\Core\Config\TypedConfigManager::replaceVariable()

Replaces variable values in included names with configuration data.

Variable values are nested configuration keys that will be replaced by their value or some of these special strings:

  • '%key', will be replaced by the element's key.
  • '%parent', to reference the parent element.
  • '%type', to reference the schema definition type. Can only be used in combination with %parent.

There may be nested configuration keys separated by dots or more complex patterns like '%parent.name' which references the 'name' value of the parent element.

Example patterns:

  • 'name.subkey', indicates a nested value of the current element.
  • '%parent.name', will be replaced by the 'name' value of the parent.
  • '%parent.%key', will be replaced by the parent element's key.
  • '%parent.%type', will be replaced by the schema type of the parent.
  • '%parent.%parent.%type', will be replaced by the schema type of the parent's parent.

Parameters

string $value: Variable value to be replaced.

mixed $data: Configuration data for the element.

Return value

string The replaced value if a replacement found or the original value if not.

1 call to TypedConfigManager::replaceVariable()
TypedConfigManager::replaceName in core/lib/Drupal/Core/Config/TypedConfigManager.php
Replaces variables in configuration name.

File

core/lib/Drupal/Core/Config/TypedConfigManager.php, line 320

Class

TypedConfigManager
Manages config schema type plugins.

Namespace

Drupal\Core\Config

Code

protected function replaceVariable($value, $data) {
    $parts = explode('.', $value);
    // Process each value part, one at a time.
    while ($name = array_shift($parts)) {
        if (!is_array($data) || !isset($data[$name])) {
            // Key not found, return original value
            return $value;
        }
        elseif (!$parts) {
            $value = $data[$name];
            if (is_bool($value)) {
                $value = (int) $value;
            }
            // If no more parts left, this is the final property.
            return (string) $value;
        }
        else {
            // Get nested value and continue processing.
            if ($name == '%parent') {
                
                /** @var \Drupal\Core\Config\Schema\ArrayElement $parent */
                // Switch replacement values with values from the parent.
                $parent = $data['%parent'];
                $data = $parent->getValue();
                $data['%type'] = $parent->getDataDefinition()
                    ->getDataType();
                // The special %parent and %key values now need to point one level up.
                if ($new_parent = $parent->getParent()) {
                    $data['%parent'] = $new_parent;
                    $data['%key'] = $new_parent->getName();
                }
            }
            else {
                $data = $data[$name];
            }
        }
    }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.