Moin in die Runde,
ich möchte die Seitentitel in Zukunft nicht mehr vom TypoScript manipulieren lassen, sondern mittels des PageTitleProvider, damit ich bei Extension kein TypoScript mehr benötige.
Eigentlich zeigt https://docs.typo3.org/m/typo3/reference-coreapi/13.4/en-us/ApiOverview/Seo/PageTitleApi.html#page-title-provider-custom-site-config genau die Lösung denke ich, aber ich bekomme es nicht hin.
Wird die Seite gerendert, habe ich folgende Titel bei folgenden Szenarien:
Beispiel-Daten:
- seo_title: "Kontaktdaten über uns"
- title: "Kontakt"
- WebsiteTitle: "WebsiteTitle"
a. Seite mit seo_title:
- Ziel: "Kontaktdaten über uns"
- Aktuell: "Kontaktdaten über uns - WebsiteTitle"
b. Seite ohne seo_title:
- Ziel: "Kontakt - WebsiteTitle"
- Aktuell: "Kontaktdaten über uns - WebsiteTitle - WebsiteTitle"
c. Startseite:
- Ziel: "WebsiteTitle - Kontakt"
- Aktuell: "WebsiteTitle - WebsiteTitle - Kontakt"
Eigentlich bedeutet das ja, dass ich mit dem PageTitleProvider nur den Titel selbst verändern kann. Nicht aber den gesamten Titel bestehend aus WebsiteTitle und Seitennamen.
Habt ihr eine Idee, wie ich den gesamten Titel bestehend aus WebsiteTitle und Seitennamen verändern kann?
=================
Meine bisherige TypoScript-Lösung ist:
# Title - WebsiteTitle
config.pageTitleSeparator = -
config.pageTitleSeparator.noTrimWrap = | | |
config.pageTitleFirst = 1
# Build title with seo_title without WebsiteTitle
temp.metaTitle = COA
temp.metaTitle {
10 = COA
20 = TEXT
20.field = seo_title
}
# If seo_title set remove website title
[traverse(page, "seo_title")]
config.noPageTitle = 2
page.headerData.5 < temp.metaTitle
page.headerData.5.stdWrap.noTrimWrap = |<title>|</title>|
[END]
# If homepage WebsiteTitle first
[traverse(page, "uid") == site("rootPageId")]
config.pageTitleFirst = 0
[END]
Mein Versuch mit dem PageTitleProvider ist:
config {
pageTitleProviders {
mysitepackage {
provider = MyVendor\MySitepackage\PageTitle\WebsiteTitleProvider
before = seo
}
}
}
<?php
declare(strict_types=1);
namespace MyVendor\MySitepackage\PageTitle;
use Psr\Http\Message\ServerRequestInterface;
use Symfony\Component\DependencyInjection\Attribute\Autoconfigure;
use TYPO3\CMS\Core\PageTitle\PageTitleProviderInterface;
use TYPO3\CMS\Core\Site\SiteFinder;
use TYPO3\CMS\Frontend\Page\PageInformation;
#[Autoconfigure(public: true)]
final class WebsiteTitleProvider implements PageTitleProviderInterface
{
/**
* Request
*
* @var ServerRequestInterface
*/
private ServerRequestInterface $request;
/**
* Constructor
*
* @param SiteFinder $siteFinder The site finder
*/
public function __construct(
private SiteFinder $siteFinder,
) {}
/**
* Get the title
*
* @return string
*/
public function getTitle(): string
{
$site = $this->siteFinder->getSiteByPageId($this->getPageInformation()->getId());
if (!empty($this->getPageInformation()->getPageRecord()['seo_title'])) {
return $this->getPageInformation()->getPageRecord()['seo_title'];
}
if ($this->getPageInformation()->getId() === $site->getRootPageId()) {
$titles = [
$site->getAttribute('websiteTitle'),
$this->getPageInformation()->getPageRecord()['title'] ?? '',
];
return implode(' - ', $titles);
}
$titles = [
$this->getPageInformation()->getPageRecord()['title'] ?? '',
$site->getAttribute('websiteTitle'),
];
return implode(' - ', $titles);
}
/**
* Set the request
*
* @param ServerRequestInterface $request The request object
*
* @return void
*/
public function setRequest(ServerRequestInterface $request): void
{
$this->request = $request;
}
/**
* Get the page information
*
* @return PageInformation
*/
private function getPageInformation(): PageInformation
{
$pageInformation = $this->request->getAttribute('frontend.page.information');
if (!$pageInformation instanceof PageInformation) {
throw new \Exception('Current frontend page information not available', 1730098625);
}
return $pageInformation;
}
}
PS. Das "readonly" wie in der Vorlage geht nicht, da sonst indexed_search nicht mehr funktioniert.