‪TYPO3CMS  ‪main
PageTitleProviderManager.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Psr\Container\ContainerInterface;
21 use Psr\Http\Message\ServerRequestInterface;
22 use Psr\Log\LoggerAwareInterface;
23 use Psr\Log\LoggerAwareTrait;
28 
32 class ‪PageTitleProviderManager implements ‪SingletonInterface, LoggerAwareInterface
33 {
34  use LoggerAwareTrait;
35 
36  private array ‪$pageTitleCache = [];
37 
38  public function ‪__construct(
39  private readonly ContainerInterface $container,
40  private readonly ‪DependencyOrderingService $dependencyOrderingService,
41  private readonly ‪TypoScriptService $typoScriptService,
42  ) {}
43 
44  public function ‪getTitle(ServerRequestInterface $request): string
45  {
46  $pageTitle = '';
47 
48  $titleProviders = $this->‪getPageTitleProviderConfiguration($request);
49  $titleProviders = $this->‪setProviderOrder($titleProviders);
50  $orderedTitleProviders = $this->dependencyOrderingService->orderByDependencies($titleProviders);
51 
52  $this->logger->debug('Page title providers ordered', [
53  'orderedTitleProviders' => $orderedTitleProviders,
54  ]);
55 
56  foreach ($orderedTitleProviders as $configuration) {
57  if (class_exists($configuration['provider']) && is_subclass_of($configuration['provider'], PageTitleProviderInterface::class)) {
59  $titleProviderObject = $this->container->get($configuration['provider']);
60  if (method_exists($titleProviderObject, 'setRequest')) {
61  $titleProviderObject->setRequest($request);
62  }
63  if (($pageTitle = $titleProviderObject->getTitle())
64  || ($pageTitle = $this->pageTitleCache[$configuration['provider']] ?? '') !== ''
65  ) {
66  $this->logger->debug('Page title provider {provider} used on page {title}', [
67  'title' => $pageTitle,
68  'provider' => $configuration['provider'],
69  ]);
70  $this->pageTitleCache[$configuration['provider']] = $pageTitle;
71  break;
72  }
73  $this->logger->debug('Page title provider {provider} skipped on page {title}', [
74  'title' => $pageTitle,
75  'provider' => $configuration['provider'],
76  'providerUsed' => $configuration['provider'],
77  ]);
78  }
79  }
80 
81  return $pageTitle;
82  }
83 
87  public function ‪getPageTitleCache(): array
88  {
90  }
91 
95  public function ‪setPageTitleCache(array ‪$pageTitleCache): void
96  {
97  $this->pageTitleCache = ‪$pageTitleCache;
98  }
99 
103  private function ‪getPageTitleProviderConfiguration(ServerRequestInterface $request): array
104  {
105  $config = $this->typoScriptService->convertTypoScriptArrayToPlainArray(
106  $request->getAttribute('frontend.typoscript')->getConfigArray()
107  );
108  return $config['pageTitleProviders'] ?? [];
109  }
110 
115  protected function ‪setProviderOrder(array $orderInformation): array
116  {
117  foreach ($orderInformation as $provider => &$configuration) {
118  if (isset($configuration['before'])) {
119  if (is_string($configuration['before'])) {
120  $configuration['before'] = ‪GeneralUtility::trimExplode(',', $configuration['before'], true);
121  } elseif (!is_array($configuration['before'])) {
122  throw new \UnexpectedValueException(
123  'The specified "before" order configuration for provider "' . $provider . '" is invalid.',
124  1535803185
125  );
126  }
127  }
128  if (isset($configuration['after'])) {
129  if (is_string($configuration['after'])) {
130  $configuration['after'] = ‪GeneralUtility::trimExplode(',', $configuration['after'], true);
131  } elseif (!is_array($configuration['after'])) {
132  throw new \UnexpectedValueException(
133  'The specified "after" order configuration for provider "' . $provider . '" is invalid.',
134  1535803186
135  );
136  }
137  }
138  }
139  return $orderInformation;
140  }
141 }
‪TYPO3\CMS\Core\PageTitle\PageTitleProviderManager\setProviderOrder
‪string[] setProviderOrder(array $orderInformation)
Definition: PageTitleProviderManager.php:115
‪TYPO3\CMS\Core\PageTitle\PageTitleProviderManager\getPageTitleProviderConfiguration
‪getPageTitleProviderConfiguration(ServerRequestInterface $request)
Definition: PageTitleProviderManager.php:103
‪TYPO3\CMS\Core\PageTitle
Definition: AbstractPageTitleProvider.php:18
‪TYPO3\CMS\Core\PageTitle\PageTitleProviderManager\setPageTitleCache
‪setPageTitleCache(array $pageTitleCache)
Definition: PageTitleProviderManager.php:95
‪TYPO3\CMS\Core\PageTitle\PageTitleProviderManager\getTitle
‪getTitle(ServerRequestInterface $request)
Definition: PageTitleProviderManager.php:44
‪TYPO3\CMS\Core\PageTitle\PageTitleProviderManager
Definition: PageTitleProviderManager.php:33
‪TYPO3\CMS\Core\Service\DependencyOrderingService
Definition: DependencyOrderingService.php:32
‪TYPO3\CMS\Core\TypoScript\TypoScriptService
Definition: TypoScriptService.php:27
‪TYPO3\CMS\Core\SingletonInterface
Definition: SingletonInterface.php:22
‪TYPO3\CMS\Core\PageTitle\PageTitleProviderManager\$pageTitleCache
‪array $pageTitleCache
Definition: PageTitleProviderManager.php:36
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Core\PageTitle\PageTitleProviderManager\__construct
‪__construct(private readonly ContainerInterface $container, private readonly DependencyOrderingService $dependencyOrderingService, private readonly TypoScriptService $typoScriptService,)
Definition: PageTitleProviderManager.php:38
‪TYPO3\CMS\Core\PageTitle\PageTitleProviderManager\getPageTitleCache
‪getPageTitleCache()
Definition: PageTitleProviderManager.php:87
‪TYPO3\CMS\Core\Utility\GeneralUtility\trimExplode
‪static list< string > trimExplode(string $delim, string $string, bool $removeEmptyValues=false, int $limit=0)
Definition: GeneralUtility.php:822