TYPO3v9: Каков «правильный» способ реализации PageTitleProvider? - PullRequest
0 голосов
/ 09 октября 2018

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

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

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

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

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

0 голосов
/ 09 октября 2018

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

...