diff --git a/Classes/Domain/Model/Event.php b/Classes/Domain/Model/Event.php index 02a96bf4..721a80dd 100644 --- a/Classes/Domain/Model/Event.php +++ b/Classes/Domain/Model/Event.php @@ -140,6 +140,16 @@ class Event extends AbstractEntity */ protected $dataProcessing; + /** + * @var string + */ + protected $sourceName = ''; + + /** + * @var string + */ + protected $sourceUrl = ''; + public function __construct() { $this->initStorageObjects(); @@ -469,4 +479,14 @@ public function getLocalizedUid(): int { return $this->_localizedUid; } + + public function setSourceName(string $name): void + { + $this->sourceName = $name; + } + + public function setSourceUrl(string $url): void + { + $this->sourceUrl = $url; + } } diff --git a/Classes/Service/DestinationDataImportService.php b/Classes/Service/DestinationDataImportService.php index 63b7baf9..9bfaac78 100644 --- a/Classes/Service/DestinationDataImportService.php +++ b/Classes/Service/DestinationDataImportService.php @@ -277,6 +277,10 @@ public function processData(array $data): int $this->setAssets($event['media_objects']); } + if ($event['source'] ?? false) { + $this->setSource($event['source']); + } + $this->eventDispatcher->dispatch(new EventImportEvent( $existingEvent, $this->tmpCurrentEvent @@ -488,6 +492,17 @@ private function setAssets(array $assets): void $this->tmpCurrentEvent->setImages($images); } + private function setSource(array $source): void + { + if (isset($source['value'])) { + $this->tmpCurrentEvent->setSourceName($source['value']); + } + + if (isset($source['url'])) { + $this->tmpCurrentEvent->setSourceUrl($source['url']); + } + } + /** * Fetch the boolean value for requested attribute. * diff --git a/Configuration/TCA/tx_events_domain_model_event.php b/Configuration/TCA/tx_events_domain_model_event.php index ba550cca..be59ef01 100644 --- a/Configuration/TCA/tx_events_domain_model_event.php +++ b/Configuration/TCA/tx_events_domain_model_event.php @@ -28,7 +28,7 @@ ], 'types' => [ '1' => [ - 'showitem' => '--palette--;' . $l10nPathFE . ':palette.general;general, + 'showitem' => ' sys_language_uid, l10n_parent, l10n_diffsource, @@ -40,6 +40,7 @@ slug, ticket, global_id, + --palette--;;source, --div--;' . $l10nPath . ':tx_events_domain_model_event.tabs.text, details, price_info, @@ -67,7 +68,12 @@ endtime', ], ], - + 'palettes' => [ + 'source' => [ + 'label' => $l10nPath . ':tx_events_domain_model_event.palette.sourc', + 'showitem' => 'source_name, source_url', + ], + ], 'columns' => [ 'sys_language_uid' => [ 'exclude' => true, @@ -187,6 +193,24 @@ 'eval' => 'trim', ], ], + 'source_name' => [ + 'exclude' => true, + 'label' => $l10nPath . ':tx_events_domain_model_event.source_name', + 'config' => [ + 'type' => 'input', + 'readOnly' => true, + ], + ], + 'source_url' => [ + 'exclude' => true, + 'label' => $l10nPath . ':tx_events_domain_model_event.source_url', + 'config' => [ + 'type' => 'input', + 'renderType' => 'inputLink', + 'softref' => 'typolink', + 'readOnly' => true, + ], + ], 'slug' => [ 'exclude' => true, 'label' => $l10nPath . ':tx_events_domain_model_event.slug', diff --git a/Documentation/Changelog/3.5.0.rst b/Documentation/Changelog/3.5.0.rst index 0244010d..79d48706 100644 --- a/Documentation/Changelog/3.5.0.rst +++ b/Documentation/Changelog/3.5.0.rst @@ -18,6 +18,11 @@ Features * Allow to modify an event object before importing. +* Add source to events. + Destination Data One provides the original source, either them self or an external. + This is now saved in order to make it easier for editors and companies to contact + the original source and ask to fix broken data. + Fixes ----- diff --git a/Resources/Private/Language/de.locallang_csh_event.xlf b/Resources/Private/Language/de.locallang_csh_event.xlf index bbddbbb6..ef1cc270 100644 --- a/Resources/Private/Language/de.locallang_csh_event.xlf +++ b/Resources/Private/Language/de.locallang_csh_event.xlf @@ -35,6 +35,10 @@ Social Media Social Media + + Source + Quelle + Event Veranstaltung @@ -51,6 +55,14 @@ Global UID Globale UID + + Source Name + Name der Quelle + + + Source URL + URL der Quelle + Slug URL-Segment diff --git a/Resources/Private/Language/locallang_csh_event.xlf b/Resources/Private/Language/locallang_csh_event.xlf index 934ca849..cd030ce0 100644 --- a/Resources/Private/Language/locallang_csh_event.xlf +++ b/Resources/Private/Language/locallang_csh_event.xlf @@ -1,6 +1,6 @@ - + e
@@ -30,6 +30,9 @@ Social Media + + Source + Title @@ -39,6 +42,12 @@ Global UID + + Source Name + + + Source URL + Slug diff --git a/Tests/Functional/Import/DestinationDataTest/Assertions/ImportsSource.php b/Tests/Functional/Import/DestinationDataTest/Assertions/ImportsSource.php new file mode 100644 index 00000000..3042079e --- /dev/null +++ b/Tests/Functional/Import/DestinationDataTest/Assertions/ImportsSource.php @@ -0,0 +1,24 @@ + [ + [ + 'uid' => 1, + 'global_id' => 'e_100347853', + 'source_name' => 'destination.one', + 'source_url' => 'http://destination.one/', + ], + [ + 'uid' => 2, + 'global_id' => 'e_100347854', + 'source_name' => 'Foreign Example 1', + 'source_url' => 'https://example.com', + ], + [ + 'uid' => 3, + 'global_id' => 'e_100347855', + 'source_name' => 'Foreign Example 2', + 'source_url' => 'https://example.com/something-else', + ], + ], +]; diff --git a/Tests/Functional/Import/DestinationDataTest/Fixtures/ResponseWithSources.json b/Tests/Functional/Import/DestinationDataTest/Fixtures/ResponseWithSources.json new file mode 100644 index 00000000..72a0c678 --- /dev/null +++ b/Tests/Functional/Import/DestinationDataTest/Fixtures/ResponseWithSources.json @@ -0,0 +1,219 @@ +{ + "status": "OK", + "count": 3, + "overallcount": 50, + "channels": [], + "facetGroups": [], + "items": [ + { + "global_id": "e_100347853", + "id": "100347853", + "title": "Allerlei Weihnachtliches (Heute mit Johannes Geißer)", + "type": "Event", + "categories": [ + ], + "texts": [ + { + "rel": "details", + "type": "text/html", + "value": "Die Lichter sind entzündet, die Plätzchen duften, man rückt endlich wieder näher zusammen und lauscht den Geschichten. Vier Schauspieler*innen unseres Theaters überraschen mit ihren weihnachtlichen Texten, die sie für uns ausgewählt haben. Dazu plaudern sie über persönliche Anekdoten und erinnern sich an ihre schönsten und verrücktesten Weihnachtsfeste. Und da der Genuss in der Vorweihnachtszeit nicht fehlen darf, wird an jedem Adventssonntag eine andere weihnachtliche Spezialität serviert.
Eintritt: 10 € (inkl. Gedeck mit weihnachtlicher Schillerlocke)
Um Voranmeldung unter 03672-486470 oder schillerhaus@rudolstadt.de wird gebeten.
Es gilt die 2G-PLUS-Regel. 
" + }, + { + "rel": "details", + "type": "text/plain", + "value": "Die Lichter sind entzündet, die Plätzchen duften, man rückt endlich wieder näher zusammen und lauscht den Geschichten. Vier Schauspieler*innen unseres Theaters überraschen mit ihren weihnachtlichen Texten, die sie für uns ausgewählt haben. Dazu plaudern sie über persönliche Anekdoten und erinnern sich an ihre schönsten und verrücktesten Weihnachtsfeste. Und da der Genuss in der Vorweihnachtszeit nicht fehlen darf, wird an jedem Adventssonntag eine andere weihnachtliche Spezialität serviert.\nEintritt: 10 € (inkl. Gedeck mit weihnachtlicher Schillerlocke)\nUm Voranmeldung unter 03672-486470 oder schillerhaus@rudolstadt.de wird gebeten.\nEs gilt die 2G-PLUS-Regel." + }, + { + "rel": "teaser", + "type": "text/html" + }, + { + "rel": "teaser", + "type": "text/plain" + } + ], + "country": "Deutschland", + "areas": [ + "Rudolstadt und Umgebung" + ], + "city": "Rudolstadt", + "zip": "07407", + "street": "Schillerstraße 25", + "phone": "+ 49 3672 / 486470", + "fax": "+ 49 3672 / 486475", + "web": "http://www.schillerhaus.rudolstadt.de/", + "email": "schillerhaus@rudolstadt.de", + "author": "support@hubermedia.de", + "media_objects": [ + ], + "keywords": [], + "timeIntervals": [ + { + "weekdays": [], + "start": "2099-12-19T15:00:00+01:00", + "end": "2099-12-19T16:30:00+01:00", + "tz": "Europe/Berlin", + "interval": 1 + } + ], + "name": "Schillerhaus Rudolstadt", + "features": [ + ], + "addresses": [ + ], + "created": "2099-10-31T12:29:00+00:00", + "changed": "2099-12-14T08:29:00+00:00", + "source": { + "url": "http://destination.one/", + "value": "destination.one" + }, + "company": "", + "district": "", + "postoffice": "", + "phone2": "", + "seasons": [], + "subitems": [], + "hyperObjects": [] + }, + { + "global_id": "e_100347854", + "id": "100347854", + "title": "Allerlei Weihnachtliches (Heute mit Johannes Geißer)", + "type": "Event", + "categories": [ + ], + "texts": [ + { + "rel": "details", + "type": "text/html", + "value": "Die Lichter sind entzündet, die Plätzchen duften, man rückt endlich wieder näher zusammen und lauscht den Geschichten. Vier Schauspieler*innen unseres Theaters überraschen mit ihren weihnachtlichen Texten, die sie für uns ausgewählt haben. Dazu plaudern sie über persönliche Anekdoten und erinnern sich an ihre schönsten und verrücktesten Weihnachtsfeste. Und da der Genuss in der Vorweihnachtszeit nicht fehlen darf, wird an jedem Adventssonntag eine andere weihnachtliche Spezialität serviert.
Eintritt: 10 € (inkl. Gedeck mit weihnachtlicher Schillerlocke)
Um Voranmeldung unter 03672-486470 oder schillerhaus@rudolstadt.de wird gebeten.
Es gilt die 2G-PLUS-Regel. 
" + }, + { + "rel": "details", + "type": "text/plain", + "value": "Die Lichter sind entzündet, die Plätzchen duften, man rückt endlich wieder näher zusammen und lauscht den Geschichten. Vier Schauspieler*innen unseres Theaters überraschen mit ihren weihnachtlichen Texten, die sie für uns ausgewählt haben. Dazu plaudern sie über persönliche Anekdoten und erinnern sich an ihre schönsten und verrücktesten Weihnachtsfeste. Und da der Genuss in der Vorweihnachtszeit nicht fehlen darf, wird an jedem Adventssonntag eine andere weihnachtliche Spezialität serviert.\nEintritt: 10 € (inkl. Gedeck mit weihnachtlicher Schillerlocke)\nUm Voranmeldung unter 03672-486470 oder schillerhaus@rudolstadt.de wird gebeten.\nEs gilt die 2G-PLUS-Regel." + }, + { + "rel": "teaser", + "type": "text/html" + }, + { + "rel": "teaser", + "type": "text/plain" + } + ], + "country": "Deutschland", + "areas": [ + "Rudolstadt und Umgebung" + ], + "city": "Rudolstadt", + "zip": "07407", + "street": "Schillerstraße 25", + "phone": "+ 49 3672 / 486470", + "fax": "+ 49 3672 / 486475", + "web": "http://www.schillerhaus.rudolstadt.de/", + "email": "schillerhaus@rudolstadt.de", + "author": "support@hubermedia.de", + "media_objects": [ + ], + "keywords": [], + "timeIntervals": [ + { + "weekdays": [], + "start": "2099-12-19T15:00:00+01:00", + "end": "2099-12-19T16:30:00+01:00", + "tz": "Europe/Berlin", + "interval": 1 + } + ], + "name": "Schillerhaus Rudolstadt", + "features": [ + ], + "addresses": [ + ], + "created": "2099-10-31T12:29:00+00:00", + "changed": "2099-12-14T08:29:00+00:00", + "source": { + "url": "https://example.com", + "value": "Foreign Example 1" + }, + "company": "", + "district": "", + "postoffice": "", + "phone2": "", + "seasons": [], + "subitems": [], + "hyperObjects": [] + }, + { + "global_id": "e_100347855", + "id": "100347855", + "title": "Allerlei Weihnachtliches (Heute mit Johannes Geißer)", + "type": "Event", + "categories": [ + ], + "texts": [ + { + "rel": "details", + "type": "text/html", + "value": "Die Lichter sind entzündet, die Plätzchen duften, man rückt endlich wieder näher zusammen und lauscht den Geschichten. Vier Schauspieler*innen unseres Theaters überraschen mit ihren weihnachtlichen Texten, die sie für uns ausgewählt haben. Dazu plaudern sie über persönliche Anekdoten und erinnern sich an ihre schönsten und verrücktesten Weihnachtsfeste. Und da der Genuss in der Vorweihnachtszeit nicht fehlen darf, wird an jedem Adventssonntag eine andere weihnachtliche Spezialität serviert.
Eintritt: 10 € (inkl. Gedeck mit weihnachtlicher Schillerlocke)
Um Voranmeldung unter 03672-486470 oder schillerhaus@rudolstadt.de wird gebeten.
Es gilt die 2G-PLUS-Regel. 
" + }, + { + "rel": "details", + "type": "text/plain", + "value": "Die Lichter sind entzündet, die Plätzchen duften, man rückt endlich wieder näher zusammen und lauscht den Geschichten. Vier Schauspieler*innen unseres Theaters überraschen mit ihren weihnachtlichen Texten, die sie für uns ausgewählt haben. Dazu plaudern sie über persönliche Anekdoten und erinnern sich an ihre schönsten und verrücktesten Weihnachtsfeste. Und da der Genuss in der Vorweihnachtszeit nicht fehlen darf, wird an jedem Adventssonntag eine andere weihnachtliche Spezialität serviert.\nEintritt: 10 € (inkl. Gedeck mit weihnachtlicher Schillerlocke)\nUm Voranmeldung unter 03672-486470 oder schillerhaus@rudolstadt.de wird gebeten.\nEs gilt die 2G-PLUS-Regel." + }, + { + "rel": "teaser", + "type": "text/html" + }, + { + "rel": "teaser", + "type": "text/plain" + } + ], + "country": "Deutschland", + "areas": [ + "Rudolstadt und Umgebung" + ], + "city": "Rudolstadt", + "zip": "07407", + "street": "Schillerstraße 25", + "phone": "+ 49 3672 / 486470", + "fax": "+ 49 3672 / 486475", + "web": "http://www.schillerhaus.rudolstadt.de/", + "email": "schillerhaus@rudolstadt.de", + "author": "support@hubermedia.de", + "media_objects": [ + ], + "keywords": [], + "timeIntervals": [ + { + "weekdays": [], + "start": "2099-12-19T15:00:00+01:00", + "end": "2099-12-19T16:30:00+01:00", + "tz": "Europe/Berlin", + "interval": 1 + } + ], + "name": "Schillerhaus Rudolstadt", + "features": [ + ], + "addresses": [ + ], + "created": "2099-10-31T12:29:00+00:00", + "changed": "2099-12-14T08:29:00+00:00", + "source": { + "url": "https://example.com/something-else", + "value": "Foreign Example 2" + }, + "company": "", + "district": "", + "postoffice": "", + "phone2": "", + "seasons": [], + "subitems": [], + "hyperObjects": [] + } + ] +} diff --git a/Tests/Functional/Import/DestinationDataTest/ImportsExampleAsExpectedTest.php b/Tests/Functional/Import/DestinationDataTest/ImportsExampleAsExpectedTest.php index 7ec50a4c..5d3f0cd9 100644 --- a/Tests/Functional/Import/DestinationDataTest/ImportsExampleAsExpectedTest.php +++ b/Tests/Functional/Import/DestinationDataTest/ImportsExampleAsExpectedTest.php @@ -10,16 +10,10 @@ */ class ImportsExampleAsExpectedTest extends AbstractTest { - /** - * @test - */ - public function importsExampleAsExpected(): void + protected function setUp(): void { - $this->setDateAspect(new \DateTimeImmutable('2021-07-13', new \DateTimeZone('Europe/Berlin'))); + parent::setUp(); - $this->importPHPDataSet(__DIR__ . '/Fixtures/Database/SingleImportConfigurationWithCategories.php'); - $this->importPHPDataSet(__DIR__ . '/Fixtures/Database/SingleRegion.php'); - $this->importPHPDataSet(__DIR__ . '/Fixtures/Database/SingleCategory.php'); $this->setUpConfiguration([ 'restUrl = https://example.com/some-path/', 'license = example-license', @@ -28,6 +22,18 @@ public function importsExampleAsExpected(): void 'restMode = next_months,12', 'restTemplate = ET2014A.json', ]); + } + + /** + * @test + */ + public function importsExampleAsExpected(): void + { + $this->setDateAspect(new \DateTimeImmutable('2021-07-13', new \DateTimeZone('Europe/Berlin'))); + + $this->importPHPDataSet(__DIR__ . '/Fixtures/Database/SingleImportConfigurationWithCategories.php'); + $this->importPHPDataSet(__DIR__ . '/Fixtures/Database/SingleRegion.php'); + $this->importPHPDataSet(__DIR__ . '/Fixtures/Database/SingleCategory.php'); $requests = &$this->setUpResponses([ new Response(200, [], file_get_contents(__DIR__ . '/Fixtures/Response.json') ?: ''), @@ -72,4 +78,20 @@ public function importsExampleAsExpected(): void $this->assertEmptyLog(); } + + /** + * @test + */ + public function importsSource(): void + { + $this->importPHPDataSet(__DIR__ . '/Fixtures/Database/DefaultImportConfiguration.php'); + $this->setUpResponses([ + new Response(200, [], file_get_contents(__DIR__ . '/Fixtures/ResponseWithSources.json') ?: ''), + ]); + + $this->executeCommand(); + + $this->assertPHPDataSet(__DIR__ . '/Assertions/ImportsSource.php'); + $this->assertEmptyLog(); + } } diff --git a/ext_tables.sql b/ext_tables.sql index ec092407..83b2f46e 100644 --- a/ext_tables.sql +++ b/ext_tables.sql @@ -22,6 +22,8 @@ CREATE TABLE tx_events_domain_model_event ( partner text, region int(11) unsigned DEFAULT '0', references_events text, + source_name varchar(255) DEFAULT '' NOT NULL, + source_url varchar(255) DEFAULT '' NOT NULL, KEY dataHandler (l10n_parent, t3ver_oid, deleted, t3ver_wsid, t3ver_state) );