diff --git a/Classes/Frontend/MetaInformation/DateMetaInformationService.php b/Classes/Frontend/MetaInformation/DateMetaInformationService.php index 3e19415..89aa262 100644 --- a/Classes/Frontend/MetaInformation/DateMetaInformationService.php +++ b/Classes/Frontend/MetaInformation/DateMetaInformationService.php @@ -25,6 +25,7 @@ namespace Wrm\Events\Frontend\MetaInformation; use TYPO3\CMS\Core\MetaTag\MetaTagManagerRegistry; use Wrm\Events\Domain\Model\Date; +use Wrm\Events\Frontend\PageTitleProvider\DateTitleProviderInterface; /** * TYPO3 has many different APIs to set meta information like: Page Title, Meta Tags, OpenGraph Tags, etc. @@ -38,16 +39,25 @@ final class DateMetaInformationService implements DateMetaInformationInterface */ private $metaTagManagerRegistry; + /** + * @var DateTitleProviderInterface + */ + private $titleProvider; + public function __construct( - MetaTagManagerRegistry $metaTagManagerRegistry + MetaTagManagerRegistry $metaTagManagerRegistry, + DateTitleProviderInterface $titleProvider ) { $this->metaTagManagerRegistry = $metaTagManagerRegistry; + $this->titleProvider = $titleProvider; } public function setDate(Date $date): void { $this->setDescription($date); $this->setKeywords($date); + + $this->titleProvider->setDate($date); } private function setDescription(Date $date): void diff --git a/Classes/Frontend/MetaInformation/EventMetaInformationService.php b/Classes/Frontend/MetaInformation/EventMetaInformationService.php index 56e5481..a3d84b8 100644 --- a/Classes/Frontend/MetaInformation/EventMetaInformationService.php +++ b/Classes/Frontend/MetaInformation/EventMetaInformationService.php @@ -25,6 +25,7 @@ namespace Wrm\Events\Frontend\MetaInformation; use TYPO3\CMS\Core\MetaTag\MetaTagManagerRegistry; use Wrm\Events\Domain\Model\Event; +use Wrm\Events\Frontend\PageTitleProvider\EventTitleProviderInterface; /** * TYPO3 has many different APIs to set meta information like: Page Title, Meta Tags, OpenGraph Tags, etc. @@ -38,16 +39,25 @@ final class EventMetaInformationService implements EventMetaInformationInterface */ private $metaTagManagerRegistry; + /** + * @var EventTitleProviderInterface + */ + private $titleProvider; + public function __construct( - MetaTagManagerRegistry $metaTagManagerRegistry + MetaTagManagerRegistry $metaTagManagerRegistry, + EventTitleProviderInterface $titleProvider ) { $this->metaTagManagerRegistry = $metaTagManagerRegistry; + $this->titleProvider = $titleProvider; } public function setEvent(Event $event): void { $this->setDescription($event); $this->setKeywords($event); + + $this->titleProvider->setEvent($event); } private function setDescription(Event $event): void diff --git a/Classes/Frontend/PageTitleProvider/DateTitleProvider.php b/Classes/Frontend/PageTitleProvider/DateTitleProvider.php new file mode 100644 index 0000000..50b544e --- /dev/null +++ b/Classes/Frontend/PageTitleProvider/DateTitleProvider.php @@ -0,0 +1,51 @@ + + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +namespace Wrm\Events\Frontend\PageTitleProvider; + +use Wrm\Events\Domain\Model\Date; + +final class DateTitleProvider implements DateTitleProviderInterface +{ + /** + * @var null|Date + */ + private $date = null; + + public function setDate(Date $date): void + { + $this->date = $date; + } + + public function getTitle(): string + { + if ($this->date === null) { + return ''; + } + + return implode(' ', [ + $this->date->getEvent()->getTitle(), + $this->date->getStart()->format('d.m.Y H:i'), + ]); + } +} diff --git a/Classes/Frontend/PageTitleProvider/DateTitleProviderInterface.php b/Classes/Frontend/PageTitleProvider/DateTitleProviderInterface.php new file mode 100644 index 0000000..f48e7a8 --- /dev/null +++ b/Classes/Frontend/PageTitleProvider/DateTitleProviderInterface.php @@ -0,0 +1,33 @@ + + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +namespace Wrm\Events\Frontend\PageTitleProvider; + +use TYPO3\CMS\Core\PageTitle\PageTitleProviderInterface; +use TYPO3\CMS\Core\SingletonInterface; +use Wrm\Events\Domain\Model\Date; + +interface DateTitleProviderInterface extends PageTitleProviderInterface, SingletonInterface +{ + public function setDate(Date $date): void; +} diff --git a/Classes/Frontend/PageTitleProvider/EventTitleProvider.php b/Classes/Frontend/PageTitleProvider/EventTitleProvider.php new file mode 100644 index 0000000..ed6d86d --- /dev/null +++ b/Classes/Frontend/PageTitleProvider/EventTitleProvider.php @@ -0,0 +1,48 @@ + + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +namespace Wrm\Events\Frontend\PageTitleProvider; + +use Wrm\Events\Domain\Model\Event; + +final class EventTitleProvider implements EventTitleProviderInterface +{ + /** + * @var null|Event + */ + private $event = null; + + public function setEvent(Event $event): void + { + $this->event = $event; + } + + public function getTitle(): string + { + if ($this->event === null) { + return ''; + } + + return $this->event->getTitle(); + } +} diff --git a/Classes/Frontend/PageTitleProvider/EventTitleProviderInterface.php b/Classes/Frontend/PageTitleProvider/EventTitleProviderInterface.php new file mode 100644 index 0000000..c3b5463 --- /dev/null +++ b/Classes/Frontend/PageTitleProvider/EventTitleProviderInterface.php @@ -0,0 +1,33 @@ + + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +namespace Wrm\Events\Frontend\PageTitleProvider; + +use TYPO3\CMS\Core\PageTitle\PageTitleProviderInterface; +use TYPO3\CMS\Core\SingletonInterface; +use Wrm\Events\Domain\Model\Event; + +interface EventTitleProviderInterface extends PageTitleProviderInterface, SingletonInterface +{ + public function setEvent(Event $event): void; +} diff --git a/Documentation/Changelog/3.9.0.rst b/Documentation/Changelog/3.9.0.rst index f4559dd..637af2e 100644 --- a/Documentation/Changelog/3.9.0.rst +++ b/Documentation/Changelog/3.9.0.rst @@ -18,6 +18,8 @@ Backport of 4.0.0 features: * Import keywords for events from destination.one. That way keywords are available for usage in meta tags. +* Add page title provider. That way it is possible to alter the TYPO3 page title when showing a date or event. + Fixes ----- diff --git a/Documentation/Features/PageTitle.rst b/Documentation/Features/PageTitle.rst new file mode 100644 index 0000000..edbc6b3 --- /dev/null +++ b/Documentation/Features/PageTitle.rst @@ -0,0 +1,15 @@ +.. index:: single: page title +.. _pageTitle: + +Page Title +========== + +The extension comes with default implementations for PageTitleProvider. + +The default implementation can be exchanged by leveraging TYPO3 Dependency Injection. + +Further resources: + +* https://docs.typo3.org/m/typo3/reference-coreapi/12.4/en-us/ApiOverview/Seo/PageTitleApi.html + +* https://docs.typo3.org/m/typo3/reference-coreapi/12.4/en-us/ApiOverview/DependencyInjection/Index.html diff --git a/Tests/Functional/Frontend/DatesTest.php b/Tests/Functional/Frontend/DatesTest.php index faa465e..e34ee81 100644 --- a/Tests/Functional/Frontend/DatesTest.php +++ b/Tests/Functional/Frontend/DatesTest.php @@ -200,7 +200,9 @@ class DatesTest extends AbstractFunctionalTestCase self::assertStringContainsString('Event 2', $html); } - #[Test] + /** + * @test + */ public function addsMetaTags(): void { $this->importPHPDataSet(__DIR__ . '/DatesTestFixtures/DateMetaTags.php'); @@ -216,4 +218,22 @@ class DatesTest extends AbstractFunctionalTestCase self::assertStringContainsString('', $html); self::assertStringContainsString('', $html); } + + /** + * @test + */ + public function altersPageTitle(): void + { + $this->importPHPDataSet(__DIR__ . '/DatesTestFixtures/DatePageTitle.php'); + + $request = new InternalRequest(); + $request = $request->withPageId(1); + $request = $request->withQueryParameter('tx_events_dateshow[date]', '1'); + $response = $this->executeFrontendRequest($request); + + self::assertSame(200, $response->getStatusCode()); + $html = (string)$response->getBody(); + + self::assertStringContainsString('Title of Event 15.02.2023 00:00', $html); + } } diff --git a/Tests/Functional/Frontend/DatesTestFixtures/DatePageTitle.php b/Tests/Functional/Frontend/DatesTestFixtures/DatePageTitle.php new file mode 100644 index 0000000..ce6fbfd --- /dev/null +++ b/Tests/Functional/Frontend/DatesTestFixtures/DatePageTitle.php @@ -0,0 +1,32 @@ + [ + 0 => [ + 'uid' => '1', + 'pid' => '1', + 'CType' => 'list', + 'list_type' => 'events_dateshow', + 'header' => 'Singleview', + ], + ], + 'tx_events_domain_model_event' => [ + 0 => [ + 'uid' => '1', + 'pid' => '2', + 'title' => 'Title of Event', + 'hidden' => '0', + ], + ], + 'tx_events_domain_model_date' => [ + 0 => [ + 'uid' => '1', + 'pid' => '2', + 'event' => '1', + 'start' => '1676419200', + 'end' => '1676484000', + ], + ], +]; diff --git a/Tests/Functional/Frontend/EventsTest.php b/Tests/Functional/Frontend/EventsTest.php index b30a820..f01df3f 100644 --- a/Tests/Functional/Frontend/EventsTest.php +++ b/Tests/Functional/Frontend/EventsTest.php @@ -59,4 +59,22 @@ class EventsTest extends AbstractFunctionalTestCase self::assertStringContainsString('', $html); self::assertStringContainsString('', $html); } + + /** + * @test + */ + public function altersPageTitle(): void + { + $this->importPHPDataSet(__DIR__ . '/EventsTestFixtures/EventPageTitle.php'); + + $request = new InternalRequest(); + $request = $request->withPageId(1); + $request = $request->withQueryParameter('tx_events_eventshow[event]', '1'); + $response = $this->executeFrontendRequest($request); + + self::assertSame(200, $response->getStatusCode()); + $html = (string)$response->getBody(); + + self::assertStringContainsString('Title of Event', $html); + } } diff --git a/Tests/Functional/Frontend/EventsTestFixtures/EventPageTitle.php b/Tests/Functional/Frontend/EventsTestFixtures/EventPageTitle.php new file mode 100644 index 0000000..0d3ff66 --- /dev/null +++ b/Tests/Functional/Frontend/EventsTestFixtures/EventPageTitle.php @@ -0,0 +1,23 @@ + [ + 0 => [ + 'uid' => '1', + 'pid' => '1', + 'CType' => 'list', + 'list_type' => 'events_eventshow', + 'header' => 'Singleview', + ], + ], + 'tx_events_domain_model_event' => [ + 0 => [ + 'uid' => '1', + 'pid' => '2', + 'title' => 'Title of Event', + 'hidden' => '0', + ], + ], +]; diff --git a/Tests/Functional/Frontend/Fixtures/TypoScript/Rendering.typoscript b/Tests/Functional/Frontend/Fixtures/TypoScript/Rendering.typoscript index 716ed1d..382c81b 100644 --- a/Tests/Functional/Frontend/Fixtures/TypoScript/Rendering.typoscript +++ b/Tests/Functional/Frontend/Fixtures/TypoScript/Rendering.typoscript @@ -38,3 +38,16 @@ plugin.tx_events { start = 1660158000 } } + +config { + pageTitleProviders { + date { + provider = Wrm\Events\Frontend\PageTitleProvider\DateTitleProvider + before = record + } + event { + provider = Wrm\Events\Frontend\PageTitleProvider\EventTitleProvider + before = record + } + } +}