function EntityCreateDeriver::getDerivativeDefinitions

Overrides DeriverBase::getDerivativeDefinitions

File

src/Plugin/RulesAction/EntityCreateDeriver.php, line 68

Class

EntityCreateDeriver
Derives entity create plugin definitions based on content entity types.

Namespace

Drupal\rules\Plugin\RulesAction

Code

public function getDerivativeDefinitions($base_plugin_definition) {
  foreach ($this->entityTypeManager
    ->getDefinitions() as $entity_type_id => $entity_type) {
    // Only allow content entities and ignore configuration entities.
    if (!$entity_type instanceof ContentEntityTypeInterface) {
      continue;
    }
    $this->derivatives[$entity_type_id] = [
      'label' => $this->t('Create a new @entity_type entity', [
        '@entity_type' => $entity_type->getSingularLabel(),
      ]),
      'category' => $entity_type->getLabel(),
      'entity_type_id' => $entity_type_id,
      'context_definitions' => [],
      'provides' => [
        $entity_type->id() . '_created' => ContextDefinition::create("entity:{$entity_type_id}")->setLabel($this->t('Created @entity_type entity', [
          '@entity_type' => $entity_type->getSingularLabel(),
        ]))
          ->setRequired(TRUE),
      ],
    ] + $base_plugin_definition;
    // Add a required context for the bundle key, and optional contexts for
    // other required base fields. This matches the storage create() behavior,
    // where only the bundle requirement is enforced.
    $bundle_key = $entity_type->getKey('bundle');
    $this->derivatives[$entity_type_id]['bundle_key'] = $bundle_key;
    $base_field_definitions = $this->entityFieldManager
      ->getBaseFieldDefinitions($entity_type_id);
    foreach ($base_field_definitions as $field_name => $definition) {
      if ($field_name != $bundle_key && !$definition->isRequired()) {
        continue;
      }
      $item_definition = $definition->getItemDefinition();
      // @todo Add support for multi-property fields for entity creation.
      // @see https://www.drupal.org/node/2748791.
      $main_property_name = $item_definition->getMainPropertyName();
      if (is_null($main_property_name)) {
        continue;
      }
      $type_definition = $item_definition->getPropertyDefinition($main_property_name);
      // Get around types which don't properly define their main property
      // or lack a main property entirely.
      if (is_null($type_definition)) {
        continue;
      }
      // If this is an entity reference then we expect the target type as
      // context.
      if ($type_definition instanceof DataReferenceDefinitionInterface) {
        $type_definition->getTargetDefinition();
      }
      $type = $type_definition->getDataType();
      $is_bundle = $field_name == $bundle_key;
      $multiple = $definition->getCardinality() === 1 ? FALSE : TRUE;
      $context_definition = ContextDefinition::create($type)->setLabel($definition->getLabel())
        ->setRequired($is_bundle)
        ->setMultiple($multiple)
        ->setDescription($definition->getDescription());
      if ($is_bundle) {
        $context_definition->setAssignmentRestriction(ContextDefinition::ASSIGNMENT_RESTRICTION_INPUT);
      }
      $this->derivatives[$entity_type_id]['context_definitions'][$field_name] = $context_definition;
    }
  }
  return $this->derivatives;
}