Issue #2978848 by claudiu.cristea, amateescu: EntityReferenceFieldItemList::referencedEntities() doesn't work for computed fields

merge-requests/1654/head
Alex Pott 2018-06-13 09:10:02 +01:00
parent f283ab5511
commit 7896891da5
No known key found for this signature in database
GPG Key ID: 31905460D4A69276
4 changed files with 59 additions and 1 deletions

View File

@ -24,7 +24,7 @@ class EntityReferenceFieldItemList extends FieldItemList implements EntityRefere
* {@inheritdoc}
*/
public function referencedEntities() {
if (empty($this->list)) {
if ($this->isEmpty()) {
return [];
}

View File

@ -4,6 +4,7 @@ namespace Drupal\entity_test\Entity;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\entity_test\Plugin\Field\ComputedReferenceTestFieldItemList;
use Drupal\entity_test\Plugin\Field\ComputedTestFieldItemList;
/**
@ -39,6 +40,12 @@ class EntityTestComputedField extends EntityTest {
->setComputed(TRUE)
->setClass(ComputedTestFieldItemList::class);
$fields['computed_reference_field'] = BaseFieldDefinition::create('entity_reference')
->setLabel('Computed Reference Field Test')
->setComputed(TRUE)
->setSetting('target_type', 'entity_test')
->setClass(ComputedReferenceTestFieldItemList::class);
return $fields;
}

View File

@ -0,0 +1,24 @@
<?php
namespace Drupal\entity_test\Plugin\Field;
use Drupal\Core\Field\EntityReferenceFieldItemList;
use Drupal\Core\TypedData\ComputedItemListTrait;
/**
* A computed entity reference field item list.
*/
class ComputedReferenceTestFieldItemList extends EntityReferenceFieldItemList {
use ComputedItemListTrait;
/**
* Compute the list property from state.
*/
protected function computeValue() {
foreach (\Drupal::state()->get('entity_test_reference_computed_target_ids', []) as $delta => $id) {
$this->list[$delta] = $this->createItem($delta, $id);
}
}
}

View File

@ -16,6 +16,7 @@ use Drupal\Core\TypedData\DataDefinitionInterface;
use Drupal\Core\TypedData\ListInterface;
use Drupal\Core\TypedData\Type\StringInterface;
use Drupal\Core\TypedData\TypedDataInterface;
use Drupal\entity_test\Entity\EntityTest;
use Drupal\entity_test\Entity\EntityTestComputedField;
use Drupal\node\Entity\Node;
use Drupal\node\Entity\NodeType;
@ -870,6 +871,32 @@ class EntityFieldTest extends EntityKernelTestBase {
$this->assertFalse($computed_item_list1->equals($computed_item_list2));
}
/**
* Tests an entity reference computed field.
*/
public function testEntityReferenceComputedField() {
$this->installEntitySchema('entity_test_computed_field');
// Create 2 entities to be referenced.
$ref1 = EntityTest::create(['name' => 'foo', 'type' => 'bar']);
$ref1->save();
$ref2 = EntityTest::create(['name' => 'baz', 'type' => 'bar']);
$ref2->save();
\Drupal::state()->set('entity_test_reference_computed_target_ids', [$ref1->id(), $ref2->id()]);
$entity = EntityTestComputedField::create([]);
$entity->save();
/** @var \Drupal\entity_test\Plugin\Field\ComputedReferenceTestFieldItemList $field */
$field = $entity->get('computed_reference_field');
/** @var \Drupal\Core\Entity\EntityInterface[] $referenced_entities */
$referenced_entities = $field->referencedEntities();
// Check that ::referencedEntities() is working with computed fields.
$this->assertEquals($ref1->id(), $referenced_entities[0]->id());
$this->assertEquals($ref2->id(), $referenced_entities[1]->id());
}
/**
* Executes the computed properties tests for the given entity type.
*