diff --git a/core/modules/views/lib/Drupal/views/Tests/UI/DisplayTest.php b/core/modules/views/lib/Drupal/views/Tests/UI/DisplayTest.php index c5b38e46ca9..e7261628722 100644 --- a/core/modules/views/lib/Drupal/views/Tests/UI/DisplayTest.php +++ b/core/modules/views/lib/Drupal/views/Tests/UI/DisplayTest.php @@ -149,7 +149,35 @@ class DisplayTest extends UITestBase { $this->drupalGet($path_prefix); $this->drupalPost(NULL, array(), 'clone Page'); - $this->assertLinkByHref($path_prefix . '/page_1', 0, 'Make sure after cloning the new display appears in the UI'); + $this->assertLinkByHref($path_prefix . '/page_2', 0, 'Make sure after cloning the new display appears in the UI'); + $this->assertUrl($path_prefix . '/page_2', array(), 'The user got redirected to the new display.'); + + // Set the title and override the css classes. + $random_title = $this->randomName(); + $random_css = $this->randomName(); + $this->drupalPost("admin/structure/views/nojs/display/{$view['id']}/page_2/title", array('title' => $random_title), t('Apply')); + $this->drupalPost("admin/structure/views/nojs/display/{$view['id']}/page_2/css_class", array('override[dropdown]' => 'page_2', 'css_class' => $random_css), t('Apply')); + + // Clone as a different display type. + $this->drupalPost(NULL, array(), 'clone as Block'); + $this->assertLinkByHref($path_prefix . '/block_1', 0, 'Make sure after cloning the new display appears in the UI'); + $this->assertUrl($path_prefix . '/block_1', array(), 'The user got redirected to the new display.'); + $this->assertText(t('Block settings')); + $this->assertNoText(t('Page settings')); + + $this->drupalPost(NULL, array(), t('Save')); + $view = views_get_view($view['id']); + $view->initDisplay(); + + $page_2 = $view->displayHandlers->get('page_2'); + $this->assertTrue($page_2, 'The new page display got saved.'); + $this->assertEqual($page_2->display['display_title'], 'Page'); + $block_1 = $view->displayHandlers->get('block_1'); + $this->assertTrue($block_1, 'The new block display got saved.'); + $this->assertEqual($block_1->display['display_plugin'], 'block'); + $this->assertEqual($block_1->display['display_title'], 'Block', 'The new display title got generated as expected.'); + $this->assertEqual($block_1->getOption('title'), $random_title, 'The overridden title option from the display got copied into the clone'); + $this->assertEqual($block_1->getOption('css_class'), $random_css, 'The overridden css_class option from the display got copied into the clone'); } /** diff --git a/core/modules/views/views_ui/lib/Drupal/views_ui/ViewEditFormController.php b/core/modules/views/views_ui/lib/Drupal/views_ui/ViewEditFormController.php index 09008cf6ff4..595113f321b 100644 --- a/core/modules/views/views_ui/lib/Drupal/views_ui/ViewEditFormController.php +++ b/core/modules/views/views_ui/lib/Drupal/views_ui/ViewEditFormController.php @@ -8,6 +8,7 @@ namespace Drupal\views_ui; use Drupal\Core\Entity\EntityInterface; +use Drupal\Component\Utility\NestedArray; use Drupal\views\ViewExecutable; /** @@ -422,6 +423,21 @@ class ViewEditFormController extends ViewFormControllerBase { "#suffix" => '', ); } + + foreach (views_fetch_plugin_names('display', NULL, array($view->get('storage')->get('base_table'))) as $type => $label) { + if ($type == $display['display_plugin']) { + continue; + } + + $build['top']['actions']['clone_as'][$type] = array( + '#type' => 'submit', + '#value' => t('clone as @type', array('@type' => $label)), + '#limit_validation_errors' => array(), + '#submit' => array(array($this, 'submitCloneDisplayAsType'), array($this, 'submitDelayDestination')), + '#prefix' => '