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
Namespace
Drupal\ctoolsCode
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);
}