Commit 17de81c5 authored by plach's avatar plach

Issue #2942675 by tim.plunkett, Sam152, plach, phenaproxima: Layout builder...

Issue #2942675 by tim.plunkett, Sam152, plach, phenaproxima: Layout builder should use the active variant of an entity
parent e5472e48
......@@ -5,6 +5,7 @@
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Cache\RefinableCacheableDependencyInterface;
use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\Core\Entity\EntityRepositoryInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Entity\FieldableEntityInterface;
......@@ -74,15 +75,23 @@ class OverridesSectionStorage extends SectionStorageBase implements ContainerFac
*/
protected $sectionStorageManager;
/**
* The entity repository.
*
* @var \Drupal\Core\Entity\EntityRepositoryInterface
*/
protected $entityRepository;
/**
* {@inheritdoc}
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager, EntityFieldManagerInterface $entity_field_manager, SectionStorageManagerInterface $section_storage_manager) {
public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager, EntityFieldManagerInterface $entity_field_manager, SectionStorageManagerInterface $section_storage_manager, EntityRepositoryInterface $entity_repository) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->entityTypeManager = $entity_type_manager;
$this->entityFieldManager = $entity_field_manager;
$this->sectionStorageManager = $section_storage_manager;
$this->entityRepository = $entity_repository;
}
/**
......@@ -95,7 +104,8 @@ public static function create(ContainerInterface $container, array $configuratio
$plugin_definition,
$container->get('entity_type.manager'),
$container->get('entity_field.manager'),
$container->get('plugin.manager.layout_builder.section_storage')
$container->get('plugin.manager.layout_builder.section_storage'),
$container->get('entity.repository')
);
}
......@@ -163,7 +173,7 @@ public function getSectionListFromId($id) {
@trigger_error('\Drupal\layout_builder\SectionStorageInterface::getSectionListFromId() is deprecated in Drupal 8.7.0 and will be removed before Drupal 9.0.0. The section list should be derived from context. See https://www.drupal.org/node/3016262.', E_USER_DEPRECATED);
if (strpos($id, '.') !== FALSE) {
list($entity_type_id, $entity_id) = explode('.', $id, 2);
$entity = $this->entityTypeManager->getStorage($entity_type_id)->load($entity_id);
$entity = $this->entityRepository->getActive($entity_type_id, $entity_id);
if ($entity instanceof FieldableEntityInterface && $entity->hasField(static::FIELD_NAME)) {
return $entity->get(static::FIELD_NAME);
}
......@@ -216,7 +226,7 @@ private function extractEntityFromRoute($value, array $defaults) {
return NULL;
}
$entity = $this->entityTypeManager->getStorage($entity_type_id)->load($entity_id);
$entity = $this->entityRepository->getActive($entity_type_id, $entity_id);
if ($entity instanceof FieldableEntityInterface && $entity->hasField(static::FIELD_NAME)) {
return $entity;
}
......
......@@ -630,6 +630,39 @@ public function testExtraFields() {
$assert_session->linkExists('Read more');
}
/**
* Tests loading a pending revision in the Layout Builder UI.
*/
public function testPendingRevision() {
$assert_session = $this->assertSession();
$page = $this->getSession()->getPage();
$this->drupalLogin($this->drupalCreateUser([
'configure any layout',
'administer node display',
]));
$field_ui_prefix = 'admin/structure/types/manage/bundle_with_section_field';
// Enable overrides.
$this->drupalPostForm("$field_ui_prefix/display/default", ['layout[enabled]' => TRUE], 'Save');
$this->drupalPostForm("$field_ui_prefix/display/default", ['layout[allow_custom]' => TRUE], 'Save');
$storage = $this->container->get('entity_type.manager')->getStorage('node');
$node = $storage->load(1);
// Create a pending revision.
$pending_revision = $storage->createRevision($node, FALSE);
$pending_revision->set('title', 'The pending title of the first node');
$pending_revision->save();
// The original node title is available when viewing the node, but the
// pending title is visible within the Layout Builder UI.
$this->drupalGet('node/1');
$assert_session->pageTextContains('The first node title');
$page->clickLink('Layout');
$assert_session->pageTextNotContains('The first node title');
$assert_session->pageTextContains('The pending title of the first node');
}
/**
* Tests that deleting a View block used in Layout Builder works.
*/
......
......@@ -13,6 +13,7 @@
use Drupal\layout_builder\Section;
use Drupal\layout_builder\SectionComponent;
use Drupal\layout_builder\SectionListInterface;
use Drupal\Tests\user\Traits\UserCreationTrait;
/**
* @coversDefaultClass \Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage
......@@ -21,6 +22,8 @@
*/
class OverridesSectionStorageTest extends KernelTestBase {
use UserCreationTrait;
/**
* {@inheritdoc}
*/
......@@ -46,6 +49,7 @@ class OverridesSectionStorageTest extends KernelTestBase {
protected function setUp() {
parent::setUp();
$this->setUpCurrentUser();
$this->installSchema('system', ['key_value_expire']);
$this->installEntitySchema('entity_test');
......
......@@ -3,7 +3,7 @@
namespace Drupal\Tests\layout_builder\Unit;
use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Entity\EntityRepositoryInterface;
use Drupal\Core\Entity\EntityType;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
......@@ -45,6 +45,13 @@ class OverridesSectionStorageTest extends UnitTestCase {
*/
protected $entityFieldManager;
/**
* The entity repository.
*
* @var \Drupal\Core\Entity\EntityRepositoryInterface
*/
protected $entityRepository;
/**
* {@inheritdoc}
*/
......@@ -54,12 +61,13 @@ protected function setUp() {
$this->entityTypeManager = $this->prophesize(EntityTypeManagerInterface::class);
$this->entityFieldManager = $this->prophesize(EntityFieldManagerInterface::class);
$section_storage_manager = $this->prophesize(SectionStorageManagerInterface::class);
$this->entityRepository = $this->prophesize(EntityRepositoryInterface::class);
$definition = new SectionStorageDefinition([
'id' => 'overrides',
'class' => OverridesSectionStorage::class,
]);
$this->plugin = new OverridesSectionStorage([], 'overrides', $definition, $this->entityTypeManager->reveal(), $this->entityFieldManager->reveal(), $section_storage_manager->reveal());
$this->plugin = new OverridesSectionStorage([], 'overrides', $definition, $this->entityTypeManager->reveal(), $this->entityFieldManager->reveal(), $section_storage_manager->reveal(), $this->entityRepository->reveal());
}
/**
......@@ -120,19 +128,15 @@ public function testGetSectionListFromId($success, $expected_entity_type_id, $id
$defaults['the_parameter_name'] = $id;
if ($expected_entity_type_id) {
$entity_storage = $this->prophesize(EntityStorageInterface::class);
$entity_without_layout = $this->prophesize(FieldableEntityInterface::class);
$entity_without_layout->hasField(OverridesSectionStorage::FIELD_NAME)->willReturn(FALSE);
$entity_without_layout->get(OverridesSectionStorage::FIELD_NAME)->shouldNotBeCalled();
$entity_storage->load('entity_without_layout')->willReturn($entity_without_layout->reveal());
$this->entityRepository->getActive('my_entity_type', 'entity_without_layout')->willReturn($entity_without_layout->reveal());
$entity_with_layout = $this->prophesize(FieldableEntityInterface::class);
$entity_with_layout->hasField(OverridesSectionStorage::FIELD_NAME)->willReturn(TRUE);
$entity_with_layout->get(OverridesSectionStorage::FIELD_NAME)->willReturn('the_return_value');
$entity_storage->load('entity_with_layout')->willReturn($entity_with_layout->reveal());
$this->entityTypeManager->getStorage($expected_entity_type_id)->willReturn($entity_storage->reveal());
$this->entityRepository->getActive('my_entity_type', 'entity_with_layout')->willReturn($entity_with_layout->reveal());
$entity_type = new EntityType(['id' => $expected_entity_type_id]);
$this->entityTypeManager->getDefinition($expected_entity_type_id)->willReturn($entity_type);
......@@ -191,23 +195,21 @@ public function providerTestGetSectionListFromId() {
*/
public function testExtractEntityFromRoute($success, $expected_entity_type_id, $value, array $defaults) {
if ($expected_entity_type_id) {
$entity_storage = $this->prophesize(EntityStorageInterface::class);
$entity_without_layout = $this->prophesize(FieldableEntityInterface::class);
$entity_without_layout->hasField(OverridesSectionStorage::FIELD_NAME)->willReturn(FALSE);
$entity_storage->load('entity_without_layout')->willReturn($entity_without_layout->reveal());
$this->entityRepository->getActive($expected_entity_type_id, 'entity_without_layout')->willReturn($entity_without_layout->reveal());
$entity_with_layout = $this->prophesize(FieldableEntityInterface::class);
$entity_with_layout->hasField(OverridesSectionStorage::FIELD_NAME)->willReturn(TRUE);
$entity_storage->load('entity_with_layout')->willReturn($entity_with_layout->reveal());
$this->entityTypeManager->getStorage($expected_entity_type_id)->willReturn($entity_storage->reveal());
$this->entityRepository->getActive($expected_entity_type_id, 'entity_with_layout')->willReturn($entity_with_layout->reveal());
$entity_type = new EntityType([
'id' => $expected_entity_type_id,
]);
$this->entityTypeManager->getDefinition($expected_entity_type_id)->willReturn($entity_type);
}
else {
$this->entityTypeManager->getStorage(Argument::any())->shouldNotBeCalled();
$this->entityRepository->getActive(Argument::any())->shouldNotBeCalled();
}
$method = new \ReflectionMethod($this->plugin, 'extractEntityFromRoute');
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment