protected EntityFieldManager::buildBundleFieldDefinitions($entity_type_id, $bundle, array $base_field_definitions)
Builds field definitions for a specific bundle within an entity type.
Parameters
string $entity_type_id: The entity type ID. Only entity types that implement \Drupal\Core\Entity\FieldableEntityInterface are supported.
string $bundle: The bundle.
\Drupal\Core\Field\FieldDefinitionInterface[] $base_field_definitions: The list of base field definitions.
Return value
\Drupal\Core\Field\FieldDefinitionInterface[] An array of bundle field definitions, keyed by field name. Does not include base fields.
File
- core/lib/Drupal/Core/Entity/EntityFieldManager.php, line 325
Class
- EntityFieldManager
- Manages the discovery of entity fields.
Namespace
Drupal\Core\Entity
Code
protected function buildBundleFieldDefinitions($entity_type_id, $bundle, array $base_field_definitions) { $entity_type = $this->entityTypeManager->getDefinition($entity_type_id); $class = $entity_type->getClass(); // Allow the entity class to provide bundle fields and bundle-specific // overrides of base fields. $bundle_field_definitions = $class::bundleFieldDefinitions($entity_type, $bundle, $base_field_definitions); // Load base field overrides from configuration. These take precedence over // base field overrides returned above. $base_field_override_ids = array_map(function($field_name) use ($entity_type_id, $bundle) { return $entity_type_id . '.' . $bundle . '.' . $field_name; }, array_keys($base_field_definitions)); $base_field_overrides = $this->entityTypeManager->getStorage('base_field_override')->loadMultiple($base_field_override_ids); foreach ($base_field_overrides as $base_field_override) { /** @var \Drupal\Core\Field\Entity\BaseFieldOverride $base_field_override */ $field_name = $base_field_override->getName(); $bundle_field_definitions[$field_name] = $base_field_override; } $provider = $entity_type->getProvider(); foreach ($bundle_field_definitions as $definition) { // @todo Remove this check once FieldDefinitionInterface exposes a proper // provider setter. See https://www.drupal.org/node/2225961. if ($definition instanceof BaseFieldDefinition) { $definition->setProvider($provider); } } // Retrieve base field definitions from modules. foreach ($this->moduleHandler->getImplementations('entity_bundle_field_info') as $module) { $module_definitions = $this->moduleHandler->invoke($module, 'entity_bundle_field_info', [$entity_type, $bundle, $base_field_definitions]); if (!empty($module_definitions)) { // Ensure the provider key actually matches the name of the provider // defining the field. foreach ($module_definitions as $field_name => $definition) { // @todo Remove this check once FieldDefinitionInterface exposes a // proper provider setter. See https://www.drupal.org/node/2225961. if ($definition instanceof BaseFieldDefinition) { $definition->setProvider($module); } $bundle_field_definitions[$field_name] = $definition; } } } // Automatically set the field name, target entity type and bundle // for non-configurable fields. foreach ($bundle_field_definitions as $field_name => $field_definition) { if ($field_definition instanceof BaseFieldDefinition) { $field_definition->setName($field_name); $field_definition->setTargetEntityTypeId($entity_type_id); $field_definition->setTargetBundle($bundle); } } // Invoke 'per bundle' alter hook. $this->moduleHandler->alter('entity_bundle_field_info', $bundle_field_definitions, $entity_type, $bundle); return $bundle_field_definitions; }
Please login to continue.