From 97bcbe2065e848f40ef481773d9af4d566242507 Mon Sep 17 00:00:00 2001 From: Daniel Siepmann Date: Thu, 17 Jun 2021 12:08:09 +0200 Subject: [PATCH] Add original date to dates if available This is not possible via native API. We therefore use the event to fetch and add the relation. Relates: #8857 --- Classes/Domain/Model/Date.php | 12 +++- Classes/Extbase/AddSpecialProperties.php | 75 ++++++++++++++++++++++++ Configuration/Services.yaml | 6 ++ 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 Classes/Extbase/AddSpecialProperties.php diff --git a/Classes/Domain/Model/Date.php b/Classes/Domain/Model/Date.php index 390a0b1..06384b9 100644 --- a/Classes/Domain/Model/Date.php +++ b/Classes/Domain/Model/Date.php @@ -26,10 +26,15 @@ class Date extends AbstractEntity protected $canceled = "no"; /** - * @var Date + * @var null|Date */ protected $postponedDate; + /** + * @var null|Date + */ + protected $originalDate; + /** * @var \Wrm\Events\Domain\Model\Event */ @@ -141,6 +146,11 @@ class Date extends AbstractEntity return null; } + public function getOriginalDate(): ?Date + { + return $this->originalDate; + } + public function getCanceledLink(): string { if ($this->getCanceled() === 'canceled') { diff --git a/Classes/Extbase/AddSpecialProperties.php b/Classes/Extbase/AddSpecialProperties.php new file mode 100644 index 0000000..287495b --- /dev/null +++ b/Classes/Extbase/AddSpecialProperties.php @@ -0,0 +1,75 @@ + + * + * 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. + */ + +use TYPO3\CMS\Core\Database\ConnectionPool; +use TYPO3\CMS\Extbase\Event\Persistence\AfterObjectThawedEvent; +use TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper; +use Wrm\Events\Domain\Model\Date; + +class AddSpecialProperties +{ + /** + * @var ConnectionPool + */ + private $connectionPool; + + /** + * @var DataMapper + */ + private $dataMapper; + + public function __construct( + ConnectionPool $connectionPool, + DataMapper $dataMapper + ) { + $this->connectionPool = $connectionPool; + $this->dataMapper = $dataMapper; + } + + public function __invoke(AfterObjectThawedEvent $event): void + { + if ($event->getObject() instanceof Date) { + /** @var Date $date */ + $date = $event->getObject(); + $date->_setProperty('originalDate', $this->getOriginalDate($date->_getProperty('_localizedUid'))); + } + } + + private function getOriginalDate(int $uidOfReferencedDate): ?Date + { + $qb = $this->connectionPool->getQueryBuilderForTable('tx_events_domain_model_date'); + $qb->select('*'); + $qb->from('tx_events_domain_model_date'); + $qb->where($qb->expr()->eq('postponed_date', $uidOfReferencedDate)); + $qb->setMaxResults(1); + + $result = $qb->execute()->fetch(); + + if ($result === false) { + return null; + } + + $dates = $this->dataMapper->map(Date::class, [$result]); + return $dates[0] ?? null; + } +} diff --git a/Configuration/Services.yaml b/Configuration/Services.yaml index 9f37eb6..5d2e91e 100644 --- a/Configuration/Services.yaml +++ b/Configuration/Services.yaml @@ -21,3 +21,9 @@ services: tags: - name: 'console.command' command: 'events:removePast' + + Wrm\Events\Extbase\AddSpecialProperties: + tags: + - name: event.listener + identifier: 'WrmEventsAddSpecialPropertiesToDate' + event: TYPO3\CMS\Extbase\Event\Persistence\AfterObjectThawedEvent