Issue #1401778 by dawehner, tim.plunkett, damiankloip: Added the ability to clone a display while changing the display plugin.
parent
8d65d777d0
commit
bbaf2a5462
|
@ -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');
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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" => '</li>',
|
||||
);
|
||||
}
|
||||
|
||||
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' => '<li class="duplicate">',
|
||||
'#suffix' => '</li>',
|
||||
);
|
||||
}
|
||||
}
|
||||
else {
|
||||
$build['top']['actions']['undo_delete'] = array(
|
||||
|
@ -766,6 +782,38 @@ class ViewEditFormController extends ViewFormControllerBase {
|
|||
$form_state['redirect'] = 'admin/structure/views/view/' . $view->id() . '/edit/' . $display_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Submit handler to clone a display as another display type.
|
||||
*/
|
||||
public function submitCloneDisplayAsType($form, &$form_state) {
|
||||
$view = $this->getEntity($form_state);
|
||||
$display_id = $view->displayID;
|
||||
|
||||
// Create the new display.
|
||||
$parents = $form_state['triggering_element']['#parents'];
|
||||
$display_type = array_pop($parents);
|
||||
$new_display_id = $view->addDisplay($display_type);
|
||||
$displays = $view->get('display');
|
||||
|
||||
// Let the display title be generated by the addDisplay method and set the
|
||||
// right display plugin, but keep the rest from the original display.
|
||||
$display_clone = $displays[$display_id];
|
||||
unset($display_clone['display_title']);
|
||||
unset($display_clone['display_plugin']);
|
||||
|
||||
$displays[$new_display_id] = NestedArray::mergeDeep($displays[$new_display_id], $display_clone);
|
||||
$displays[$new_display_id]['id'] = $new_display_id;
|
||||
$view->set('display', $displays);
|
||||
|
||||
// By setting the current display the changed marker will appear on the new
|
||||
// display.
|
||||
$view->get('executable')->current_display = $new_display_id;
|
||||
views_ui_cache_set($view);
|
||||
|
||||
// Redirect to the new display's edit page.
|
||||
$form_state['redirect'] = 'admin/structure/views/view/' . $view->id() . '/edit/' . $new_display_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build a renderable array representing one option on the edit form.
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue