function EntityFieldManager::buildBundleFieldDefinitions
Same name in other branches
- 9 core/lib/Drupal/Core/Entity/EntityFieldManager.php \Drupal\Core\Entity\EntityFieldManager::buildBundleFieldDefinitions()
- 8.9.x core/lib/Drupal/Core/Entity/EntityFieldManager.php \Drupal\Core\Entity\EntityFieldManager::buildBundleFieldDefinitions()
- 10 core/lib/Drupal/Core/Entity/EntityFieldManager.php \Drupal\Core\Entity\EntityFieldManager::buildBundleFieldDefinitions()
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.
1 call to EntityFieldManager::buildBundleFieldDefinitions()
- EntityFieldManager::getFieldDefinitions in core/
lib/ Drupal/ Core/ Entity/ EntityFieldManager.php - Gets the field definitions for a specific bundle.
File
-
core/
lib/ Drupal/ Core/ Entity/ EntityFieldManager.php, line 380
Class
- EntityFieldManager
- Manages the discovery of entity fields.
Namespace
Drupal\Core\EntityCode
protected function buildBundleFieldDefinitions($entity_type_id, $bundle, array $base_field_definitions) {
$entity_type = $this->entityTypeManager
->getDefinition($entity_type_id);
// Use a bundle specific class if one is defined.
$class = $this->entityTypeManager
->getStorage($entity_type_id)
->getEntityClass($bundle);
// 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/2346329.
if ($definition instanceof BaseFieldDefinition) {
$definition->setProvider($provider);
}
}
// Retrieve bundle field definitions from modules.
$this->moduleHandler
->invokeAllWith('entity_bundle_field_info', function (callable $hook, string $module) use (&$bundle_field_definitions, $entity_type, $bundle, $base_field_definitions) {
$module_definitions = $hook($entity_type, $bundle, $base_field_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/2346329.
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);
}
if ($field_definition instanceof BaseFieldDefinition || $field_definition instanceof FieldDefinition) {
$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;
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.