Skip to content
Snippets Groups Projects
Commit f7d8fe6f authored by catch's avatar catch
Browse files

Issue #3266287 by lind101, alexpott, joachim, larowlan, quietone: Make...

Issue #3266287 by lind101, alexpott, joachim, larowlan, quietone: Make buildBundleFieldDefinitions use Bundle Classes for building bundleFieldDefinitions
parent 997a0597
No related branches found
Tags 5.5.12
37 merge requests!7452Issue #1797438. HTML5 validation is preventing form submit and not fully...,!54479.5.x SF update,!5014Issue #3071143: Table Render Array Example Is Incorrect,!4868Issue #1428520: Improve menu parent link selection,!4289Issue #1344552 by marcingy, Niklas Fiekas, Ravi.J, aleevas, Eduardo Morales...,!4114Issue #2707291: Disable body-level scrolling when a dialog is open as a modal,!4100Issue #3249600: Add support for PHP 8.1 Enums as allowed values for list_* data types,!3630Issue #2815301 by Chi, DanielVeza, kostyashupenko, smustgrave: Allow to create...,!3600Issue #3344629: Passing null to parameter #1 ($haystack) of type string is deprecated,!3291Issue #3336463: Rewrite rules for gzipped CSS and JavaScript aggregates never match,!3102Issue #3164428 by DonAtt, longwave, sahil.goyal, Anchal_gupta, alexpott: Use...,!2853#3274419 Makes BaseFieldOverride inherit the internal property from the base field.,!2378Issue #2875033: Optimize joins and table selection in SQL entity query implementation,!2334Issue #3228209: Add hasRole() method to AccountInterface,!2074Issue #2707689: NodeForm::actions() checks for delete access on new entities,!2062Issue #3246454: Add weekly granularity to views date sort,!1591Issue #3199697: Add JSON:API Translation experimental module,!1484Exposed filters get values from URL when Ajax is on,!1255Issue #3238922: Refactor (if feasible) uses of the jQuery serialize function to use vanillaJS,!1254Issue #3238915: Refactor (if feasible) uses of the jQuery ready function to use VanillaJS,!1162Issue #3100350: Unable to save '/' root path alias,!1105Issue #3025039: New non translatable field on translatable content throws error,!1073issue #3191727: Focus states on mobile second level navigation items fixed,!10223132456: Fix issue where views instances are emptied before an ajax request is complete,!957Added throwing of InvalidPluginDefinitionException from getDefinition().,!925Issue #2339235: Remove taxonomy hard dependency on node module,!877Issue #2708101: Default value for link text is not saved,!873Issue #2875228: Site install not using batch API service,!872Draft: Issue #3221319: Race condition when creating menu links and editing content deletes menu links,!844Resolve #3036010 "Updaters",!712Issue #2909128: Autocomplete intermittent on Chrome Android,!617Issue #3043725: Provide a Entity Handler for user cancelation,!579Issue #2230909: Simple decimals fail to pass validation,!560Move callback classRemove outside of the loop,!555Issue #3202493,!485Sets the autocomplete attribute for username/password input field on login form.,!30Issue #3182188: Updates composer usage to point at ./vendor/bin/composer
This commit is part of merge request !1581. Comments created here will be created in the context of that merge request.
......@@ -373,7 +373,9 @@ public function getFieldDefinitions($entity_type_id, $bundle) {
*/
protected function buildBundleFieldDefinitions($entity_type_id, $bundle, array $base_field_definitions) {
$entity_type = $this->entityTypeManager->getDefinition($entity_type_id);
$class = $entity_type->getClass();
// 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.
......
......@@ -11,13 +11,13 @@
use Drupal\Core\Cache\Cache;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Cache\CacheTagsInvalidatorInterface;
use Drupal\Core\Config\Entity\ConfigEntityStorageInterface;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Entity\ContentEntityTypeInterface;
use Drupal\Core\Entity\EntityDisplayRepositoryInterface;
use Drupal\Core\Entity\EntityFieldManager;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityLastInstalledSchemaRepositoryInterface;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
......@@ -247,8 +247,54 @@ public function testGetBaseFieldDefinitions() {
public function testGetFieldDefinitions() {
$field_definition = $this->setUpEntityWithFieldDefinition();
$bundle_field_definition = $this->prophesize()
->willImplement(FieldDefinitionInterface::class)
->willImplement(FieldStorageDefinitionInterface::class);
// Define bundle fields to be stored on the default Entity class.
$bundle_fields = [
'the_entity_id' => [
'test_entity_bundle' => [
'id_bundle' => $bundle_field_definition->reveal(),
],
'test_entity_bundle_class' => [
'some_extra_field' => $bundle_field_definition->reveal(),
],
],
];
// Define bundle fields to be stored on the bundle class.
$bundle_class_fields = [
'the_entity_id' => [
'test_entity_bundle_class' => [
'id_bundle_class' => $bundle_field_definition->reveal(),
],
],
];
EntityTypeManagerTestEntity::$bundleFieldDefinitions = $bundle_fields;
EntityTypeManagerTestEntityBundle::$bundleClassFieldDefinitions = $bundle_class_fields;
// Test that only base fields are retrieved.
$expected = ['id' => $field_definition];
$this->assertSame($expected, $this->entityFieldManager->getFieldDefinitions('test_entity_type', 'some_other_bundle'));
// Test that base fields and bundle fields from the default entity class are
// retrieved.
$expected = [
'id' => $field_definition,
'id_bundle' => $bundle_fields['the_entity_id']['test_entity_bundle']['id_bundle'],
];
$this->assertSame($expected, $this->entityFieldManager->getFieldDefinitions('test_entity_type', 'test_entity_bundle'));
// Test that base fields and bundle fields from the bundle class and
// entity class are retrieved
$expected = [
'id' => $field_definition,
'some_extra_field' => $bundle_fields['the_entity_id']['test_entity_bundle_class']['some_extra_field'],
'id_bundle_class' => $bundle_class_fields['the_entity_id']['test_entity_bundle_class']['id_bundle_class'],
];
$this->assertSame($expected, $this->entityFieldManager->getFieldDefinitions('test_entity_type', 'test_entity_bundle_class'));
}
/**
......@@ -575,8 +621,18 @@ protected function setUpEntityWithFieldDefinition($custom_invoke_all = FALSE, $f
$this->entityType = $this->prophesize(EntityTypeInterface::class);
$this->setUpEntityTypeDefinitions(['test_entity_type' => $this->entityType, 'base_field_override' => $override_entity_type]);
$storage = $this->prophesize(ConfigEntityStorageInterface::class);
$storage = $this->prophesize(EntityStorageInterface::class);
$storage->loadMultiple(Argument::type('array'))->willReturn([]);
// By default, make the storage entity class lookup return the
// EntityTypeManagerTestEntity class
$storage->getEntityClass(NULL)->willReturn(EntityTypeManagerTestEntity::class);
$storage->getEntityClass(Argument::type('string'))->willReturn(EntityTypeManagerTestEntity::class);
// When using the "test_entity_bundle_class" bundle, return the
// EntityTypeManagerTestEntityBundle class
$storage->getEntityClass('test_entity_bundle_class')->willReturn(EntityTypeManagerTestEntityBundle::class);
$this->entityTypeManager->getStorage('test_entity_type')->willReturn($storage->reveal());
$this->entityTypeManager->getStorage('base_field_override')->willReturn($storage->reveal());
$this->entityType->getClass()->willReturn($entity_class);
......@@ -864,3 +920,33 @@ public static function bundleFieldDefinitions(EntityTypeInterface $entity_type,
}
}
/**
* Provides a bundle specific class with dummy static method implementations.
*/
abstract class EntityTypeManagerTestEntityBundle extends EntityTypeManagerTestEntity {
/**
* The bundle class field definitions.
*
* @var array[]
* Keys are entity type IDs, values are arrays of which the keys are bundle
* names and the values are field definitions.
*/
public static $bundleClassFieldDefinitions = [];
/**
* {@inheritdoc}
*/
public static function bundleFieldDefinitions(EntityTypeInterface $entity_type, $bundle, array $base_field_definitions) {
$definitions = parent::bundleFieldDefinitions($entity_type, $bundle, $base_field_definitions);
if (isset(static::$bundleClassFieldDefinitions[$entity_type->id()][$bundle])) {
$definitions += static::$bundleClassFieldDefinitions[$entity_type->id()][$bundle];
}
return $definitions;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment