diff --git a/src/Plugin/DisplayBuilder/StandardDisplayBuilder.php b/src/Plugin/DisplayBuilder/StandardDisplayBuilder.php index 20fbb61..9f3e8c7 100644 --- a/src/Plugin/DisplayBuilder/StandardDisplayBuilder.php +++ b/src/Plugin/DisplayBuilder/StandardDisplayBuilder.php @@ -3,6 +3,7 @@ namespace Drupal\panels\Plugin\DisplayBuilder; use Drupal\Component\Utility\Html; +use Drupal\Core\Block\TitleBlockPluginInterface; use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Cache\CacheableMetadata; use Drupal\Core\Plugin\ContainerFactoryPluginInterface; @@ -95,12 +96,14 @@ class StandardDisplayBuilder extends DisplayBuilderBase implements PluginWizardI * The render array representing regions. * @param array $contexts * The array of context objects. + * @param string $title + * The page title. * * @return array * An associative array, keyed by region ID, containing the render arrays * representing the content of each region. */ - protected function buildRegions(array $regions, array $contexts) { + protected function buildRegions(array $regions, array $contexts, $title = NULL) { $build = []; foreach ($regions as $region => $blocks) { if (!$blocks) { @@ -117,6 +120,9 @@ class StandardDisplayBuilder extends DisplayBuilderBase implements PluginWizardI if ($block instanceof ContextAwarePluginInterface) { $this->contextHandler->applyContextMapping($block, $contexts); } + if ($block instanceof TitleBlockPluginInterface) { + $block->setTitle($title); + } if ($block->access($this->account)) { $block_render_array = [ '#theme' => 'block', @@ -172,8 +178,9 @@ class StandardDisplayBuilder extends DisplayBuilderBase implements PluginWizardI $regions = $panels_display->getRegionAssignments(); $contexts = $panels_display->getContexts(); $layout = $panels_display->getLayout(); + $title = $panels_display->getRenderedPageTitle(); - $regions = $this->buildRegions($regions, $contexts); + $regions = $this->buildRegions($regions, $contexts, $title); if ($layout) { $regions = $layout->build($regions); } diff --git a/src/Plugin/DisplayVariant/PanelsDisplayVariant.php b/src/Plugin/DisplayVariant/PanelsDisplayVariant.php index 08b5ffb..0571b3c 100644 --- a/src/Plugin/DisplayVariant/PanelsDisplayVariant.php +++ b/src/Plugin/DisplayVariant/PanelsDisplayVariant.php @@ -300,6 +300,15 @@ class PanelsDisplayVariant extends BlockDisplayVariant implements PluginWizardIn return $this->getLayout()->getPluginDefinition()->getRegionLabels(); } + /** + * This will provide the rendered the page title with tokens replaced. + * + * @return string + */ + public function getRenderedPageTitle() { + return $this->renderPageTitle($this->getPageTitle()); + } + /** * Returns the configured page title. * @@ -327,7 +336,7 @@ class PanelsDisplayVariant extends BlockDisplayVariant implements PluginWizardIn */ public function build() { $build = $this->getBuilder()->build($this); - $build['#title'] = $this->renderPageTitle($this->configuration['page_title']); + $build['#title'] = $this->getRenderedPageTitle(); // Allow other module to alter the built panel. $this->moduleHandler->alter('panels_build', $build, $this); diff --git a/tests/src/Kernel/StandardDisplayBuilderTest.php b/tests/src/Kernel/StandardDisplayBuilderTest.php new file mode 100644 index 0000000..1deb9a9 --- /dev/null +++ b/tests/src/Kernel/StandardDisplayBuilderTest.php @@ -0,0 +1,119 @@ +config('system.site')->set('name', 'Drupal')->save(); + } + + + /** + * Test that page title with normal text is rendered correctly. + */ + public function testNormalPageTitle() { + /** @var \Drupal\panels\Plugin\DisplayBuilder\DisplayBuilderManagerInterface $displayBuilderManager */ + $displayBuilderManager = $this->container->get('plugin.manager.panels.display_builder'); + + /** @var \Drupal\panels\Plugin\DisplayBuilder\DisplayBuilderInterface $standardDisplayBuilder */ + $standardDisplayBuilder = $displayBuilderManager->createInstance('standard'); + + $variant = PageVariant::create([ + 'id' => 'stunning', + 'label' => $this->randomMachineName(), + 'variant' => 'panels_variant', + 'variant_settings' => [ + 'page_title' => 'Pastafazoul', + 'storage_type' => 'page_manager', + 'storage_id' => $this->randomMachineName(), + 'layout' => 'layout_onecol', + 'layout_settings' => [], + 'blocks' => [ + 'page_title_block' => [ + 'id' => 'page_title_block', + 'label' => '', + 'provider' => FALSE, + 'label_display' => FALSE, + 'region' => 'content' + ] + ] + ], + 'page' => $this->randomMachineName(), + ]); + + $buildResult = $standardDisplayBuilder->build($variant->getVariantPlugin()); + + $this->assertSame('Pastafazoul', '' . $buildResult['content']['page_title_block']['content']['#title']); + } + + /** + * Test that page title with token is rendered correctly. + */ + public function testTokenPageTitle() { + /** @var \Drupal\panels\Plugin\DisplayBuilder\DisplayBuilderManagerInterface $displayBuilderManager */ + $displayBuilderManager = $this->container->get('plugin.manager.panels.display_builder'); + + /** @var \Drupal\panels\Plugin\DisplayBuilder\DisplayBuilderInterface $standardDisplayBuilder */ + $standardDisplayBuilder = $displayBuilderManager->createInstance('standard'); + + $variant = PageVariant::create([ + 'id' => 'stunning', + 'label' => $this->randomMachineName(), + 'variant' => 'panels_variant', + 'variant_settings' => [ + 'page_title' => '[site:name]', + 'storage_type' => 'page_manager', + 'storage_id' => $this->randomMachineName(), + 'layout' => 'layout_onecol', + 'layout_settings' => [], + 'blocks' => [ + 'page_title_block' => [ + 'id' => 'page_title_block', + 'label' => '', + 'provider' => FALSE, + 'label_display' => FALSE, + 'region' => 'content' + ] + ] + ], + 'page' => $this->randomMachineName(), + ]); + + $buildResult = $standardDisplayBuilder->build($variant->getVariantPlugin()); + $this->assertSame('Drupal', '' . $buildResult['content']['page_title_block']['content']['#title']); + } + } +} + +namespace Drupal\Core\Extension { + if (!function_exists('system_get_info')) { + function system_get_info($type, $name = NULL) { + switch ($name) { + case 'ctools': + return 'Chaos tools'; + default: + return $name; + } + } + } +} diff --git a/tests/src/Unit/StandardDisplayBuilderTest.php b/tests/src/Unit/StandardDisplayBuilderTest.php index 4f703f1..60e9b3c 100644 --- a/tests/src/Unit/StandardDisplayBuilderTest.php +++ b/tests/src/Unit/StandardDisplayBuilderTest.php @@ -69,6 +69,7 @@ class StandardDisplayBuilderTest extends UnitTestCase { $regions['footer'] = array(); $panels_display = $this->prophesize(PanelsDisplayVariant::class); + $panels_display->getRenderedPageTitle()->willReturn('test'); $panels_display->getRegionAssignments()->willReturn($regions); $panels_display->getContexts()->willReturn([]); $panels_display->getLayout()->willReturn(NULL);