TYPO3v9: Как правильно реализовать PageTitleProvider?

В 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 и второй раз в поставщике заголовков страниц.

Что я могу улучшить и есть ли лучшее решение для этого без подключения к базе данных?


person Chris    schedule 09.10.2018    source источник


Ответы (2)


Это можно сделать проще без дополнительного запроса. Просто создайте 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);

Сделал только простой тест, но это, кажется, работает.

person Richard Haeser    schedule 09.10.2018
comment
Круто, иногда я думаю слишком сложно ;-) Это работает как шарм ... - person Chris; 09.10.2018

В большинстве случаев это делается с помощью ViewHelper. Вы можете проверить расширение news, ViewHelper называется TitleTagViewHelper.

person StatiX    schedule 09.10.2018
comment
Да, в Новостях используется старая версия $GLOBALS['TSFE']-›altPageTitle. Я использовал его в более старых версиях TYPO3 в контроллере. Теперь в v9 атрибут altPageTitle помечен как внутренний. Я хочу использовать новый вариант. Я не спрашивал, как это решить. Я спросил, правильно ли это в версии 9, чтобы решить эту проблему. - person Chris; 09.10.2018