diff --git a/Classes/Domain/Model/Event.php b/Classes/Domain/Model/Event.php index 7c742cf..f4e1ffa 100644 --- a/Classes/Domain/Model/Event.php +++ b/Classes/Domain/Model/Event.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace WerkraumMedia\Events\Domain\Model; +use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Annotation\ORM\Cascade; use TYPO3\CMS\Extbase\Annotation\ORM\Lazy; use TYPO3\CMS\Extbase\Domain\Model\FileReference; @@ -60,6 +61,8 @@ class Event extends AbstractEntity protected string $pages = ''; + protected array $resolvedPages = []; + /** * @var ObjectStorage<Category> */ @@ -91,16 +94,18 @@ class Event extends AbstractEntity public function __construct() { $this->initStorageObjects(); - } - - public function injectDataProcessingForModels(DataProcessingForModels $dataProcessing): void - { - $this->dataProcessing = $dataProcessing; + $this->initializeDataProcessing(); } public function initializeObject(): void { $this->initStorageObjects(); + $this->initializeDataProcessing(); + } + + private function initializeDataProcessing(): void + { + $this->dataProcessing = GeneralUtility::makeInstance(DataProcessingForModels::class); } protected function initStorageObjects(): void @@ -341,14 +346,13 @@ class Event extends AbstractEntity public function getPages(): array { - static $pages = null; - if (is_array($pages)) { - return $pages; + if ($this->resolvedPages !== []) { + return $this->resolvedPages; } - $pages = $this->dataProcessing->process($this); + $this->resolvedPages = $this->dataProcessing->process($this); - return $pages; + return $this->resolvedPages; } public function addCategory(Category $category): void diff --git a/Documentation/Changelog/5.0.1.rst b/Documentation/Changelog/5.0.1.rst new file mode 100644 index 0000000..09069f5 --- /dev/null +++ b/Documentation/Changelog/5.0.1.rst @@ -0,0 +1,38 @@ +5.0.1 +===== + +Breaking +-------- + +Nothing + +Features +-------- + +Nothing + +Fixes +----- + +* Fix broken data processing within model in newer TYPO3 version. + + TYPO3 changed how models are instantiated and prepared. + We now adopt the code to still initialize the data processing. + Furthermore, the feature is now covered with a test. + +* Fix broken data processing caching within model. + + Each model might have different pages. + The previous caching implementation would share the result between multiple + instances. + This is now solved via an internal property instead of static variable. + +Tasks +----- + +Nothing + +Deprecation +----------- + +Nothing diff --git a/Tests/Unit/Domain/Model/EventTest.php b/Tests/Functional/Domain/Model/EventTest.php similarity index 77% rename from Tests/Unit/Domain/Model/EventTest.php rename to Tests/Functional/Domain/Model/EventTest.php index b2e4125..9753972 100644 --- a/Tests/Unit/Domain/Model/EventTest.php +++ b/Tests/Functional/Domain/Model/EventTest.php @@ -2,27 +2,16 @@ declare(strict_types=1); -namespace WerkraumMedia\Events\Tests\Unit\Domain\Model; +namespace WerkraumMedia\Events\Tests\Functional\Domain\Model; use PHPUnit\Framework\Attributes\Test; -use PHPUnit\Framework\TestCase; use TYPO3\CMS\Extbase\Persistence\ObjectStorage; use WerkraumMedia\Events\Domain\Model\Category; use WerkraumMedia\Events\Domain\Model\Event; +use WerkraumMedia\Events\Tests\Functional\AbstractFunctionalTestCase; -class EventTest extends TestCase +class EventTest extends AbstractFunctionalTestCase { - #[Test] - public function canBeCreated(): void - { - $subject = new Event(); - - self::assertInstanceOf( - Event::class, - $subject - ); - } - #[Test] public function returnsSortedFeatures(): void { diff --git a/Tests/Functional/Frontend/DatesTest.php b/Tests/Functional/Frontend/DatesTest.php index 4f43410..ed920bf 100644 --- a/Tests/Functional/Frontend/DatesTest.php +++ b/Tests/Functional/Frontend/DatesTest.php @@ -244,6 +244,19 @@ final class DatesTest extends AbstractFrontendTestCase self::assertStringContainsString('<title>Title of Event 15.02.2023 00:00</title>', $html); } + #[Test] + public function appliedDataProcessingForPagesAssociatedToEvent(): void + { + $this->importPHPDataSet(__DIR__ . '/DatesTestFixtures/DateWithAssociatedPageViaEvent.php'); + + $response = $this->issueDetailRequest(); + + self::assertSame(200, $response->getStatusCode()); + $html = (string)$response->getBody(); + + self::assertStringContainsString('<li><a href="/referenced">Page 3 Referenced from event</a></li>', $html); + } + private function issueDetailRequest(): ResponseInterface { $request = new InternalRequest('https://example.com/'); diff --git a/Tests/Functional/Frontend/DatesTestFixtures/DateWithAssociatedPageViaEvent.php b/Tests/Functional/Frontend/DatesTestFixtures/DateWithAssociatedPageViaEvent.php new file mode 100644 index 0000000..08b2a20 --- /dev/null +++ b/Tests/Functional/Frontend/DatesTestFixtures/DateWithAssociatedPageViaEvent.php @@ -0,0 +1,40 @@ +<?php + +declare(strict_types=1); + +return [ + 'tt_content' => [ + 0 => [ + 'uid' => '1', + 'pid' => '1', + 'CType' => 'events_dateshowtest', + 'header' => 'Singleview', + ], + ], + 'tx_events_domain_model_event' => [ + 0 => [ + 'uid' => '1', + 'pid' => '2', + 'title' => 'Title of Event with associated page', + 'hidden' => '0', + 'pages' => '3', + ], + ], + 'tx_events_domain_model_date' => [ + 0 => [ + 'uid' => '1', + 'pid' => '2', + 'event' => '1', + 'start' => '1676419200', + 'end' => '1676484000', + ], + ], + 'pages' => [ + [ + 'uid' => 3, + 'pid' => 1, + 'title' => 'Page 3 Referenced from event', + 'slug' => '/referenced', + ], + ], +]; diff --git a/Tests/Functional/Frontend/Fixtures/Extensions/example/Resources/Private/Templates/Date/Show.html b/Tests/Functional/Frontend/Fixtures/Extensions/example/Resources/Private/Templates/Date/Show.html index eb85541..035918d 100644 --- a/Tests/Functional/Frontend/Fixtures/Extensions/example/Resources/Private/Templates/Date/Show.html +++ b/Tests/Functional/Frontend/Fixtures/Extensions/example/Resources/Private/Templates/Date/Show.html @@ -70,4 +70,12 @@ </div> </div> + <f:if condition="{date.event.pages.menu}"> + <ul> + <f:for each="{date.event.pages.menu}" as="page"> + <li><a href="{page.link}">{page.title}</a></li> + </f:for> + </ul> + </f:if> + </html> diff --git a/ext_emconf.php b/ext_emconf.php index 87ecdb4..7f0e82b 100644 --- a/ext_emconf.php +++ b/ext_emconf.php @@ -9,7 +9,7 @@ $EM_CONF['events'] = [ 'author' => 'Dirk Koritnik, Daniel Siepmann', 'author_email' => 'koritnik@werkraum-media.de, coding@daniel-siepmann.de', 'state' => 'stable', - 'version' => '5.0.0', + 'version' => '5.0.1', 'constraints' => [ 'depends' => [ 'typo3' => '',