首页 > 解决方案 > 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;
    }
}

我对这个解决方案并不满意,因为我必须进行额外的数据库查找。记录数据将被查找两次:第一次在控制器的显示操作中,第二次现在在页面标题提供程序中。

在没有数据库连接的情况下,我可以改进什么,是否有更好的解决方案来做到这一点?

标签: typo3typo3-9.x

解决方案


无需额外查询即可更轻松地完成此操作。只需使用 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);

只做了一个简单的测试,但这似乎有效。


推荐阅读