TYPO3v9:实现 PageTitleProvider 的 "right" 方法是什么?
TYPO3v9: What is the "right" way for implementing a PageTitleProvider?
使用 TYPO3v9,我为扩展记录创建了我的第一个 PageTitleProvider。我查看了TYPO3v9自带的三个PageTitleProvider,但是他们使用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;
}
}
我对这个解决方案不是很满意,因为我必须进行额外的数据库查找。记录数据将被查找两次:第一次在控制器的显示操作中,第二次现在在页面标题提供程序中。
在没有数据库连接的情况下,我可以改进什么?是否有更好的解决方案?
大部分时间是使用 ViewHelper 完成的。您可以签入 news
扩展,ViewHelper 称为 TitleTagViewHelper
.
无需额外查询即可轻松完成此操作。只需使用 set 方法创建一个 PageTitleProvider 即可。在您的控制器中创建此 PageTitleProvider 的实例并通过 setter 设置标题。
例如:
<?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);
只做了一个简单的测试,但这似乎有效。
使用 TYPO3v9,我为扩展记录创建了我的第一个 PageTitleProvider。我查看了TYPO3v9自带的三个PageTitleProvider,但是他们使用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;
}
}
我对这个解决方案不是很满意,因为我必须进行额外的数据库查找。记录数据将被查找两次:第一次在控制器的显示操作中,第二次现在在页面标题提供程序中。
在没有数据库连接的情况下,我可以改进什么?是否有更好的解决方案?
大部分时间是使用 ViewHelper 完成的。您可以签入 news
扩展,ViewHelper 称为 TitleTagViewHelper
.
无需额外查询即可轻松完成此操作。只需使用 set 方法创建一个 PageTitleProvider 即可。在您的控制器中创建此 PageTitleProvider 的实例并通过 setter 设置标题。
例如:
<?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);
只做了一个简单的测试,但这似乎有效。