С TYPO3v9 я создал свой первый PageTitleProvider для записи расширения.Я посмотрел на три PageTitleProvider, поставляемых с TYPO3v9, но они используют информацию TSFE для вывода заголовка страницы, они не ищут записи базы данных.
Если отображается подробный вид записи, заголовок страницы долженбыть установленным.Мое в настоящее время работающее решение:
<?php
declare(strict_types=1);
namespace Acme\Person\PageTitle;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\PageTitle\AbstractPageTitleProvider;
use TYPO3\CMS\Core\Utility\GeneralUtility;
class PersonPageTitleProvider extends AbstractPageTitleProvider
{
public function __construct()
{
$queryParameters = $GLOBALS['TYPO3_REQUEST']->getQueryParams();
if (!isset($queryParameters['tx_person_pi1'])) {
return;
}
$action = $queryParameters['tx_person_pi1']['action'] ?? null;
$controller = $queryParameters['tx_person_pi1']['controller'] ?? null;
$personId = (int)$queryParameters['tx_person_pi1']['person'] ?? 0;
if (!($action && $controller && $personId)) {
return;
}
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_person_domain_model_person');
$row = $queryBuilder
->select('title', 'given_name', 'last_name', 'position', 'company')
->from('tx_person_domain_model_person')
->where($queryBuilder->expr()->eq('uid', $personId))
->execute()
->fetchAll();
if (count($row) === 0) {
return;
}
$person = $row[0];
$title = trim($person['title'] . ' ' . $person['given_name'] . ' ' . $person['last_name']);
if ($person['position']) {
$title .= ', ' . $person['position'];
}
if ($person['company']) {
$title .= ', ' . $person['company'];
}
$this->title = $title;
}
}
Я не очень доволен этим решением, потому что мне нужно выполнить дополнительный поиск в базе данных.Данные записи будут просматриваться два раза: первый раз в действии show контроллера и второй раз теперь в провайдере заголовка страницы.
Что можно улучшить, и есть ли лучшее решение для этогобез подключения к базе данных?