From 56c1f75b35912e3223c1e20948e1be1127d1f82c Mon Sep 17 00:00:00 2001 From: Daniel Siepmann Date: Wed, 24 Jan 2024 11:54:48 +0100 Subject: [PATCH] Add support for slogan as array (#117) Relates: #10890 --- .../Import/Entity/TouristAttraction.php | 16 +++-- .../Typo3Converter/GeneralConverter.php | 2 +- .../Model/Frontend/TouristAttraction.php | 10 ++- Documentation/Changelog/3.0.0.rst | 4 ++ ...portsTouristAttractionWithSingleSlogan.php | 28 ++++++++ ...mportsTouristAttractionWithSloganArray.php | 28 ++++++++ .../attraction-with-single-slogan.json | 55 ++++++++++++++++ .../attraction-with-slogan-array.json | 65 +++++++++++++++++++ ...portsTouristAttractionWithSingleSlogan.php | 65 +++++++++++++++++++ ...mportsTouristAttractionWithSloganArray.php | 65 +++++++++++++++++++ Tests/Functional/ImportTest.php | 26 ++++++++ .../Model/Frontend/TouristAttractionTest.php | 20 ++++++ 12 files changed, 378 insertions(+), 6 deletions(-) create mode 100644 Tests/Functional/Assertions/Import/ImportsTouristAttractionWithSingleSlogan.php create mode 100644 Tests/Functional/Assertions/Import/ImportsTouristAttractionWithSloganArray.php create mode 100644 Tests/Functional/Fixtures/Import/Guzzle/thuecat.org/resources/attraction-with-single-slogan.json create mode 100644 Tests/Functional/Fixtures/Import/Guzzle/thuecat.org/resources/attraction-with-slogan-array.json create mode 100644 Tests/Functional/Fixtures/Import/ImportsTouristAttractionWithSingleSlogan.php create mode 100644 Tests/Functional/Fixtures/Import/ImportsTouristAttractionWithSloganArray.php diff --git a/Classes/Domain/Import/Entity/TouristAttraction.php b/Classes/Domain/Import/Entity/TouristAttraction.php index 0e6648d..631f3d1 100644 --- a/Classes/Domain/Import/Entity/TouristAttraction.php +++ b/Classes/Domain/Import/Entity/TouristAttraction.php @@ -27,7 +27,10 @@ use WerkraumMedia\ThueCat\Domain\Import\EntityMapper\PropertyValues; class TouristAttraction extends Place implements MapsToType { - protected string $slogan = ''; + /** + * @var string[] + */ + protected array $slogan = []; protected string $startOfConstruction = ''; @@ -62,7 +65,7 @@ class TouristAttraction extends Place implements MapsToType */ protected array $availableLanguages = []; - public function getSlogan(): string + public function getSlogan(): array { return $this->slogan; } @@ -129,10 +132,15 @@ class TouristAttraction extends Place implements MapsToType /** * @internal for mapping via Symfony component. + * + * @param string|array $slogan */ - public function setSlogan(string $slogan): void + public function setSlogan($slogan): void { - $this->slogan = PropertyValues::removePrefixFromEntry($slogan); + if (is_string($slogan)) { + $slogan = [$slogan]; + } + $this->slogan = PropertyValues::removePrefixFromEntries($slogan); } /** diff --git a/Classes/Domain/Import/Typo3Converter/GeneralConverter.php b/Classes/Domain/Import/Typo3Converter/GeneralConverter.php index 4454dc4..b34efd0 100644 --- a/Classes/Domain/Import/Typo3Converter/GeneralConverter.php +++ b/Classes/Domain/Import/Typo3Converter/GeneralConverter.php @@ -197,7 +197,7 @@ class GeneralConverter implements Converter 'payment_accepted' => method_exists($entity, 'getPaymentsAccepted') ? implode(',', $entity->getPaymentsAccepted()) : '', 'distance_to_public_transport' => method_exists($entity, 'getDistanceToPublicTransport') ? $entity->getDistanceToPublicTransport() : '', - 'slogan' => method_exists($entity, 'getSlogan') ? $entity->getSlogan() : '', + 'slogan' => method_exists($entity, 'getSlogan') ? implode(',', $entity->getSlogan()) : '', 'start_of_construction' => method_exists($entity, 'getStartOfConstruction') ? $entity->getStartOfConstruction() : '', 'museum_service' => method_exists($entity, 'getMuseumServices') ? implode(',', $entity->getMuseumServices()) : '', 'architectural_style' => method_exists($entity, 'getArchitecturalStyles') ? implode(',', $entity->getArchitecturalStyles()) : '', diff --git a/Classes/Domain/Model/Frontend/TouristAttraction.php b/Classes/Domain/Model/Frontend/TouristAttraction.php index 7a85f42..21f3153 100644 --- a/Classes/Domain/Model/Frontend/TouristAttraction.php +++ b/Classes/Domain/Model/Frontend/TouristAttraction.php @@ -61,7 +61,15 @@ class TouristAttraction extends Place public function getSlogan(): string { - return $this->slogan; + return explode(',', $this->slogan)[0] ?? ''; + } + + /** + * @return string[] + */ + public function getSlogans(): array + { + return explode(',', $this->slogan); } public function getOffers(): ?Offers diff --git a/Documentation/Changelog/3.0.0.rst b/Documentation/Changelog/3.0.0.rst index 239b533..551e9a3 100644 --- a/Documentation/Changelog/3.0.0.rst +++ b/Documentation/Changelog/3.0.0.rst @@ -15,6 +15,10 @@ Features * Add support for PHP 8.3. +* Add support for multiple slogans (array within slogan). + The existing API will return the first slogan. + A new method `getSlogans` is added which will return the array of slogans. + Fixes ----- diff --git a/Tests/Functional/Assertions/Import/ImportsTouristAttractionWithSingleSlogan.php b/Tests/Functional/Assertions/Import/ImportsTouristAttractionWithSingleSlogan.php new file mode 100644 index 0000000..6541099 --- /dev/null +++ b/Tests/Functional/Assertions/Import/ImportsTouristAttractionWithSingleSlogan.php @@ -0,0 +1,28 @@ + [ + 0 => [ + 'uid' => '1', + 'pid' => '10', + 'sys_language_uid' => '0', + 'l18n_parent' => '0', + 'l10n_source' => '0', + 'remote_id' => 'https://thuecat.org/resources/attraction-with-single-slogan', + 'title' => 'Attraktion mit single slogan', + 'slogan' => 'InsiderTip', + ], + 1 => [ + 'uid' => '2', + 'pid' => '10', + 'sys_language_uid' => '1', + 'l18n_parent' => '1', + 'l10n_source' => '1', + 'remote_id' => 'https://thuecat.org/resources/attraction-with-single-slogan', + 'title' => 'Attraction with single slogan', + 'slogan' => 'InsiderTip', + ], + ], +]; diff --git a/Tests/Functional/Assertions/Import/ImportsTouristAttractionWithSloganArray.php b/Tests/Functional/Assertions/Import/ImportsTouristAttractionWithSloganArray.php new file mode 100644 index 0000000..7b0268c --- /dev/null +++ b/Tests/Functional/Assertions/Import/ImportsTouristAttractionWithSloganArray.php @@ -0,0 +1,28 @@ + [ + 0 => [ + 'uid' => '1', + 'pid' => '10', + 'sys_language_uid' => '0', + 'l18n_parent' => '0', + 'l10n_source' => '0', + 'remote_id' => 'https://thuecat.org/resources/attraction-with-slogan-array', + 'title' => 'Attraktion mit slogan array', + 'slogan' => 'Highlight,InsiderTip,Unique', + ], + 1 => [ + 'uid' => '2', + 'pid' => '10', + 'sys_language_uid' => '1', + 'l18n_parent' => '1', + 'l10n_source' => '1', + 'remote_id' => 'https://thuecat.org/resources/attraction-with-slogan-array', + 'title' => 'Attraction with slogan array', + 'slogan' => 'Highlight,InsiderTip,Unique', + ], + ], +]; diff --git a/Tests/Functional/Fixtures/Import/Guzzle/thuecat.org/resources/attraction-with-single-slogan.json b/Tests/Functional/Fixtures/Import/Guzzle/thuecat.org/resources/attraction-with-single-slogan.json new file mode 100644 index 0000000..064e9be --- /dev/null +++ b/Tests/Functional/Fixtures/Import/Guzzle/thuecat.org/resources/attraction-with-single-slogan.json @@ -0,0 +1,55 @@ +{ + "@context": { + "cdb": "https://thuecat.org/ontology/cdb/1.0/", + "dachkg": "https://thuecat.org/ontology/dachkg/1.0/", + "dbo": "http://dbpedia.org/ontology/", + "dsv": "http://ontologies.sti-innsbruck.at/dsv/", + "foaf": "http://xmlns.com/foaf/0.1/", + "owl": "http://www.w3.org/2002/07/owl#", + "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "schema": "http://schema.org/", + "sh": "http://www.w3.org/ns/shacl#", + "thuecat": "https://thuecat.org/ontology/thuecat/1.0/", + "ttgds": "https://thuecat.org/ontology/ttgds/1.0/", + "xsd": "http://www.w3.org/2001/XMLSchema#" + }, + "@graph": [ + { + "@id": "https://thuecat.org/resources/attraction-with-single-slogan", + "@type": [ + "schema:Place", + "schema:Thing", + "schema:TouristAttraction", + "ttgds:PointOfInterest" + ], + "schema:availableLanguage": [ + { + "@type": "thuecat:Language", + "@value": "thuecat:German" + }, + { + "@type": "thuecat:Language", + "@value": "thuecat:English" + } + ], + "schema:name": [ + { + "@language": "de", + "@value": "Attraktion mit single slogan" + }, + { + "@language": "en", + "@value": "Attraction with single slogan" + } + ], + "schema:slogan": { + "@type": "thuecat:ThuSlogan", + "@value": "thuecat:InsiderTip" + }, + "thuecat:contentResponsible": { + "@id": "https://thuecat.org/resources/018132452787-ngbe" + } + } + ] +} diff --git a/Tests/Functional/Fixtures/Import/Guzzle/thuecat.org/resources/attraction-with-slogan-array.json b/Tests/Functional/Fixtures/Import/Guzzle/thuecat.org/resources/attraction-with-slogan-array.json new file mode 100644 index 0000000..099eb10 --- /dev/null +++ b/Tests/Functional/Fixtures/Import/Guzzle/thuecat.org/resources/attraction-with-slogan-array.json @@ -0,0 +1,65 @@ +{ + "@context": { + "cdb": "https://thuecat.org/ontology/cdb/1.0/", + "dachkg": "https://thuecat.org/ontology/dachkg/1.0/", + "dbo": "http://dbpedia.org/ontology/", + "dsv": "http://ontologies.sti-innsbruck.at/dsv/", + "foaf": "http://xmlns.com/foaf/0.1/", + "owl": "http://www.w3.org/2002/07/owl#", + "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "schema": "http://schema.org/", + "sh": "http://www.w3.org/ns/shacl#", + "thuecat": "https://thuecat.org/ontology/thuecat/1.0/", + "ttgds": "https://thuecat.org/ontology/ttgds/1.0/", + "xsd": "http://www.w3.org/2001/XMLSchema#" + }, + "@graph": [ + { + "@id": "https://thuecat.org/resources/attraction-with-slogan-array", + "@type": [ + "schema:Place", + "schema:Thing", + "schema:TouristAttraction", + "ttgds:PointOfInterest" + ], + "schema:availableLanguage": [ + { + "@type": "thuecat:Language", + "@value": "thuecat:German" + }, + { + "@type": "thuecat:Language", + "@value": "thuecat:English" + } + ], + "schema:name": [ + { + "@language": "de", + "@value": "Attraktion mit slogan array" + }, + { + "@language": "en", + "@value": "Attraction with slogan array" + } + ], + "schema:slogan": [ + { + "@type": "thuecat:ThuSlogan", + "@value": "thuecat:Highlight" + }, + { + "@type": "thuecat:ThuSlogan", + "@value": "thuecat:InsiderTip" + }, + { + "@type": "thuecat:ThuSlogan", + "@value": "thuecat:Unique" + } + ], + "thuecat:contentResponsible": { + "@id": "https://thuecat.org/resources/018132452787-ngbe" + } + } + ] +} diff --git a/Tests/Functional/Fixtures/Import/ImportsTouristAttractionWithSingleSlogan.php b/Tests/Functional/Fixtures/Import/ImportsTouristAttractionWithSingleSlogan.php new file mode 100644 index 0000000..9d33191 --- /dev/null +++ b/Tests/Functional/Fixtures/Import/ImportsTouristAttractionWithSingleSlogan.php @@ -0,0 +1,65 @@ + [ + 0 => [ + 'uid' => '1', + 'pid' => '0', + 'tstamp' => '1613400587', + 'crdate' => '1613400558', + 'doktype' => PageRepository::DOKTYPE_DEFAULT, + 'title' => 'Rootpage', + 'is_siteroot' => '1', + ], + 1 => [ + 'uid' => '10', + 'pid' => '1', + 'tstamp' => '1613400587', + 'crdate' => '1613400558', + 'doktype' => PageRepository::DOKTYPE_SYSFOLDER, + 'title' => 'Storage folder', + ], + ], + 'tx_thuecat_import_configuration' => [ + 0 => [ + 'uid' => '1', + 'pid' => '0', + 'tstamp' => '1613400587', + 'crdate' => '1613400558', + 'disable' => '0', + 'title' => 'Tourist Attraction', + 'type' => 'static', + 'configuration' => ' + + + + + + 10 + + + + + + + + https://thuecat.org/resources/attraction-with-single-slogan + + + + 0 + + + + + + + + ', + ], + ], +]; diff --git a/Tests/Functional/Fixtures/Import/ImportsTouristAttractionWithSloganArray.php b/Tests/Functional/Fixtures/Import/ImportsTouristAttractionWithSloganArray.php new file mode 100644 index 0000000..4587884 --- /dev/null +++ b/Tests/Functional/Fixtures/Import/ImportsTouristAttractionWithSloganArray.php @@ -0,0 +1,65 @@ + [ + 0 => [ + 'uid' => '1', + 'pid' => '0', + 'tstamp' => '1613400587', + 'crdate' => '1613400558', + 'doktype' => PageRepository::DOKTYPE_DEFAULT, + 'title' => 'Rootpage', + 'is_siteroot' => '1', + ], + 1 => [ + 'uid' => '10', + 'pid' => '1', + 'tstamp' => '1613400587', + 'crdate' => '1613400558', + 'doktype' => PageRepository::DOKTYPE_SYSFOLDER, + 'title' => 'Storage folder', + ], + ], + 'tx_thuecat_import_configuration' => [ + 0 => [ + 'uid' => '1', + 'pid' => '0', + 'tstamp' => '1613400587', + 'crdate' => '1613400558', + 'disable' => '0', + 'title' => 'Tourist Attraction', + 'type' => 'static', + 'configuration' => ' + + + + + + 10 + + + + + + + + https://thuecat.org/resources/attraction-with-slogan-array + + + + 0 + + + + + + + + ', + ], + ], +]; diff --git a/Tests/Functional/ImportTest.php b/Tests/Functional/ImportTest.php index a30e2fe..b5afffb 100644 --- a/Tests/Functional/ImportTest.php +++ b/Tests/Functional/ImportTest.php @@ -333,6 +333,32 @@ class ImportTest extends AbstractImportTestCase self::assertStringEqualsFile(__DIR__ . '/Fixtures/Import/ImportsTouristAttractionWithAccessibilitySpecificationEnglish.txt', $records[1]['accessibility_specification'] . PHP_EOL); } + #[Test] + public function importsTouristAttractionWithSloganArray(): void + { + $this->importPHPDataSet(__DIR__ . '/Fixtures/Import/ImportsTouristAttractionWithSloganArray.php'); + + GuzzleClientFaker::appendResponseFromFile(__DIR__ . '/Fixtures/Import/Guzzle/thuecat.org/resources/attraction-with-slogan-array.json'); + GuzzleClientFaker::appendResponseFromFile(__DIR__ . '/Fixtures/Import/Guzzle/thuecat.org/resources/018132452787-ngbe.json'); + + $this->importConfiguration(); + + $this->assertPHPDataSet(__DIR__ . '/Assertions/Import/ImportsTouristAttractionWithSloganArray.php'); + } + + #[Test] + public function importsTouristAttractionWithSingleSlogan(): void + { + $this->importPHPDataSet(__DIR__ . '/Fixtures/Import/ImportsTouristAttractionWithSingleSlogan.php'); + + GuzzleClientFaker::appendResponseFromFile(__DIR__ . '/Fixtures/Import/Guzzle/thuecat.org/resources/attraction-with-single-slogan.json'); + GuzzleClientFaker::appendResponseFromFile(__DIR__ . '/Fixtures/Import/Guzzle/thuecat.org/resources/018132452787-ngbe.json'); + + $this->importConfiguration(); + + $this->assertPHPDataSet(__DIR__ . '/Assertions/Import/ImportsTouristAttractionWithSingleSlogan.php'); + } + private function importConfiguration(): void { $configuration = $this->get(ImportConfigurationRepository::class)->findByUid(1); diff --git a/Tests/Unit/Domain/Model/Frontend/TouristAttractionTest.php b/Tests/Unit/Domain/Model/Frontend/TouristAttractionTest.php index 61d99f7..39e023b 100644 --- a/Tests/Unit/Domain/Model/Frontend/TouristAttractionTest.php +++ b/Tests/Unit/Domain/Model/Frontend/TouristAttractionTest.php @@ -280,4 +280,24 @@ class TouristAttractionTest extends TestCase } } } + + #[Test] + public function returnsSingleSlogan(): void + { + $subject = new TouristAttraction(); + $subject->_setProperty('slogan', 'Some text'); + + self::assertSame('Some text', $subject->getSlogan()); + self::assertSame(['Some text'], $subject->getSlogans()); + } + + #[Test] + public function returnsMultipleSlogans(): void + { + $subject = new TouristAttraction(); + $subject->_setProperty('slogan', 'Some text,Highlight'); + + self::assertSame('Some text', $subject->getSlogan()); + self::assertSame(['Some text', 'Highlight'], $subject->getSlogans()); + } }