diff --git a/core/modules/views_ui/src/ViewEditForm.php b/core/modules/views_ui/src/ViewEditForm.php index 4cd808ce81cbbac335c89908425ed3524ed95ddb..93dc5c88984d6cfa4a9210cf33b7dda450208cf5 100644 --- a/core/modules/views_ui/src/ViewEditForm.php +++ b/core/modules/views_ui/src/ViewEditForm.php @@ -300,6 +300,8 @@ public function save(array $form, FormStateInterface $form_state) { foreach ($executable->displayHandlers as $id => $display) { if (!empty($display->display['new_id']) && $display->display['new_id'] !== $display->display['id'] && empty($display->display['deleted'])) { $new_id = $display->display['new_id']; + $attachments = $display->getAttachedDisplays(); + $old_id = $display->display['id']; $display->display['id'] = $new_id; unset($display->display['new_id']); $executable->displayHandlers->set($new_id, $display); @@ -312,6 +314,16 @@ public function save(array $form, FormStateInterface $form_state) { 'view' => $view->id(), 'display_id' => $new_id, ]); + + // Find attachments attached to old display id and attach them with new id. + if ($attachments) { + foreach ($attachments as $attachment) { + $attached_options = $executable->displayHandlers->get($attachment)->getOption('displays'); + unset($attached_options[$old_id]); + $attached_options[$new_id] = $new_id; + $executable->displayHandlers->get($attachment)->setOption('displays', $attached_options); + } + } } elseif (isset($display->display['new_id'])) { unset($display->display['new_id']); diff --git a/core/modules/views_ui/tests/src/Functional/DisplayAttachmentTest.php b/core/modules/views_ui/tests/src/Functional/DisplayAttachmentTest.php index 4d2fb5eca41700dfe48d490151585ab9bd512610..6536ef40d71a08a636b894003b01a1c168640edc 100644 --- a/core/modules/views_ui/tests/src/Functional/DisplayAttachmentTest.php +++ b/core/modules/views_ui/tests/src/Functional/DisplayAttachmentTest.php @@ -105,4 +105,35 @@ public function testRemoveAttachedDisplay() { } + /** + * Tests the attachment after changing machine name. + */ + public function testAttachmentOnAttachedMachineNameChange(): void { + + $view = $this->randomView(); + $path_prefix = 'admin/structure/views/view/' . $view['id'] . '/edit'; + $attachment_display_url = 'admin/structure/views/nojs/display/' . $view['id'] . '/attachment_1/displays'; + + // Open the Page display and create the attachment display. + $this->drupalGet($path_prefix . '/page_1'); + $this->submitForm([], 'Add Attachment'); + $this->assertSession()->pageTextContains('Not defined'); + + // Attach the Attachment to the Default and Page display. + $this->drupalGet($attachment_display_url); + $this->submitForm(['displays[default]' => 1, 'displays[page_1]' => 1], 'Apply'); + $this->submitForm([], 'Save'); + + // Change the machine name of the page. + $this->drupalGet('admin/structure/views/nojs/display/' . $view['id'] . '/page_1/display_id'); + $this->submitForm(['display_id' => 'page_new_id'], 'Apply'); + $this->submitForm([], 'Save'); + + // Check that the attachment is still attached to the page. + $this->drupalGet($attachment_display_url); + $this->assertSession()->checkboxChecked("edit-displays-default"); + $this->assertSession()->checkboxChecked("edit-displays-page-new-id"); + + } + }