typo3 - TYPO3v9:实现 PageTitleProvider 的“正确”方式是什么?
问题描述
使用 TYPO3v9,我为扩展记录创建了我的第一个 PageTitleProvider。我查看了 TYPO3v9 提供的三个 PageTitleProviders,但它们使用 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;
}
}
我对这个解决方案并不满意,因为我必须进行额外的数据库查找。记录数据将被查找两次:第一次在控制器的显示操作中,第二次现在在页面标题提供程序中。
在没有数据库连接的情况下,我可以改进什么,是否有更好的解决方案来做到这一点?
解决方案
无需额外查询即可更轻松地完成此操作。只需使用 set 方法创建一个 PageTitleProvider。在您的控制器中创建此 PageTitleProvider 的实例并通过设置器设置标题。
例如:
<?php
namespace Haassie\DemoExtension\TitleTagProvider;
use TYPO3\CMS\Core\PageTitle\AbstractPageTitleProvider;
class DemoPageTitleProvider extends AbstractPageTitleProvider
{
/**
* @param string $title
*/
public function setTitle(string $title)
{
$this->title = $title;
}
}
在你的控制器中:
$titleProvider = GeneralUtility::makeInstance(DemoPageTitleProvider::class);
$titleProvider->setTitle($yourOwnTitle);
只做了一个简单的测试,但这似乎有效。