diff --git a/src/Entity/PageVariant.php b/src/Entity/PageVariant.php index 58ad7f8..da58425 100644 --- a/src/Entity/PageVariant.php +++ b/src/Entity/PageVariant.php @@ -7,12 +7,14 @@ namespace Drupal\page_manager\Entity; +use Drupal\Component\Render\HtmlEscapedText; use Drupal\Core\Cache\Cache; use Drupal\Core\Condition\ConditionPluginCollection; use Drupal\Core\Config\Entity\ConfigEntityBase; use Drupal\Core\Entity\EntityStorageInterface; use Drupal\Core\Entity\EntityTypeInterface; use Drupal\Core\Plugin\DefaultSingleLazyPluginCollection; +use Drupal\Core\Render\Markup; use Drupal\page_manager\PageInterface; use Drupal\page_manager\PageVariantInterface; @@ -470,4 +472,27 @@ public function __sleep() { return $vars; } + /** + * {@inheritdoc} + */ + public function generateTitle() { + $page_variant = $this->getVariantPlugin(); + if (is_callable([$page_variant, 'getPageTitle'])) { + // Get the variant context. + $contexts = $this->getContexts(); + // Get the variant page entity. + $tokens = []; + + foreach ($contexts as $key => $context) { + $tokens[$key] = $context->getContextValue(); + } + // Get the page variant page title setting. + $variant_title_setting = $page_variant->getPageTitle(); + // Load the Token service and run our page title through it. + $token_service = \Drupal::token(); + return Markup::create($token_service->replace(new HtmlEscapedText($variant_title_setting), $tokens)); + } + return $this->getPage()->label(); + } + } diff --git a/src/PageVariantInterface.php b/src/PageVariantInterface.php index d0cd19a..60c4115 100644 --- a/src/PageVariantInterface.php +++ b/src/PageVariantInterface.php @@ -181,4 +181,11 @@ public function setStaticContext($name, $configuration); */ public function removeStaticContext($name); + /** + * Retrieves the variant page title. + * + * @return string + */ + public function generateTitle(); + } diff --git a/src/Routing/PageManagerRoutes.php b/src/Routing/PageManagerRoutes.php index 7def0d8..8395d1d 100644 --- a/src/Routing/PageManagerRoutes.php +++ b/src/Routing/PageManagerRoutes.php @@ -65,6 +65,7 @@ protected function alterRoutes(RouteCollection $collection) { $requirements = []; $route_name = "page_manager.page_view_$entity_id"; + $title_callback = NULL; if ($overridden_route_name = $this->findOverriddenRouteName($entity, $collection)) { $base_route_name = $overridden_route_name; @@ -75,6 +76,7 @@ protected function alterRoutes(RouteCollection $collection) { $path = $collection_route->getPath(); $parameters = $collection_route->getOption('parameters') ?: []; $requirements = $collection_route->getRequirements(); + $title_callback = $collection_route->getDefault('_title_callback') ?: NULL; } else { $base_route_name = $route_name; @@ -95,6 +97,10 @@ protected function alterRoutes(RouteCollection $collection) { $defaults['_entity_view'] = 'page_manager_page_variant'; $defaults['_title'] = $entity->label(); + if ($title_callback) { + unset($defaults['_title']); + $defaults['_title_callback'] = $title_callback; + } $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/src/Routing/TitleCallback.php b/src/Routing/TitleCallback.php new file mode 100644 index 0000000..87a3779 --- /dev/null +++ b/src/Routing/TitleCallback.php @@ -0,0 +1,67 @@ +controllerResolver = $controllerResolver; + } + + /** + * Title callback for page manager pages. + * + * @param \Drupal\page_manager\PageVariantInterface|string $page_manager_page_variant + * Page manager variant. + * @param string $base_title_callback + * Base title callback. + * + * @return string + * The title. + */ + public function title($page_manager_page_variant, $base_title_callback = NULL, Request $request) { + if (!$page_manager_page_variant instanceof PageVariantInterface) { + $page_manager_page_variant = PageVariant::load($page_manager_page_variant); + } + else { + return $page_manager_page_variant->generateTitle(); + } + $variant = $page_manager_page_variant->getVariantPlugin(); + if ($variant instanceof PageBlockDisplayVariant) { + return $variant->generateTitle(); + } + return $page_manager_page_variant->label(); + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + return new static($container->get('controller_resolver')); + } + +}