Chris@0: TRUE, Chris@0: 'multiple' => FALSE, Chris@0: 'default_value' => NULL, Chris@0: ]; Chris@0: // Annotation classes extract data from passed annotation classes directly Chris@0: // used in the classes they pass to. Chris@0: foreach (['label', 'description'] as $key) { Chris@0: // @todo Remove this workaround in https://www.drupal.org/node/2362727. Chris@0: if (isset($values[$key]) && $values[$key] instanceof TranslatableMarkup) { Chris@0: $values[$key] = (string) $values[$key]->get(); Chris@0: } Chris@0: else { Chris@0: $values[$key] = NULL; Chris@0: } Chris@0: } Chris@0: if (isset($values['class']) && !in_array('Drupal\Core\Plugin\Context\ContextDefinitionInterface', class_implements($values['class']))) { Chris@0: throw new \Exception('ContextDefinition class must implement \Drupal\Core\Plugin\Context\ContextDefinitionInterface.'); Chris@0: } Chris@17: Chris@17: $class = $this->getDefinitionClass($values); Chris@0: $this->definition = new $class($values['value'], $values['label'], $values['required'], $values['multiple'], $values['description'], $values['default_value']); Chris@18: Chris@18: if (isset($values['constraints'])) { Chris@18: foreach ($values['constraints'] as $constraint_name => $options) { Chris@18: $this->definition->addConstraint($constraint_name, $options); Chris@18: } Chris@18: } Chris@0: } Chris@0: Chris@0: /** Chris@17: * Determines the context definition class to use. Chris@17: * Chris@17: * If the annotation specifies a specific context definition class, we use Chris@17: * that. Otherwise, we use \Drupal\Core\Plugin\Context\EntityContextDefinition Chris@17: * if the data type starts with 'entity:', since it contains specialized logic Chris@17: * specific to entities. Otherwise, we fall back to the generic Chris@17: * \Drupal\Core\Plugin\Context\ContextDefinition class. Chris@17: * Chris@17: * @param array $values Chris@17: * The annotation values. Chris@17: * Chris@17: * @return string Chris@17: * The fully-qualified name of the context definition class. Chris@17: */ Chris@17: protected function getDefinitionClass(array $values) { Chris@17: if (isset($values['class'])) { Chris@17: return $values['class']; Chris@17: } Chris@17: if (strpos($values['value'], 'entity:') === 0) { Chris@17: return 'Drupal\Core\Plugin\Context\EntityContextDefinition'; Chris@17: } Chris@17: return 'Drupal\Core\Plugin\Context\ContextDefinition'; Chris@17: } Chris@17: Chris@17: /** Chris@0: * Returns the value of an annotation. Chris@0: * Chris@0: * @return \Drupal\Core\Plugin\Context\ContextDefinitionInterface Chris@0: */ Chris@0: public function get() { Chris@0: return $this->definition; Chris@0: } Chris@0: Chris@0: }