diff --git a/src/Controller/PageManagerController.php b/src/Controller/PageManagerController.php new file mode 100644 index 0000000..58b1923 --- /dev/null +++ b/src/Controller/PageManagerController.php @@ -0,0 +1,84 @@ +entityManager = $entity_manager; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + return new static( + $container->get('entity.manager') + ); + } + + /** + * Route title callback. + * + * @param mixed $page_manager_page_variant + * + * @return string + * The title for a particular page. + */ + public function pageTitle($page_manager_page_variant) { + if (is_string($page_manager_page_variant)) { + $page_manager_page_variant = $this->entityManager->loadEntityByConfigTarget('page_variant', $page_manager_page_variant); + } + + // Get the variant context. + $contexts = $page_manager_page_variant->getContexts(); + // Get the variant page entity. + + $tokens = []; + + foreach ($contexts as $key => $context) { + if ($context->hasContextValue()) { + if (is_object($context->getContextValue())) { + $tokens[$key] = $context->getContextValue(); + } + elseif (is_numeric($context->getContextValue())) { + // Try and load the context value if it is numeric and it's an entity + // data type + $data_type = $context->getContextDefinition()->getDataType(); + $matches = []; + if (preg_match('/entity:(\w+)/', $data_type, $matches)) { + $entity_type = $matches[1]; + if ($entity = $this->entityManager->getStorage($entity_type)->load($context->getContextValue())) { + $tokens[$key] = $entity; + } + } + } + } + } + + // Get the page variant page title setting. + $variant_title_setting = $page_manager_page_variant->getPageTitle(); + // Load the Token service and run our page title through it. + $token_service = \Drupal::token(); + return $token_service->replace($variant_title_setting, + $tokens); + } + +} diff --git a/src/Entity/PageVariant.php b/src/Entity/PageVariant.php index 58ad7f8..2313f1e 100644 --- a/src/Entity/PageVariant.php +++ b/src/Entity/PageVariant.php @@ -470,4 +470,15 @@ class PageVariant extends ConfigEntityBase implements PageVariantInterface { return $vars; } + /** + * {@inheritdoc} + */ + public function getPageTitle() { + $page_variant = $this->getVariantPlugin(); + if (is_callable([$page_variant, 'getPageTitle'])) { + return $page_variant->getPageTitle(); + } + return $this->getPage()->label(); + } + } diff --git a/src/PageVariantInterface.php b/src/PageVariantInterface.php index d0cd19a..199cf86 100644 --- a/src/PageVariantInterface.php +++ b/src/PageVariantInterface.php @@ -181,4 +181,11 @@ interface PageVariantInterface extends ConfigEntityInterface, EntityWithPluginCo */ public function removeStaticContext($name); + /** + * Retrieves the variant page title. + * + * @return string + */ + public function getPageTitle(); + } diff --git a/src/Plugin/DisplayVariant/PageBlockDisplayVariant.php b/src/Plugin/DisplayVariant/PageBlockDisplayVariant.php index 4b704d0..cb0de73 100644 --- a/src/Plugin/DisplayVariant/PageBlockDisplayVariant.php +++ b/src/Plugin/DisplayVariant/PageBlockDisplayVariant.php @@ -336,4 +336,11 @@ class PageBlockDisplayVariant extends BlockDisplayVariant implements PluginWizar return $vars; } + /** + * {@inheritdoc} + */ + public function getPageTitle() { + return $this->renderPageTitle($this->configuration['page_title']); + } + } diff --git a/src/Routing/PageManagerRoutes.php b/src/Routing/PageManagerRoutes.php index 7def0d8..1dda3cd 100644 --- a/src/Routing/PageManagerRoutes.php +++ b/src/Routing/PageManagerRoutes.php @@ -94,7 +94,7 @@ class PageManagerRoutes extends RouteSubscriberBase { $defaults['base_route_name'] = $base_route_name; $defaults['_entity_view'] = 'page_manager_page_variant'; - $defaults['_title'] = $entity->label(); + $defaults['_title_callback'] = '\Drupal\page_manager\Controller\PageManagerController::pageTitle'; $defaults['page_manager_page'] = $entity->id(); $parameters['page_manager_page_variant']['type'] = 'entity:page_variant'; $parameters['page_manager_page']['type'] = 'entity:page'; diff --git a/tests/src/Unit/PageManagerRoutesTest.php b/tests/src/Unit/PageManagerRoutesTest.php index d0fff14..b78ee6e 100644 --- a/tests/src/Unit/PageManagerRoutesTest.php +++ b/tests/src/Unit/PageManagerRoutesTest.php @@ -92,9 +92,6 @@ class PageManagerRoutesTest extends UnitTestCase { $variant1->getWeight()->willReturn(0); $page1->getVariants() ->willReturn(['variant1' => $variant1->reveal()]); - $page1->label() - ->willReturn('Page label') - ->shouldBeCalled(); $page1->usesAdminTheme() ->willReturn(TRUE) ->shouldBeCalled(); @@ -130,7 +127,7 @@ class PageManagerRoutesTest extends UnitTestCase { $route = $collection->get('page_manager.page_view_page1_variant1'); $expected_defaults = [ '_entity_view' => 'page_manager_page_variant', - '_title' => 'Page label', + '_title_callback' => '\Drupal\page_manager\Controller\PageManagerController::pageTitle', 'page_manager_page_variant' => 'variant1', 'page_manager_page' => 'page1', 'page_manager_page_variant_weight' => 0, @@ -208,7 +205,7 @@ class PageManagerRoutesTest extends UnitTestCase { $route = $collection->get('page_manager.page_view_page1_variant1'); $expected_defaults = [ '_entity_view' => 'page_manager_page_variant', - '_title' => NULL, + '_title_callback' => '\Drupal\page_manager\Controller\PageManagerController::pageTitle', 'page_manager_page_variant' => 'variant1', 'page_manager_page' => 'page1', 'page_manager_page_variant_weight' => 0, @@ -297,7 +294,7 @@ class PageManagerRoutesTest extends UnitTestCase { 'path' => '/test_route1', 'defaults' => [ '_entity_view' => 'page_manager_page_variant', - '_title' => 'Page 1', + '_title_callback' => '\Drupal\page_manager\Controller\PageManagerController::pageTitle', 'page_manager_page_variant' => 'variant1', 'page_manager_page' => 'page1', 'page_manager_page_variant_weight' => 0, @@ -325,7 +322,7 @@ class PageManagerRoutesTest extends UnitTestCase { 'path' => '/test_route2', 'defaults' => [ '_entity_view' => 'page_manager_page_variant', - '_title' => 'Page 2', + '_title_callback' => '\Drupal\page_manager\Controller\PageManagerController::pageTitle', 'page_manager_page_variant' => 'variant2', 'page_manager_page' => 'page2', 'page_manager_page_variant_weight' => 0, @@ -386,7 +383,7 @@ class PageManagerRoutesTest extends UnitTestCase { $expected_defaults = [ '_entity_view' => 'page_manager_page_variant', - '_title' => NULL, + '_title_callback' => '\Drupal\page_manager\Controller\PageManagerController::pageTitle', 'page_manager_page_variant' => 'variant1', 'page_manager_page' => 'page1', 'page_manager_page_variant_weight' => 0,