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());
+ }
}