You are here

public function TypedDataResolver::getContextFromProperty in Chaos Tool Suite (ctools) 8.3

Convert a property to a context.

This method will respect the value of contexts as well, so if a context object is pass that contains a value, the appropriate value will be extracted and injected into the resulting context object if available.

Parameters

string $property_path: The name of the property.

\Drupal\Core\Plugin\Context\ContextInterface $context: The context from which we will extract values if available.

Return value

\Drupal\Core\Plugin\Context\Context A context object that represents the definition & value of the property.

Throws

\Exception

1 call to TypedDataResolver::getContextFromProperty()
TypedDataResolver::convertTokenToContext in src/TypedDataResolver.php
Extracts a context from an array of contexts by a tokenized pattern.

File

src/TypedDataResolver.php, line 62

Class

TypedDataResolver

Namespace

Drupal\ctools

Code

public function getContextFromProperty($property_path, ContextInterface $context) {
  $value = NULL;
  $data_definition = NULL;
  if ($context
    ->hasContextValue()) {

    /** @var \Drupal\Core\TypedData\ComplexDataInterface $data */
    $data = $context
      ->getContextData();
    foreach (explode(':', $property_path) as $name) {
      if ($data instanceof ListInterface) {
        if (!is_numeric($name)) {

          // Implicitly default to delta 0 for lists when not specified.
          $data = $data
            ->first();
        }
        else {

          // If we have a delta, fetch it and continue with the next part.
          $data = $data
            ->get($name);
          continue;
        }
      }

      // Forward to the target value if this is a data reference.
      if ($data instanceof DataReferenceInterface) {
        $data = $data
          ->getTarget();
      }
      if (!$data
        ->getDataDefinition()
        ->getPropertyDefinition($name)) {
        throw new \Exception("Unknown property {$name} in property path {$property_path}");
      }
      $data = $data
        ->get($name);
    }
    $value = $data
      ->getValue();
    $data_definition = $data instanceof DataReferenceInterface ? $data
      ->getDataDefinition()
      ->getTargetDefinition() : $data
      ->getDataDefinition();
  }
  else {

    /** @var \Drupal\Core\TypedData\ComplexDataDefinitionInterface $data_definition */
    $data_definition = $context
      ->getContextDefinition()
      ->getDataDefinition();
    foreach (explode(':', $property_path) as $name) {
      if ($data_definition instanceof ListDataDefinitionInterface) {
        $data_definition = $data_definition
          ->getItemDefinition();

        // If the delta was specified explicitly, continue with the next part.
        if (is_numeric($name)) {
          continue;
        }
      }

      // Forward to the target definition if this is a data reference
      // definition.
      if ($data_definition instanceof DataReferenceDefinitionInterface) {
        $data_definition = $data_definition
          ->getTargetDefinition();
      }
      if (!$data_definition
        ->getPropertyDefinition($name)) {
        throw new \Exception("Unknown property {$name} in property path {$property_path}");
      }
      $data_definition = $data_definition
        ->getPropertyDefinition($name);
    }

    // Forward to the target definition if this is a data reference
    // definition.
    if ($data_definition instanceof DataReferenceDefinitionInterface) {
      $data_definition = $data_definition
        ->getTargetDefinition();
    }
  }
  if (strpos($data_definition
    ->getDataType(), 'entity:') === 0) {
    $context_definition = new EntityContextDefinition($data_definition
      ->getDataType(), $data_definition
      ->getLabel(), $data_definition
      ->isRequired(), FALSE, $data_definition
      ->getDescription());
  }
  else {
    $context_definition = new ContextDefinition($data_definition
      ->getDataType(), $data_definition
      ->getLabel(), $data_definition
      ->isRequired(), FALSE, $data_definition
      ->getDescription());
  }
  return new Context($context_definition, $value);
}