diff --git a/Classes/Frontend/MetaInformation/DateMetaInformationService.php b/Classes/Frontend/MetaInformation/DateMetaInformationService.php
index 613c046..c13fb57 100644
--- a/Classes/Frontend/MetaInformation/DateMetaInformationService.php
+++ b/Classes/Frontend/MetaInformation/DateMetaInformationService.php
@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace WerkraumMedia\Events\Frontend\MetaInformation;
+use TYPO3\CMS\Core\MetaTag\GenericMetaTagManager;
use TYPO3\CMS\Core\MetaTag\MetaTagManagerRegistry;
use WerkraumMedia\Events\Domain\Model\Date;
use WerkraumMedia\Events\Frontend\PageTitleProvider\DateTitleProviderInterface;
@@ -36,41 +37,53 @@ final class DateMetaInformationService implements DateMetaInformationInterface
{
public function __construct(
private readonly MetaTagManagerRegistry $metaTagManagerRegistry,
+ private readonly EventMetaInformationService $eventService,
private readonly DateTitleProviderInterface $titleProvider
) {
}
public function setDate(Date $date): void
{
- $this->setDescription($date);
- $this->setKeywords($date);
+ $event = $date->getEvent();
+ if ($event === null) {
+ return;
+ }
+ // A date mostly sets info based on event, re use existing features.
+ $this->eventService->setEvent($event);
+
+ // Now set date specifics.
$this->titleProvider->setDate($date);
+
+ $this->updateTitles();
}
- private function setDescription(Date $date): void
+ private function updateTitles(): void
{
- $description = $date->getEvent()?->getTeaser() ?? '';
- if ($description === '') {
+ $title = $this->titleProvider->getTitle();
+ if ($title === '') {
return;
}
- $this->metaTagManagerRegistry
- ->getManagerForProperty('description')
- ->addProperty('description', $description)
- ;
+ $this->updateOpenGraphTitle($title);
+ $this->updateTwitterTitle($title);
}
- private function setKeywords(Date $date): void
+ private function updateOpenGraphTitle(string $title): void
{
- $keywords = $date->getEvent()?->getKeywords() ?? '';
- if ($keywords === '') {
+ $manager = $this->metaTagManagerRegistry->getManagerForProperty('og:title');
+ if ($manager instanceof GenericMetaTagManager) {
return;
}
- $this->metaTagManagerRegistry
- ->getManagerForProperty('keywords')
- ->addProperty('keywords', $keywords)
- ;
+ $manager->removeProperty('og:title');
+ $manager->addProperty('og:title', $title);
+ }
+
+ private function updateTwitterTitle(string $title): void
+ {
+ $manager = $this->metaTagManagerRegistry->getManagerForProperty('twitter:title');
+ $manager->removeProperty('twitter:title');
+ $manager->addProperty('twitter:title', $title);
}
}
diff --git a/Classes/Frontend/MetaInformation/EventMetaInformationService.php b/Classes/Frontend/MetaInformation/EventMetaInformationService.php
index b908e40..96279ee 100644
--- a/Classes/Frontend/MetaInformation/EventMetaInformationService.php
+++ b/Classes/Frontend/MetaInformation/EventMetaInformationService.php
@@ -23,7 +23,9 @@ declare(strict_types=1);
namespace WerkraumMedia\Events\Frontend\MetaInformation;
+use TYPO3\CMS\Core\MetaTag\GenericMetaTagManager;
use TYPO3\CMS\Core\MetaTag\MetaTagManagerRegistry;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
use WerkraumMedia\Events\Domain\Model\Event;
use WerkraumMedia\Events\Frontend\PageTitleProvider\EventTitleProviderInterface;
@@ -42,10 +44,12 @@ final class EventMetaInformationService implements EventMetaInformationInterface
public function setEvent(Event $event): void
{
+ $this->titleProvider->setEvent($event);
+
$this->setDescription($event);
$this->setKeywords($event);
-
- $this->titleProvider->setEvent($event);
+ $this->setOpenGraphTags($event);
+ $this->setSocialMediaTags($event);
}
private function setDescription(Event $event): void
@@ -73,4 +77,51 @@ final class EventMetaInformationService implements EventMetaInformationInterface
->addProperty('keywords', $keywords)
;
}
+
+ private function setOpenGraphTags(Event $event): void
+ {
+ $tags = array_filter([
+ 'title' => $this->titleProvider->getTitle(),
+ 'type' => 'website',
+ 'image' => $this->getImageUrl($event),
+ ]);
+
+ foreach ($tags as $property => $value) {
+ $property = 'og:' . $property;
+ $manager = $this->metaTagManagerRegistry->getManagerForProperty($property);
+ if ($manager instanceof GenericMetaTagManager) {
+ continue;
+ }
+ $manager->addProperty($property, $value);
+ }
+ }
+
+ private function setSocialMediaTags(Event $event): void
+ {
+ $title = $this->titleProvider->getTitle();
+
+ $tags = array_filter([
+ 'twitter:card' => 'summary',
+ 'twitter:title' => $title,
+ 'twitter:description' => $event->getTeaser(),
+ 'twitter:image' => $this->getImageUrl($event),
+ ]);
+
+ foreach ($tags as $property => $value) {
+ $this->metaTagManagerRegistry
+ ->getManagerForProperty($property)
+ ->addProperty($property, $value)
+ ;
+ }
+ }
+
+ private function getImageUrl(Event $event): string
+ {
+ $imageUrl = $event->getImages()[0]?->getOriginalResource()->getPublicUrl() ?? '';
+ if ($imageUrl) {
+ $imageUrl = GeneralUtility::locationHeaderUrl($imageUrl);
+ }
+
+ return $imageUrl;
+ }
}
diff --git a/Documentation/Changelog/4.0.0.rst b/Documentation/Changelog/4.0.0.rst
index f1f3159..5f94611 100644
--- a/Documentation/Changelog/4.0.0.rst
+++ b/Documentation/Changelog/4.0.0.rst
@@ -36,6 +36,11 @@ Features
* Add page title provider.
That way it is possible to alter the TYPO3 page title when showing a date or event.
+* Add Social Media Tags by default.
+ https://ogp.me/ is used by some platforms, especially social media, to generate previews of shared links.
+ The extension now delivers default open-graph tags for better user experience.
+ Twitter uses its own way which is also supported.
+
Fixes
-----
diff --git a/Documentation/Features/MetaTags.rst b/Documentation/Features/MetaTags.rst
index 4284d2f..88687e3 100644
--- a/Documentation/Features/MetaTags.rst
+++ b/Documentation/Features/MetaTags.rst
@@ -1,10 +1,14 @@
.. index:: single: meta tags
+.. index:: single: open graph
.. _metaTags:
+.. _openGraph:
+.. _twitter:
Meta Tags
=========
The extension comes with default implementations for meta tags.
+This includes open graph and Twitter (X) tags.
The default implementation can be exchanged by leveraging TYPO3 Dependency Injection.
@@ -13,3 +17,7 @@ Further resources:
* https://docs.typo3.org/m/typo3/reference-coreapi/12.4/en-us/ApiOverview/Seo/MetaTagApi.html
* https://docs.typo3.org/m/typo3/reference-coreapi/12.4/en-us/ApiOverview/DependencyInjection/Index.html
+
+* https://ogp.me/
+
+* https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/summary
diff --git a/Tests/Functional/Frontend/CacheTest.php b/Tests/Functional/Frontend/CacheTest.php
index f70e0b1..a2d7b32 100644
--- a/Tests/Functional/Frontend/CacheTest.php
+++ b/Tests/Functional/Frontend/CacheTest.php
@@ -326,7 +326,7 @@ class CacheTest extends AbstractFunctionalTestCase
private function getRequestWithSleep(array $typoScript = []): InternalRequest
{
- $request = new InternalRequest();
+ $request = new InternalRequest('https://example.com/');
$request = $request->withPageId(1);
$request = $request->withInstructions([
$this->getTypoScriptInstruction()
diff --git a/Tests/Functional/Frontend/DatesTest.php b/Tests/Functional/Frontend/DatesTest.php
index da53c3e..17b25dd 100644
--- a/Tests/Functional/Frontend/DatesTest.php
+++ b/Tests/Functional/Frontend/DatesTest.php
@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace WerkraumMedia\Events\Tests\Functional\Frontend;
use PHPUnit\Framework\Attributes\Test;
+use Psr\Http\Message\ResponseInterface;
use TYPO3\TestingFramework\Core\Functional\Framework\Frontend\InternalRequest;
use WerkraumMedia\Events\Frontend\Dates;
use WerkraumMedia\Events\Tests\Functional\AbstractFunctionalTestCase;
@@ -32,6 +33,10 @@ class DatesTest extends AbstractFunctionalTestCase
{
protected function setUp(): void
{
+ $this->coreExtensionsToLoad = [
+ 'seo',
+ ];
+
parent::setUp();
$this->importPHPDataSet(__DIR__ . '/Fixtures/Database/SiteStructure.php');
@@ -50,7 +55,7 @@ class DatesTest extends AbstractFunctionalTestCase
{
$this->importPHPDataSet(__DIR__ . '/DatesTestFixtures/ReturnsOnlyDatesWithAvailableEventByDemand.php');
- $request = new InternalRequest();
+ $request = new InternalRequest('https://example.com/');
$request = $request->withPageId(1);
$response = $this->executeFrontendSubRequest($request);
@@ -66,7 +71,7 @@ class DatesTest extends AbstractFunctionalTestCase
{
$this->importPHPDataSet(__DIR__ . '/DatesTestFixtures/ReturnsDateWithinTimeSpan.php');
- $request = new InternalRequest();
+ $request = new InternalRequest('https://example.com/');
$request = $request->withPageId(1);
$request = $request->withQueryParameters([
'events_search[search][start]' => '2023-02-16',
@@ -92,7 +97,7 @@ class DatesTest extends AbstractFunctionalTestCase
{
$this->importPHPDataSet(__DIR__ . '/DatesTestFixtures/ReturnsDateWithinTimeSpan.php');
- $request = new InternalRequest();
+ $request = new InternalRequest('https://example.com/');
$request = $request->withPageId(1);
$request = $request->withQueryParameters([
'events_search[search][end]' => '2023-02-17',
@@ -123,7 +128,7 @@ class DatesTest extends AbstractFunctionalTestCase
{
$this->importPHPDataSet(__DIR__ . '/DatesTestFixtures/ReturnsDateWithinTimeSpan.php');
- $request = new InternalRequest();
+ $request = new InternalRequest('https://example.com/');
$request = $request->withPageId(1);
$request = $request->withQueryParameters([
'events_search[search][start]' => '2023-02-16',
@@ -150,12 +155,7 @@ class DatesTest extends AbstractFunctionalTestCase
{
$this->importPHPDataSet(__DIR__ . '/DatesTestFixtures/Returns404IfEventIsHidden.php');
- $request = new InternalRequest();
- $request = $request->withPageId(1);
- $request = $request->withQueryParameters([
- 'tx_events_dateshow[date]' => '1',
- ]);
- $response = $this->executeFrontendSubRequest($request);
+ $response = $this->issueDetailRequest();
self::assertSame(404, $response->getStatusCode());
}
@@ -165,7 +165,7 @@ class DatesTest extends AbstractFunctionalTestCase
{
$this->importPHPDataSet(__DIR__ . '/DatesTestFixtures/ReturnsUpcomingDates.php');
- $request = new InternalRequest();
+ $request = new InternalRequest('https://example.com/');
$request = $request->withPageId(1);
$request = $request->withInstructions([
$this->getTypoScriptInstruction()
@@ -193,10 +193,7 @@ class DatesTest extends AbstractFunctionalTestCase
{
$this->importPHPDataSet(__DIR__ . '/DatesTestFixtures/DateMetaTags.php');
- $request = new InternalRequest();
- $request = $request->withPageId(1);
- $request = $request->withQueryParameter('tx_events_dateshow[date]', '1');
- $response = $this->executeFrontendSubRequest($request);
+ $response = $this->issueDetailRequest();
self::assertSame(200, $response->getStatusCode());
$html = (string)$response->getBody();
@@ -205,19 +202,54 @@ class DatesTest extends AbstractFunctionalTestCase
self::assertStringContainsString('', $html);
}
+ #[Test]
+ public function addsOpenGraphTags(): void
+ {
+ $this->importPHPDataSet(__DIR__ . '/DatesTestFixtures/DateOpenGraphTags.php');
+
+ $response = $this->issueDetailRequest();
+ self::assertSame(200, $response->getStatusCode());
+ $html = (string)$response->getBody();
+
+ self::assertStringContainsString('', $html);
+ self::assertStringContainsString('', $html);
+ self::assertStringContainsString('', $html);
+ }
+
+ #[Test]
+ public function addsSocialMediaTags(): void
+ {
+ $this->importPHPDataSet(__DIR__ . '/DatesTestFixtures/DateSocialMediaTags.php');
+
+ $response = $this->issueDetailRequest();
+ self::assertSame(200, $response->getStatusCode());
+ $html = (string)$response->getBody();
+
+ self::assertStringContainsString('', $html);
+ self::assertStringContainsString('', $html);
+ 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->executeFrontendSubRequest($request);
+ $response = $this->issueDetailRequest();
self::assertSame(200, $response->getStatusCode());
$html = (string)$response->getBody();
self::assertStringContainsString('
Title of Event 15.02.2023 00:00', $html);
}
+
+ private function issueDetailRequest(): ResponseInterface
+ {
+ $request = new InternalRequest('https://example.com/');
+ $request = $request->withPageId(1);
+ $request = $request->withQueryParameter('tx_events_dateshow[date]', '1');
+
+ return $this->executeFrontendSubRequest($request);
+ }
}
diff --git a/Tests/Functional/Frontend/DatesTestFixtures/DateOpenGraphTags.php b/Tests/Functional/Frontend/DatesTestFixtures/DateOpenGraphTags.php
new file mode 100644
index 0000000..845d7e1
--- /dev/null
+++ b/Tests/Functional/Frontend/DatesTestFixtures/DateOpenGraphTags.php
@@ -0,0 +1,109 @@
+ [
+ 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',
+ 'images' => '1',
+ ],
+ ],
+ 'tx_events_domain_model_date' => [
+ 0 => [
+ 'uid' => '1',
+ 'pid' => '2',
+ 'event' => '1',
+ 'start' => '1676419200',
+ 'end' => '1676484000',
+ ],
+ ],
+ 'sys_file_storage' => [
+ [
+ 'uid' => '1',
+ 'pid' => '0',
+ 'tstamp' => '1423209858',
+ 'crdate' => '1370878372',
+ 'deleted' => '0',
+ 'name' => 'fileadmin/ (auto-created)',
+ 'description' => 'This is the local fileadmin/ directory. This storage mount has been created automatically by TYPO3.',
+ 'driver' => 'Local',
+ 'configuration' => '
+
+
+
+
+
+ fileadmin/
+
+
+ relative
+
+
+ 1
+
+
+
+
+
+ ',
+ 'is_browsable' => '1',
+ 'is_public' => '1',
+ 'is_writable' => '1',
+ 'is_online' => '1',
+ 'processingfolder' => '_processed_',
+ 'is_default' => '1',
+ 'auto_extract_metadata' => '1',
+ ],
+ ],
+ 'sys_file' => [
+ 0 => [
+ 'uid' => '1',
+ 'pid' => '0',
+ 'tstamp' => '1371467047',
+ 'type' => '2',
+ 'storage' => '1',
+ 'identifier' => '/user_uploads/example-for-event.gif',
+ 'extension' => 'gif',
+ 'mime_type' => 'image/gif',
+ 'name' => 'ext_icon.gif',
+ 'sha1' => '359ae0fb420fe8afe1a8b8bc5e46d75090a826b9',
+ 'size' => '637',
+ 'creation_date' => '1370877201',
+ 'modification_date' => '1369407629',
+ 'last_indexed' => '0',
+ 'missing' => '0',
+ 'metadata' => '0',
+ 'identifier_hash' => '475768e491580fb8b74ed36c2b1aaf619ca5e11d',
+ 'folder_hash' => 'b4ab666a114d9905a50606d1837b74d952dfd90f',
+ ],
+ ],
+ 'sys_file_reference' => [
+ [
+ 'uid' => '1',
+ 'pid' => '2',
+ 'tstamp' => '1373537480',
+ 'crdate' => '1371484347',
+ 'deleted' => '0',
+ 'hidden' => '0',
+ 'sys_language_uid' => '0',
+ 'uid_local' => '1',
+ 'uid_foreign' => '1',
+ 'tablenames' => 'tx_events_domain_model_event',
+ 'fieldname' => 'images',
+ 'sorting_foreign' => '1',
+ ],
+ ],
+];
diff --git a/Tests/Functional/Frontend/DatesTestFixtures/DateSocialMediaTags.php b/Tests/Functional/Frontend/DatesTestFixtures/DateSocialMediaTags.php
new file mode 100644
index 0000000..f98a775
--- /dev/null
+++ b/Tests/Functional/Frontend/DatesTestFixtures/DateSocialMediaTags.php
@@ -0,0 +1,110 @@
+ [
+ 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',
+ 'teaser' => 'Teaser of Event',
+ 'images' => '1',
+ ],
+ ],
+ 'tx_events_domain_model_date' => [
+ 0 => [
+ 'uid' => '1',
+ 'pid' => '2',
+ 'event' => '1',
+ 'start' => '1676419200',
+ 'end' => '1676484000',
+ ],
+ ],
+ 'sys_file_storage' => [
+ [
+ 'uid' => '1',
+ 'pid' => '0',
+ 'tstamp' => '1423209858',
+ 'crdate' => '1370878372',
+ 'deleted' => '0',
+ 'name' => 'fileadmin/ (auto-created)',
+ 'description' => 'This is the local fileadmin/ directory. This storage mount has been created automatically by TYPO3.',
+ 'driver' => 'Local',
+ 'configuration' => '
+
+
+
+
+
+ fileadmin/
+
+
+ relative
+
+
+ 1
+
+
+
+
+
+ ',
+ 'is_browsable' => '1',
+ 'is_public' => '1',
+ 'is_writable' => '1',
+ 'is_online' => '1',
+ 'processingfolder' => '_processed_',
+ 'is_default' => '1',
+ 'auto_extract_metadata' => '1',
+ ],
+ ],
+ 'sys_file' => [
+ 0 => [
+ 'uid' => '1',
+ 'pid' => '0',
+ 'tstamp' => '1371467047',
+ 'type' => '2',
+ 'storage' => '1',
+ 'identifier' => '/user_uploads/example-for-event.gif',
+ 'extension' => 'gif',
+ 'mime_type' => 'image/gif',
+ 'name' => 'ext_icon.gif',
+ 'sha1' => '359ae0fb420fe8afe1a8b8bc5e46d75090a826b9',
+ 'size' => '637',
+ 'creation_date' => '1370877201',
+ 'modification_date' => '1369407629',
+ 'last_indexed' => '0',
+ 'missing' => '0',
+ 'metadata' => '0',
+ 'identifier_hash' => '475768e491580fb8b74ed36c2b1aaf619ca5e11d',
+ 'folder_hash' => 'b4ab666a114d9905a50606d1837b74d952dfd90f',
+ ],
+ ],
+ 'sys_file_reference' => [
+ [
+ 'uid' => '1',
+ 'pid' => '2',
+ 'tstamp' => '1373537480',
+ 'crdate' => '1371484347',
+ 'deleted' => '0',
+ 'hidden' => '0',
+ 'sys_language_uid' => '0',
+ 'uid_local' => '1',
+ 'uid_foreign' => '1',
+ 'tablenames' => 'tx_events_domain_model_event',
+ 'fieldname' => 'images',
+ 'sorting_foreign' => '1',
+ ],
+ ],
+];
diff --git a/Tests/Functional/Frontend/EventsTest.php b/Tests/Functional/Frontend/EventsTest.php
index cd3ae8f..5f0567d 100644
--- a/Tests/Functional/Frontend/EventsTest.php
+++ b/Tests/Functional/Frontend/EventsTest.php
@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace WerkraumMedia\Events\Tests\Functional\Frontend;
use PHPUnit\Framework\Attributes\Test;
+use Psr\Http\Message\ResponseInterface;
use TYPO3\TestingFramework\Core\Functional\Framework\Frontend\InternalRequest;
use WerkraumMedia\Events\Tests\Functional\AbstractFunctionalTestCase;
@@ -34,6 +35,9 @@ class EventsTest extends AbstractFunctionalTestCase
$this->testExtensionsToLoad = [
'typo3conf/ext/events/Tests/Functional/Frontend/Fixtures/Extensions/example',
];
+ $this->coreExtensionsToLoad = [
+ 'seo',
+ ];
parent::setUp();
@@ -46,11 +50,7 @@ class EventsTest extends AbstractFunctionalTestCase
{
$this->importPHPDataSet(__DIR__ . '/EventsTestFixtures/EventMetaTags.php');
- $request = new InternalRequest();
- $request = $request->withPageId(1);
- $request = $request->withQueryParameter('tx_events_eventshow[event]', '1');
- $response = $this->executeFrontendSubRequest($request);
-
+ $response = $this->issueDetailRequest();
self::assertSame(200, $response->getStatusCode());
$html = (string)$response->getBody();
@@ -58,19 +58,53 @@ class EventsTest extends AbstractFunctionalTestCase
self::assertStringContainsString('', $html);
}
+ #[Test]
+ public function addsOpenGraphTags(): void
+ {
+ $this->importPHPDataSet(__DIR__ . '/EventsTestFixtures/EventOpenGraphTags.php');
+
+ $response = $this->issueDetailRequest();
+ self::assertSame(200, $response->getStatusCode());
+ $html = (string)$response->getBody();
+
+ self::assertStringContainsString('', $html);
+ self::assertStringContainsString('', $html);
+ self::assertStringContainsString('', $html);
+ }
+
+ #[Test]
+ public function addsSocialMediaTags(): void
+ {
+ $this->importPHPDataSet(__DIR__ . '/EventsTestFixtures/EventSocialMediaTags.php');
+
+ $response = $this->issueDetailRequest();
+ self::assertSame(200, $response->getStatusCode());
+ $html = (string)$response->getBody();
+
+ self::assertStringContainsString('', $html);
+ self::assertStringContainsString('', $html);
+ 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->executeFrontendSubRequest($request);
-
+ $response = $this->issueDetailRequest();
self::assertSame(200, $response->getStatusCode());
$html = (string)$response->getBody();
self::assertStringContainsString('Title of Event', $html);
}
+
+ private function issueDetailRequest(): ResponseInterface
+ {
+ $request = new InternalRequest('https://example.com/');
+ $request = $request->withPageId(1);
+ $request = $request->withQueryParameter('tx_events_eventshow[event]', '1');
+
+ return $this->executeFrontendSubRequest($request);
+ }
}
diff --git a/Tests/Functional/Frontend/EventsTestFixtures/EventOpenGraphTags.php b/Tests/Functional/Frontend/EventsTestFixtures/EventOpenGraphTags.php
new file mode 100644
index 0000000..d0a22e2
--- /dev/null
+++ b/Tests/Functional/Frontend/EventsTestFixtures/EventOpenGraphTags.php
@@ -0,0 +1,100 @@
+ [
+ 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',
+ 'images' => '1',
+ ],
+ ],
+ 'sys_file_storage' => [
+ [
+ 'uid' => '1',
+ 'pid' => '0',
+ 'tstamp' => '1423209858',
+ 'crdate' => '1370878372',
+ 'deleted' => '0',
+ 'name' => 'fileadmin/ (auto-created)',
+ 'description' => 'This is the local fileadmin/ directory. This storage mount has been created automatically by TYPO3.',
+ 'driver' => 'Local',
+ 'configuration' => '
+
+
+
+
+
+ fileadmin/
+
+
+ relative
+
+
+ 1
+
+
+
+
+
+ ',
+ 'is_browsable' => '1',
+ 'is_public' => '1',
+ 'is_writable' => '1',
+ 'is_online' => '1',
+ 'processingfolder' => '_processed_',
+ 'is_default' => '1',
+ 'auto_extract_metadata' => '1',
+ ],
+ ],
+ 'sys_file' => [
+ 0 => [
+ 'uid' => '1',
+ 'pid' => '0',
+ 'tstamp' => '1371467047',
+ 'type' => '2',
+ 'storage' => '1',
+ 'identifier' => '/user_uploads/example-for-event.gif',
+ 'extension' => 'gif',
+ 'mime_type' => 'image/gif',
+ 'name' => 'ext_icon.gif',
+ 'sha1' => '359ae0fb420fe8afe1a8b8bc5e46d75090a826b9',
+ 'size' => '637',
+ 'creation_date' => '1370877201',
+ 'modification_date' => '1369407629',
+ 'last_indexed' => '0',
+ 'missing' => '0',
+ 'metadata' => '0',
+ 'identifier_hash' => '475768e491580fb8b74ed36c2b1aaf619ca5e11d',
+ 'folder_hash' => 'b4ab666a114d9905a50606d1837b74d952dfd90f',
+ ],
+ ],
+ 'sys_file_reference' => [
+ [
+ 'uid' => '1',
+ 'pid' => '2',
+ 'tstamp' => '1373537480',
+ 'crdate' => '1371484347',
+ 'deleted' => '0',
+ 'hidden' => '0',
+ 'sys_language_uid' => '0',
+ 'uid_local' => '1',
+ 'uid_foreign' => '1',
+ 'tablenames' => 'tx_events_domain_model_event',
+ 'fieldname' => 'images',
+ 'sorting_foreign' => '1',
+ ],
+ ],
+];
diff --git a/Tests/Functional/Frontend/EventsTestFixtures/EventSocialMediaTags.php b/Tests/Functional/Frontend/EventsTestFixtures/EventSocialMediaTags.php
new file mode 100644
index 0000000..76be838
--- /dev/null
+++ b/Tests/Functional/Frontend/EventsTestFixtures/EventSocialMediaTags.php
@@ -0,0 +1,101 @@
+ [
+ 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',
+ 'teaser' => 'Teaser of Event',
+ 'images' => '1',
+ ],
+ ],
+ 'sys_file_storage' => [
+ [
+ 'uid' => '1',
+ 'pid' => '0',
+ 'tstamp' => '1423209858',
+ 'crdate' => '1370878372',
+ 'deleted' => '0',
+ 'name' => 'fileadmin/ (auto-created)',
+ 'description' => 'This is the local fileadmin/ directory. This storage mount has been created automatically by TYPO3.',
+ 'driver' => 'Local',
+ 'configuration' => '
+
+
+
+
+
+ fileadmin/
+
+
+ relative
+
+
+ 1
+
+
+
+
+
+ ',
+ 'is_browsable' => '1',
+ 'is_public' => '1',
+ 'is_writable' => '1',
+ 'is_online' => '1',
+ 'processingfolder' => '_processed_',
+ 'is_default' => '1',
+ 'auto_extract_metadata' => '1',
+ ],
+ ],
+ 'sys_file' => [
+ 0 => [
+ 'uid' => '1',
+ 'pid' => '0',
+ 'tstamp' => '1371467047',
+ 'type' => '2',
+ 'storage' => '1',
+ 'identifier' => '/user_uploads/example-for-event.gif',
+ 'extension' => 'gif',
+ 'mime_type' => 'image/gif',
+ 'name' => 'ext_icon.gif',
+ 'sha1' => '359ae0fb420fe8afe1a8b8bc5e46d75090a826b9',
+ 'size' => '637',
+ 'creation_date' => '1370877201',
+ 'modification_date' => '1369407629',
+ 'last_indexed' => '0',
+ 'missing' => '0',
+ 'metadata' => '0',
+ 'identifier_hash' => '475768e491580fb8b74ed36c2b1aaf619ca5e11d',
+ 'folder_hash' => 'b4ab666a114d9905a50606d1837b74d952dfd90f',
+ ],
+ ],
+ 'sys_file_reference' => [
+ [
+ 'uid' => '1',
+ 'pid' => '2',
+ 'tstamp' => '1373537480',
+ 'crdate' => '1371484347',
+ 'deleted' => '0',
+ 'hidden' => '0',
+ 'sys_language_uid' => '0',
+ 'uid_local' => '1',
+ 'uid_foreign' => '1',
+ 'tablenames' => 'tx_events_domain_model_event',
+ 'fieldname' => 'images',
+ 'sorting_foreign' => '1',
+ ],
+ ],
+];
diff --git a/Tests/Functional/Frontend/FilterTest.php b/Tests/Functional/Frontend/FilterTest.php
index 18649e7..8d9d897 100644
--- a/Tests/Functional/Frontend/FilterTest.php
+++ b/Tests/Functional/Frontend/FilterTest.php
@@ -23,7 +23,7 @@ class FilterTest extends AbstractFunctionalTestCase
{
$this->importPHPDataSet(__DIR__ . '/Fixtures/Database/FilterByASingleLocationViaFlexform.php');
- $request = new InternalRequest();
+ $request = new InternalRequest('https://example.com/');
$request = $request->withPageId(1);
$response = $this->executeFrontendSubRequest($request);
@@ -39,7 +39,7 @@ class FilterTest extends AbstractFunctionalTestCase
{
$this->importPHPDataSet(__DIR__ . '/Fixtures/Database/FilterByTwoLocationsViaFlexform.php');
- $request = new InternalRequest();
+ $request = new InternalRequest('https://example.com/');
$request = $request->withPageId(1);
$response = $this->executeFrontendSubRequest($request);
diff --git a/Tests/Functional/Frontend/Fixtures/Sites/default/config.yaml b/Tests/Functional/Frontend/Fixtures/Sites/default/config.yaml
index 7eecb62..5b610ef 100644
--- a/Tests/Functional/Frontend/Fixtures/Sites/default/config.yaml
+++ b/Tests/Functional/Frontend/Fixtures/Sites/default/config.yaml
@@ -1,4 +1,4 @@
-base: '/'
+base: 'https://example.com/'
languages:
-
title: English
diff --git a/composer.json b/composer.json
index 0b69c7b..ab018da 100644
--- a/composer.json
+++ b/composer.json
@@ -69,6 +69,7 @@
"saschaegerer/phpstan-typo3": "1.9.0",
"typo3/cms-backend": "^12.4",
"typo3/cms-fluid-styled-content": "^12.4",
+ "typo3/cms-seo": "^12.4",
"typo3/testing-framework": "^8.0"
},
"config": {