diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php b/core/modules/views/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php index 07423cb..b6f56af 100644 --- a/core/modules/views/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php +++ b/core/modules/views/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php @@ -811,13 +811,20 @@ public function usesFields() { public function getPlugin($type) { // Look up the plugin name to use for this instance. $options = $this->getOption($type); - $name = $options['type']; + + // Return now if no options have been loaded. + if (empty($options) || !isset($options['type'])) { + return; + } // Query plugins allow specifying a specific query class per base table. if ($type == 'query') { $views_data = Views::viewsData()->get($this->view->storage->get('base_table')); $name = isset($views_data['table']['base']['query_id']) ? $views_data['table']['base']['query_id'] : 'views_query'; } + else { + $name = $options['type']; + } // Plugin instances are stored on the display for re-use. if (!isset($this->plugins[$type][$name])) { diff --git a/core/modules/views/lib/Drupal/views/Tests/Plugin/DisplayUnitTest.php b/core/modules/views/lib/Drupal/views/Tests/Plugin/DisplayUnitTest.php index 2d033b9..b1c854e 100644 --- a/core/modules/views/lib/Drupal/views/Tests/Plugin/DisplayUnitTest.php +++ b/core/modules/views/lib/Drupal/views/Tests/Plugin/DisplayUnitTest.php @@ -7,7 +7,13 @@ namespace Drupal\views\Tests\Plugin; use Drupal\views\Tests\ViewUnitTestBase; -use Drupal\views\ViewExecutable; +use Drupal\views\Plugin\views\style\StylePluginBase; +use Drupal\views\Plugin\views\access\AccessPluginBase; +use Drupal\views\Plugin\views\exposed_form\ExposedFormPluginBase; +use Drupal\views\Plugin\views\pager\PagerPluginBase; +use Drupal\views\Plugin\views\query\QueryPluginBase; +use Drupal\views\Plugin\views\cache\CachePluginBase; +use Drupal\views\Plugin\views\row\RowPluginBase; /** * Drupal unit tests for the DisplayPluginBase class. @@ -87,7 +93,35 @@ public function testDefaultOptions() { $this->assertIdentical($display_data[$id]['display_options'][$type], $options); } } + } + + /** + * Tests the \Drupal\views\Plugin\views\display\DisplayPluginBase::getPlugin() method. + */ + public function testGetPlugin() { + $view = views_get_view('test_display_defaults'); + $view->initDisplay(); + $display_handler = $view->display_handler; + $this->assertTrue($display_handler->getPlugin('access') instanceof AccessPluginBase, 'An access plugin instance was returned.'); + $this->assertTrue($display_handler->getPlugin('cache') instanceof CachePluginBase, 'A cache plugin instance was returned.'); + $this->assertTrue($display_handler->getPlugin('exposed_form') instanceof ExposedFormPluginBase, 'An exposed_form plugin instance was returned.'); + $this->assertTrue($display_handler->getPlugin('pager') instanceof PagerPluginBase, 'A pager plugin instance was returned.'); + $this->assertTrue($display_handler->getPlugin('query') instanceof QueryPluginBase, 'A query plugin instance was returned.'); + $this->assertTrue($display_handler->getPlugin('row') instanceof RowPluginBase, 'A row plugin instance was returned.'); + $this->assertTrue($display_handler->getPlugin('style') instanceof StylePluginBase, 'A style plugin instance was returned.'); + // Test that nothing is returned when an invalid type is requested. + $this->assertNull($display_handler->getPlugin('invalid'), 'NULL was returned for an invalid instance'); + // Test that nothing was returned for an instance with no 'type' in options. + unset($display_handler->options['access']); + $this->assertNull($display_handler->getPlugin('access'), 'NULL was returned for a plugin type with no "type" option'); + + // Get a plugin twice, and make sure the same instance is returned. + $view->destroy(); + $view->initDisplay(); + $first = spl_object_hash($display_handler->getPlugin('style')); + $second = spl_object_hash($display_handler->getPlugin('style')); + $this->assertIdentical($first, $second, 'A cached plugin instance was returned.'); } } diff --git a/core/modules/views_ui/lib/Drupal/views_ui/Tests/DisplayPath.php b/core/modules/views_ui/lib/Drupal/views_ui/Tests/DisplayPath.php index 89f4822..8f63b66 100644 --- a/core/modules/views_ui/lib/Drupal/views_ui/Tests/DisplayPath.php +++ b/core/modules/views_ui/lib/Drupal/views_ui/Tests/DisplayPath.php @@ -39,7 +39,7 @@ public function testPathUI() { // Save a path and make sure the summary appears as expected. $random_path = $this->randomName(); - $this->drupalPost("admin/structure/views/nojs/display/test_view/page_1/path", array('path' => $random_path), t('Apply')); + $this->drupalPost('admin/structure/views/nojs/display/test_view/page_1/path', array('path' => $random_path), t('Apply')); $this->assertText('/' . $random_path, 'The custom path appears in the summary.'); $this->assertLink(t('View @display', array('@display' => 'Page')), 0, 'view page link found on the page.'); } @@ -55,4 +55,31 @@ public function testDeleteWithNoPath() { $this->assertRaw(t('The view %view has been saved.', array('%view' => 'Test view'))); } + /** + * Tests the menu and tab option form. + */ + public function testMenuOptions() { + $this->container->get('module_handler')->enable(array('menu')); + $this->drupalGet('admin/structure/views/view/test_view'); + + // Add a new page display. + $this->drupalPost(NULL, array(), 'Add Page'); + // Save a path. + $this->drupalPost('admin/structure/views/nojs/display/test_view/page_1/path', array('path' => $this->randomString()), t('Apply')); + $this->drupalGet('admin/structure/views/view/test_view'); + + $this->drupalPost('admin/structure/views/nojs/display/test_view/page_1/menu', array('menu[type]' => 'default tab', 'menu[title]' => 'Test tab title'), t('Apply')); + $this->assertResponse(200); + $this->assertUrl('admin/structure/views/nojs/display/test_view/page_1/tab_options'); + + $this->drupalPost(NULL, array('tab_options[type]' => 'tab', 'tab_options[title]' => $this->randomString()), t('Apply')); + $this->assertResponse(200); + $this->assertUrl('admin/structure/views/view/test_view/edit/page_1'); + + $this->drupalGet('admin/structure/views/view/test_view'); + $this->assertLink(t('Tab: @title', array('@title' => 'Test tab title'))); + // If it's a default tab, it should also have an additional settings link. + $this->assertLinkByHref('admin/structure/views/nojs/display/test_view/page_1/tab_options'); + } + }