diff --git a/page_manager.module b/page_manager.module index 7fd5c95..f683c9e 100644 --- a/page_manager.module +++ b/page_manager.module @@ -26,7 +26,7 @@ function page_manager_form_page_manager_display_variant_form_alter(array &$form, } /** - * @todo. + * Saves the third party settings for a page display variant. * * @see page_manager_form_page_manager_display_variant_form_alter() */ @@ -37,7 +37,7 @@ function page_manager_form_page_manager_display_variant_form_submit(array &$form $page = $variant_form->getPage(); $display_variant_id = $variant_form->getDisplayVariant()->getPluginId(); - $settings = $page->getThirdPartySettings('page_manager', $display_variant_id); + $settings = $page->getThirdPartySetting('page_manager', $display_variant_id); $settings['no_blocks'] = $form_state->getValue('no_blocks'); $page->setThirdPartySetting('page_manager', $display_variant_id, $settings); } diff --git a/src/EventSubscriber/DisableBlocksDisplayVariantSubscriber.php b/src/EventSubscriber/DisableBlocksDisplayVariantSubscriber.php index 01188c2..8536cd1 100644 --- a/src/EventSubscriber/DisableBlocksDisplayVariantSubscriber.php +++ b/src/EventSubscriber/DisableBlocksDisplayVariantSubscriber.php @@ -12,7 +12,7 @@ use Symfony\Component\EventDispatcher\EventSubscriberInterface; /** - * @todo. + * Disables page-level blocks for variants that select that option. */ class DisableBlocksDisplayVariantSubscriber implements EventSubscriberInterface { @@ -23,11 +23,19 @@ class DisableBlocksDisplayVariantSubscriber implements EventSubscriberInterface * The event to process. */ public function onSelectPageDisplayVariant(PageDisplayVariantSelectionEvent $event) { + // If this is a page manager page, the route match will have the entity as + // a parameter. /** @var \Drupal\page_manager\PageInterface $page */ if ($page = $event->getRouteMatch()->getParameter('page_manager_page')) { - $settings = $page->getThirdPartySetting('page_manager', $page->getExecutable()->selectDisplayVariant()->getPluginId()); - if (!empty($settings['no_blocks'])) { - $event->setPluginId('simple_page'); + // Find the selected variant for this page. + if ($variant = $page->getExecutable()->selectDisplayVariant()) { + // Check to see if this variant is configured to disable blocks. + $settings = $page->getThirdPartySetting('page_manager', $variant->getPluginId()); + if (!empty($settings['no_blocks'])) { + // If so, set the page display variant to use the simple page, which + // replaces the block-based page display. + $event->setPluginId('simple_page'); + } } } } diff --git a/tests/src/Unit/DisableBlocksDisplayVariantSubscriberTest.php b/tests/src/Unit/DisableBlocksDisplayVariantSubscriberTest.php new file mode 100644 index 0000000..4ef9a7b --- /dev/null +++ b/tests/src/Unit/DisableBlocksDisplayVariantSubscriberTest.php @@ -0,0 +1,115 @@ +getMock('\Drupal\page_manager\PageInterface'); + $page->expects($this->never()) + ->method('getExecutable'); + $route_match = new RouteMatch('the_route_name', new Route('/the/path/has/no/page_manager_page'), ['page_manager_page' => $page]); + $event = new PageDisplayVariantSelectionEvent('not_overridden', $route_match); + $subscriber = new DisableBlocksDisplayVariantSubscriber(); + $subscriber->onSelectPageDisplayVariant($event); + $this->assertSame('not_overridden', $event->getPluginId()); + } + + /** + * @covers ::onSelectPageDisplayVariant + */ + public function testNoSelectedVariant() { + $executable = $this->getMock('\Drupal\page_manager\PageExecutableInterface'); + $page = $this->getMock('\Drupal\page_manager\PageInterface'); + $page->expects($this->once()) + ->method('getExecutable') + ->willReturn($executable); + $page->expects($this->never()) + ->method('getThirdPartySetting'); + $executable->expects($this->once()) + ->method('selectDisplayVariant') + ->willReturn(NULL); + $route_match = new RouteMatch('the_route_name', new Route('/the/path/has/a/{page_manager_page}'), ['page_manager_page' => $page]); + $event = new PageDisplayVariantSelectionEvent('not_overridden', $route_match); + + (new DisableBlocksDisplayVariantSubscriber())->onSelectPageDisplayVariant($event); + $this->assertSame('not_overridden', $event->getPluginId()); + } + + /** + * @covers ::onSelectPageDisplayVariant + * + * @dataProvider providerNoBlocksSettings + */ + public function testNoBlocksSettings($settings, $expected) { + $executable = $this->getMock('\Drupal\page_manager\PageExecutableInterface'); + $page = $this->getMock('\Drupal\page_manager\PageInterface'); + $page->expects($this->once()) + ->method('getExecutable') + ->willReturn($executable); + $page->expects($this->once()) + ->method('getThirdPartySetting') + ->with('page_manager', 'the_plugin_id') + ->willReturn($settings); + + $variant = $this->getMock('\Drupal\Core\Display\VariantInterface'); + $variant->expects($this->once()) + ->method('getPluginId') + ->willReturn('the_plugin_id'); + $executable->expects($this->once()) + ->method('selectDisplayVariant') + ->willReturn($variant); + + $route_match = new RouteMatch('the_route_name', new Route('/the/path/has/a/{page_manager_page}'), ['page_manager_page' => $page]); + $event = new PageDisplayVariantSelectionEvent('not_overridden', $route_match); + + (new DisableBlocksDisplayVariantSubscriber())->onSelectPageDisplayVariant($event); + $this->assertSame($expected, $event->getPluginId()); + } + + public function providerNoBlocksSettings() { + $data = []; + $data[] = [ + NULL, + 'not_overridden', + ]; + $data[] = [ + [], + 'not_overridden', + ]; + $data[] = [ + ['no_blocks' => NULL], + 'not_overridden', + ]; + $data[] = [ + ['no_blocks' => FALSE], + 'not_overridden', + ]; + $data[] = [ + ['no_blocks' => TRUE], + 'simple_page', + ]; + return $data; + } + +}