diff --git a/core/modules/layout_builder/src/Form/LayoutBuilderEntityViewDisplayForm.php b/core/modules/layout_builder/src/Form/LayoutBuilderEntityViewDisplayForm.php index 63ec398eec..e790eb2e39 100644 --- a/core/modules/layout_builder/src/Form/LayoutBuilderEntityViewDisplayForm.php +++ b/core/modules/layout_builder/src/Form/LayoutBuilderEntityViewDisplayForm.php @@ -61,7 +61,7 @@ public function form(array $form, FormStateInterface $form_state) { // @todo Expand to work for all view modes in // https://www.drupal.org/node/2907413. - if ($this->entity->getMode() === 'default') { + if ($this->isCanonicalMode($this->entity->getMode())) { $form['layout'] = [ '#type' => 'details', '#open' => TRUE, @@ -89,6 +89,35 @@ public function form(array $form, FormStateInterface $form_state) { return $form; } + /** + * Determines if the mode is used by the canonical route. + * + * @param string $mode + * The view mode. + * + * @return bool + * TRUE if the mode is valid, FALSE otherwise. + */ + protected function isCanonicalMode($mode) { + // @todo This is a convention core uses but is not a given, nor is it easily + // introspectable. Address in https://www.drupal.org/node/2907413. + $canonical_mode = 'full'; + + if ($mode === $canonical_mode) { + return TRUE; + } + + // The default mode is valid if the canonical mode is not enabled. + if ($mode === 'default') { + $query = $this->entityTypeManager->getStorage($this->entity->getEntityTypeId())->getQuery() + ->condition('status', TRUE) + ->condition('mode', $canonical_mode); + return !$query->count()->execute(); + } + + return FALSE; + } + /** * Determines if the defaults have any overrides. * diff --git a/core/modules/layout_builder/tests/src/Functional/LayoutBuilderTest.php b/core/modules/layout_builder/tests/src/Functional/LayoutBuilderTest.php index 62429573a4..003b2a717f 100644 --- a/core/modules/layout_builder/tests/src/Functional/LayoutBuilderTest.php +++ b/core/modules/layout_builder/tests/src/Functional/LayoutBuilderTest.php @@ -277,6 +277,12 @@ public function testLayoutBuilderUiFullViewMode() { ])); $field_ui_prefix = 'admin/structure/types/manage/bundle_with_section_field'; + + // For the purposes of this test, turn the full view mode on and off to + // prevent copying from the customized default view mode. + $this->drupalPostForm("$field_ui_prefix/display/default", ['display_modes_custom[full]' => TRUE], 'Save'); + $this->drupalPostForm("$field_ui_prefix/display/default", ['display_modes_custom[full]' => FALSE], 'Save'); + // Allow overrides for the layout. $this->drupalPostForm("$field_ui_prefix/display/default", ['layout[allow_custom]' => TRUE], 'Save'); @@ -293,8 +299,10 @@ public function testLayoutBuilderUiFullViewMode() { // The default view mode is used for both the node display and layout UI. $this->drupalGet('node/1'); $assert_session->pageTextContains('This is the default view mode'); + $assert_session->pageTextNotContains('This is the full view mode'); $this->drupalGet('node/1/layout'); $assert_session->pageTextContains('This is the default view mode'); + $assert_session->pageTextNotContains('This is the full view mode'); $this->clickLink('Cancel Layout'); // Enable the full view mode and customize it. @@ -311,17 +319,53 @@ public function testLayoutBuilderUiFullViewMode() { // The full view mode is now used for both the node display and layout UI. $this->drupalGet('node/1'); $assert_session->pageTextContains('This is the full view mode'); + $assert_session->pageTextNotContains('This is the default view mode'); $this->drupalGet('node/1/layout'); $assert_session->pageTextContains('This is the full view mode'); + $assert_session->pageTextNotContains('This is the default view mode'); $this->clickLink('Cancel Layout'); // Disable the full view mode, the default should be used again. $this->drupalPostForm("$field_ui_prefix/display/default", ['display_modes_custom[full]' => FALSE], 'Save'); $this->drupalGet('node/1'); $assert_session->pageTextContains('This is the default view mode'); + $assert_session->pageTextNotContains('This is the full view mode'); $this->drupalGet('node/1/layout'); $assert_session->pageTextContains('This is the default view mode'); + $assert_session->pageTextNotContains('This is the full view mode'); $this->clickLink('Cancel Layout'); + + $this->drupalPostForm("$field_ui_prefix/display/default", ['display_modes_custom[full]' => TRUE], 'Save'); + $this->drupalPostForm("$field_ui_prefix/display/full", ['layout[allow_custom]' => TRUE], 'Save'); + $this->drupalGet('node/1'); + $assert_session->pageTextContains('This is the full view mode'); + $assert_session->pageTextNotContains('This is the default view mode'); + $this->drupalGet('node/1/layout'); + $assert_session->pageTextContains('This is the full view mode'); + $assert_session->pageTextNotContains('This is the default view mode'); + + $this->clickLink('Add Block'); + $this->clickLink('Powered by Drupal'); + $page->fillField('settings[label]', 'This is an override of the full view mode'); + $page->checkField('settings[label_display]'); + $page->pressButton('Add Block'); + $assert_session->pageTextContains('This is an override of the full view mode'); + $this->clickLink('Save Layout'); + + $this->drupalGet('node/1'); + $assert_session->pageTextContains('This is the full view mode'); + $assert_session->pageTextContains('This is an override of the full view mode'); + $assert_session->pageTextNotContains('This is the default view mode'); + $this->drupalGet('node/1/layout'); + $assert_session->pageTextContains('This is the full view mode'); + $assert_session->pageTextContains('This is an override of the full view mode'); + $assert_session->pageTextNotContains('This is the default view mode'); + $this->clickLink('Cancel Layout'); + + $this->drupalGet("$field_ui_prefix/display-layout/full"); + $assert_session->pageTextContains('This is the full view mode'); + $assert_session->pageTextNotContains('This is an override of the full view mode'); + $assert_session->pageTextNotContains('This is the default view mode'); } /**