Add parking_facility_near_by

- Removed individual converters for TYPO3.
  Conversion is now handled in a single converter.
- The new converter will import necessary dependencies upfront, e.g.
  town or organisation.
- Move import state into extra class.

Relates: #34
This commit is contained in:
Daniel Siepmann 2021-08-18 13:54:18 +02:00
parent 5859c14525
commit cc216429a5
79 changed files with 2389 additions and 958 deletions

View file

@ -36,14 +36,18 @@ class EntityPass implements CompilerPassInterface
$registry = $container->findDefinition(EntityRegistry::class);
foreach ($container->findTaggedServiceIds(self::TAG) as $id => $tags) {
$definition = $container->findDefinition($id);
if (!$definition->isAutoconfigured() || $definition->isAbstract()) {
if (
!$definition->isAutoconfigured()
|| $definition->isAbstract()
|| $definition->getClass() === null
) {
continue;
}
$registry->addMethodCall(
'registerEntityClass',
[
$definition->getClass(),
call_user_func([$definition->getClass(), 'getPriority']),
call_user_func([$definition->getClass(), 'getSupportedTypes']),
]
);

View file

@ -38,4 +38,9 @@ interface MapsToType
* @return string[]
*/
public static function getSupportedTypes(): array;
/**
* Priority if multiple entities match
*/
public static function getPriority(): int;
}

View file

@ -105,4 +105,9 @@ class MediaObject extends Minimum implements MapsToType
'schema:MediaObject',
];
}
public static function getPriority(): int
{
return 10;
}
}

View file

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace WerkraumMedia\ThueCat\Domain\Import\Entity;
class Minimum
abstract class Minimum
{
/**
* URL to the original source at ThüCAT.
@ -113,4 +113,9 @@ class Minimum
{
$this->url = $url;
}
public static function getPriority(): int
{
return 10;
}
}

View file

@ -0,0 +1,34 @@
<?php
declare(strict_types=1);
/*
* Copyright (C) 2021 Daniel Siepmann <coding@daniel-siepmann.de>
*
* 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.
*/
namespace WerkraumMedia\ThueCat\Domain\Import\Entity;
class ParkingFacility extends Place implements MapsToType
{
public static function getSupportedTypes(): array
{
return [
'schema:ParkingFacility',
];
}
}

View file

@ -23,7 +23,9 @@ declare(strict_types=1);
namespace WerkraumMedia\ThueCat\Domain\Import\Entity;
use WerkraumMedia\ThueCat\Domain\Import\EntityMapper\PropertyValues;
use WerkraumMedia\ThueCat\Domain\Import\Entity\Properties\Address;
use WerkraumMedia\ThueCat\Domain\Import\Entity\Properties\ForeignReference;
use WerkraumMedia\ThueCat\Domain\Import\Entity\Properties\Geo;
use WerkraumMedia\ThueCat\Domain\Import\Entity\Properties\OpeningHour;
use WerkraumMedia\ThueCat\Domain\Import\Entity\Shared\ContainedInPlace;
@ -49,6 +51,36 @@ class Place extends Base
*/
protected $openingHours = [];
/**
* @var ForeignReference[]
*/
protected $parkingFacilitiesNearBy = [];
/**
* @var string[]
*/
protected $sanitations = [];
/**
* @var string[]
*/
protected $otherServices = [];
/**
* @var string[]
*/
protected $trafficInfrastructures = [];
/**
* @var string[]
*/
protected $paymentsAccepted = [];
/**
* @var string
*/
protected $distanceToPublicTransport = '';
public function getAddress(): ?Address
{
return $this->address;
@ -59,6 +91,51 @@ class Place extends Base
return $this->geo;
}
/**
* @return ForeignReference[]
*/
public function getParkingFacilitiesNearBy(): array
{
return $this->parkingFacilitiesNearBy;
}
/**
* @return string[]
*/
public function getSanitations(): array
{
return $this->sanitations;
}
/**
* @return string[]
*/
public function getOtherServices(): array
{
return $this->otherServices;
}
/**
* @return string[]
*/
public function getTrafficInfrastructures(): array
{
return $this->trafficInfrastructures;
}
/**
* @return string[]
*/
public function getPaymentsAccepted(): array
{
return $this->paymentsAccepted;
}
public function getDistanceToPublicTransport(): string
{
return $this->distanceToPublicTransport;
}
/**
* @internal for mapping via Symfony component.
*/
@ -98,4 +175,92 @@ class Place extends Base
public function removeOpeningHoursSpecification(OpeningHour $openingHour): void
{
}
/**
* @internal for mapping via Symfony component.
* @return ForeignReference[]
*/
public function getParkingFacilityNearBy(): array
{
return $this->parkingFacilitiesNearBy;
}
/**
* @internal for mapping via Symfony component.
*/
public function addParkingFacilityNearBy(ForeignReference $parkingFacilityNearBy): void
{
$this->parkingFacilitiesNearBy[] = $parkingFacilityNearBy;
}
/**
* @internal for mapping via Symfony component.
*/
public function removeParkingFacilityNearBy(ForeignReference $parkingFacilityNearBy): void
{
}
/**
* @internal for mapping via Symfony component.
* @param string|array $sanitation
*/
public function setSanitation($sanitation): void
{
if (is_string($sanitation)) {
$sanitation = [$sanitation];
}
$this->sanitations = PropertyValues::removePrefixFromEntries($sanitation);
}
/**
* @internal for mapping via Symfony component.
* @param string|array $otherService
*/
public function setOtherService($otherService): void
{
if (is_string($otherService)) {
$otherService = [$otherService];
}
$this->otherServices = PropertyValues::removePrefixFromEntries($otherService);
}
/**
* @internal for mapping via Symfony component.
* @param string|array $trafficInfrastructure
*/
public function setTrafficInfrastructure($trafficInfrastructure): void
{
if (is_string($trafficInfrastructure)) {
$trafficInfrastructure = [$trafficInfrastructure];
}
$this->trafficInfrastructures = PropertyValues::removePrefixFromEntries($trafficInfrastructure);
}
/**
* @internal for mapping via Symfony component.
* @param string|array $paymentAccepted
*/
public function setPaymentAccepted($paymentAccepted): void
{
if (is_string($paymentAccepted)) {
$paymentAccepted = [$paymentAccepted];
}
$this->paymentsAccepted = PropertyValues::removePrefixFromEntries($paymentAccepted);
}
/**
* @internal for mapping via Symfony component.
*/
public function setDistanceToPublicTransport(array $distanceToPublicTransport): void
{
$unit = $distanceToPublicTransport['unitCode'] ?? '';
$value = $distanceToPublicTransport['value'] ?? '';
if ($unit && $value) {
$this->distanceToPublicTransport = $value . ':' . PropertyValues::removePrefixFromEntry($unit);
}
}
}

View file

@ -26,14 +26,14 @@ namespace WerkraumMedia\ThueCat\Domain\Import\Entity\Properties;
class OpeningHour
{
/**
* @var \DateTimeImmutable
* @var \DateTimeImmutable|null
*/
protected $validFrom;
protected $validFrom = null;
/**
* @var \DateTimeImmutable
* @var \DateTimeImmutable|null
*/
protected $validThrough;
protected $validThrough = null;
/**
* @var \DateTimeImmutable
@ -50,12 +50,12 @@ class OpeningHour
*/
protected $daysOfWeek = [];
public function getValidFrom(): \DateTimeImmutable
public function getValidFrom(): ?\DateTimeImmutable
{
return $this->validFrom;
}
public function getValidThrough(): \DateTimeImmutable
public function getValidThrough(): ?\DateTimeImmutable
{
return $this->validThrough;
}

View file

@ -23,6 +23,7 @@ declare(strict_types=1);
namespace WerkraumMedia\ThueCat\Domain\Import\Entity\Properties;
use WerkraumMedia\ThueCat\Domain\Import\EntityMapper\PropertyValues;
use WerkraumMedia\ThueCat\Domain\Import\Entity\Minimum;
class PriceSpecification extends Minimum
@ -76,9 +77,7 @@ class PriceSpecification extends Minimum
*/
public function setPriceCurrency(string $currency): void
{
// TODO: Move to serializer process while decoding json?!
// Check for @type and @value, if type is currency …
$this->currency = str_replace('thuecat:', '', $currency);
$this->currency = PropertyValues::removePrefixFromEntry($currency);
}
/**
@ -86,8 +85,6 @@ class PriceSpecification extends Minimum
*/
public function setCalculationRule(string $calculationRule): void
{
// TODO: Move to serializer process while decoding json?!
// Check for @type and @value, if type is currency …
$this->calculationRule = str_replace('thuecat:', '', $calculationRule);
$this->calculationRule = PropertyValues::removePrefixFromEntry($calculationRule);
}
}

View file

@ -23,6 +23,8 @@ declare(strict_types=1);
namespace WerkraumMedia\ThueCat\Domain\Import\Entity;
use WerkraumMedia\ThueCat\Domain\Import\EntityMapper\PropertyValues;
class TouristAttraction extends Place implements MapsToType
{
/**
@ -35,16 +37,6 @@ class TouristAttraction extends Place implements MapsToType
*/
protected $startOfConstruction = '';
/**
* @var string[]
*/
protected $sanitations = [];
/**
* @var string[]
*/
protected $otherServices = [];
/**
* @var string[]
*/
@ -55,16 +47,6 @@ class TouristAttraction extends Place implements MapsToType
*/
protected $architecturalStyles = [];
/**
* @var string[]
*/
protected $trafficInfrastructures = [];
/**
* @var string[]
*/
protected $paymentsAccepted = [];
/**
* @var string[]
*/
@ -95,11 +77,6 @@ class TouristAttraction extends Place implements MapsToType
*/
protected $availableLanguages = [];
/**
* @var string
*/
protected $distanceToPublicTransport = '';
public function getSlogan(): string
{
return $this->slogan;
@ -110,22 +87,6 @@ class TouristAttraction extends Place implements MapsToType
return $this->startOfConstruction;
}
/**
* @return string[]
*/
public function getSanitations(): array
{
return $this->sanitations;
}
/**
* @return string[]
*/
public function getOtherServices(): array
{
return $this->otherServices;
}
/**
* @return string[]
*/
@ -142,22 +103,6 @@ class TouristAttraction extends Place implements MapsToType
return $this->architecturalStyles;
}
/**
* @return string[]
*/
public function getTrafficInfrastructures(): array
{
return $this->trafficInfrastructures;
}
/**
* @return string[]
*/
public function getPaymentsAccepted(): array
{
return $this->paymentsAccepted;
}
/**
* @return string[]
*/
@ -197,17 +142,12 @@ class TouristAttraction extends Place implements MapsToType
return $this->availableLanguages;
}
public function getDistanceToPublicTransport(): string
{
return $this->distanceToPublicTransport;
}
/**
* @internal for mapping via Symfony component.
*/
public function setSlogan(string $slogan): void
{
$this->slogan = str_replace('thuecat:', '', $slogan);
$this->slogan = PropertyValues::removePrefixFromEntry($slogan);
}
/**
@ -218,36 +158,6 @@ class TouristAttraction extends Place implements MapsToType
$this->startOfConstruction = $startOfConstruction;
}
/**
* @internal for mapping via Symfony component.
* @param string|array $sanitation
*/
public function setSanitation($sanitation): void
{
if (is_string($sanitation)) {
$sanitation = [$sanitation];
}
$this->sanitations = array_map(function (string $sanitation) {
return str_replace('thuecat:', '', $sanitation);
}, $sanitation);
}
/**
* @internal for mapping via Symfony component.
* @param string|array $otherService
*/
public function setOtherService($otherService): void
{
if (is_string($otherService)) {
$otherService = [$otherService];
}
$this->otherServices = array_map(function (string $otherService) {
return str_replace('thuecat:', '', $otherService);
}, $otherService);
}
/**
* @internal for mapping via Symfony component.
* @param string|array $museumService
@ -258,9 +168,7 @@ class TouristAttraction extends Place implements MapsToType
$museumService = [$museumService];
}
$this->museumServices = array_map(function (string $museumService) {
return str_replace('thuecat:', '', $museumService);
}, $museumService);
$this->museumServices = PropertyValues::removePrefixFromEntries($museumService);
}
/**
@ -273,39 +181,7 @@ class TouristAttraction extends Place implements MapsToType
$architecturalStyle = [$architecturalStyle];
}
$this->architecturalStyles = array_map(function (string $architecturalStyle) {
return str_replace('thuecat:', '', $architecturalStyle);
}, $architecturalStyle);
}
/**
* @internal for mapping via Symfony component.
* @param string|array $trafficInfrastructure
*/
public function setTrafficInfrastructure($trafficInfrastructure): void
{
if (is_string($trafficInfrastructure)) {
$trafficInfrastructure = [$trafficInfrastructure];
}
$this->trafficInfrastructures = array_map(function (string $trafficInfrastructure) {
return str_replace('thuecat:', '', $trafficInfrastructure);
}, $trafficInfrastructure);
}
/**
* @internal for mapping via Symfony component.
* @param string|array $paymentAccepted
*/
public function setPaymentAccepted($paymentAccepted): void
{
if (is_string($paymentAccepted)) {
$paymentAccepted = [$paymentAccepted];
}
$this->paymentsAccepted = array_map(function (string $paymentAccepted) {
return str_replace('thuecat:', '', $paymentAccepted);
}, $paymentAccepted);
$this->architecturalStyles = PropertyValues::removePrefixFromEntries($architecturalStyle);
}
/**
@ -318,9 +194,7 @@ class TouristAttraction extends Place implements MapsToType
$digitalOffer = [$digitalOffer];
}
$this->digitalOffers = array_map(function (string $digitalOffer) {
return str_replace('thuecat:', '', $digitalOffer);
}, $digitalOffer);
$this->digitalOffers = PropertyValues::removePrefixFromEntries($digitalOffer);
}
/**
@ -333,9 +207,7 @@ class TouristAttraction extends Place implements MapsToType
$photography = [$photography];
}
$this->photographies = array_map(function (string $photography) {
return str_replace('thuecat:', '', $photography);
}, $photography);
$this->photographies = PropertyValues::removePrefixFromEntries($photography);
}
/**
@ -372,21 +244,7 @@ class TouristAttraction extends Place implements MapsToType
$availableLanguage = [$availableLanguage];
}
$this->availableLanguages = array_map(function (string $availableLanguage) {
return str_replace('thuecat:', '', $availableLanguage);
}, $availableLanguage);
}
/**
* @internal for mapping via Symfony component.
*/
public function setDistanceToPublicTransport(array $distanceToPublicTransport): void
{
$unit = $distanceToPublicTransport['unitCode'] ?? '';
$value = $distanceToPublicTransport['value'] ?? '';
if ($unit && $value) {
$this->distanceToPublicTransport = $value . ':' . str_replace('thuecat:', '', $unit);
}
$this->availableLanguages = PropertyValues::removePrefixFromEntries($availableLanguage);
}
public static function getSupportedTypes(): array

View file

@ -23,6 +23,9 @@ declare(strict_types=1);
namespace WerkraumMedia\ThueCat\Domain\Import\EntityMapper;
use TYPO3\CMS\Core\Utility\ArrayUtility;
/**
* Registry with supported entities and their types.
*/
@ -31,28 +34,47 @@ class EntityRegistry
/**
* @var array[]
*/
private $entityClassNames = [];
private $entities = [];
/**
* @param string[] $supportedTypes
*/
public function registerEntityClass(
string $entityClassName,
int $priority,
array $supportedTypes
): void {
$this->entityClassNames[$entityClassName] = $supportedTypes;
foreach ($supportedTypes as $supportedType) {
$this->entities[$supportedType][] = [
'priority' => $priority,
'entityClassName' => $entityClassName,
];
}
}
public function getEntityByTypes(array $types): string
{
$matches = [];
foreach ($types as $type) {
foreach ($this->entityClassNames as $className => $supportedTypes) {
if (in_array($type, $supportedTypes)) {
return $className;
}
if (isset($this->entities[$type]) === false) {
continue;
}
foreach ($this->entities[$type] as $entityConfiguration) {
$matches[] = $entityConfiguration;
}
}
return '';
if ($matches === []) {
return '';
}
$matches = ArrayUtility::sortArraysByKey(
$matches,
'priority'
);
return end($matches)['entityClassName'];
}
}

View file

@ -0,0 +1,43 @@
<?php
declare(strict_types=1);
/*
* Copyright (C) 2021 Daniel Siepmann <coding@daniel-siepmann.de>
*
* 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.
*/
namespace WerkraumMedia\ThueCat\Domain\Import\EntityMapper;
/**
* API to work with values of properties.
*/
class PropertyValues
{
public static function removePrefixFromEntry(string $entryWithPrefix): string
{
return str_replace('thuecat:', '', $entryWithPrefix);
}
public static function removePrefixFromEntries(array $entriesWithPrefix): array
{
return array_map(
[PropertyValues::class, 'removePrefixFromEntry'],
$entriesWithPrefix
);
}
}

View file

@ -0,0 +1,115 @@
<?php
declare(strict_types=1);
/*
* Copyright (C) 2021 Daniel Siepmann <coding@daniel-siepmann.de>
*
* 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.
*/
namespace WerkraumMedia\ThueCat\Domain\Import;
use TYPO3\CMS\Core\Utility\StringUtility;
use WerkraumMedia\ThueCat\Domain\Model\Backend\ImportLog;
/**
* State of an import.
*
* Imports can be nested, e.g. an entity during import triggers an import of sub entities.
* The state is handled here to allow a single import result with all affected entities and errors.
*/
class Import
{
/**
* @var ImportLog[]
*/
private $importLogStack = [];
/**
* @var ImportConfiguration[]
*/
private $configurationStack = [];
/**
* @var ImportLog
*/
private $currentImportLog;
/**
* @var ImportConfiguration
*/
private $currentConfiguration;
public function start(ImportConfiguration $configuration): void
{
$this->currentConfiguration = $configuration;
$this->currentImportLog = new ImportLog($configuration);
$this->configurationStack[] = $this->currentConfiguration;
$this->importLogStack[] = $this->currentImportLog;
}
public function end(): void
{
array_pop($this->configurationStack);
$outerConfiguration = end($this->configurationStack);
if ($outerConfiguration instanceof ImportConfiguration) {
$this->currentConfiguration = $outerConfiguration;
}
$lastImportLog = array_pop($this->importLogStack);
$outerImportLog = end($this->importLogStack);
if ($outerImportLog instanceof ImportLog) {
$this->currentImportLog = $outerImportLog;
}
if ($lastImportLog instanceof ImportLog) {
$this->currentImportLog->merge($lastImportLog);
}
}
public function done(): bool
{
return $this->importLogStack === [];
}
public function getConfiguration(): ImportConfiguration
{
return $this->currentConfiguration;
}
public function getLog(): ImportLog
{
return $this->currentImportLog;
}
public function handledRemoteId(string $remoteId): bool
{
// Tours are not supported yet.
// So skip them here to save time.
if (StringUtility::endsWith($remoteId, '-oatour')) {
return true;
}
foreach ($this->importLogStack as $importLog) {
if ($importLog->handledRemoteId($remoteId)) {
return true;
}
}
return false;
}
}

View file

@ -0,0 +1,54 @@
<?php
declare(strict_types=1);
/*
* Copyright (C) 2021 Daniel Siepmann <coding@daniel-siepmann.de>
*
* 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.
*/
namespace WerkraumMedia\ThueCat\Domain\Import;
interface ImportConfiguration
{
/**
* Defines type of configuration, e.g.:
* - static
* - syncScope
*
* A UrlProvider is necessary for the type in order to process the configuration.
*/
public function getType(): string;
/**
* Return URLs to import, full path to resources.
*
* @return string[]
*/
public function getUrls(): array;
/**
* Defines a limited set of types to process, e.g.:
* - thuecat:Town
*
* The import will only process resources of this type.
* Empty array will allow all.
*
* @return string[]
*/
public function getAllowedTypes(): array;
}

View file

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace WerkraumMedia\ThueCat\Domain\Import;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use WerkraumMedia\ThueCat\Domain\Import\EntityMapper\EntityRegistry;
use WerkraumMedia\ThueCat\Domain\Import\EntityMapper\JsonDecode;
use WerkraumMedia\ThueCat\Domain\Import\Entity\MapsToType;
@ -34,7 +33,7 @@ use WerkraumMedia\ThueCat\Domain\Import\Importer\SaveData;
use WerkraumMedia\ThueCat\Domain\Import\Model\EntityCollection;
use WerkraumMedia\ThueCat\Domain\Import\UrlProvider\Registry as UrlProviderRegistry;
use WerkraumMedia\ThueCat\Domain\Import\UrlProvider\UrlProvider;
use WerkraumMedia\ThueCat\Domain\Model\Backend\ImportConfiguration;
use WerkraumMedia\ThueCat\Domain\Model\Backend\ImportConfiguration as Typo3ImportConfiguration;
use WerkraumMedia\ThueCat\Domain\Model\Backend\ImportLog;
use WerkraumMedia\ThueCat\Domain\Repository\Backend\ImportLogRepository;
@ -75,20 +74,15 @@ class Importer
*/
private $saveData;
/**
* @var ImportLog
*/
private $importLog;
/**
* @var ImportLogRepository
*/
private $importLogRepository;
/**
* @var ImportConfiguration
* @var Import
*/
private $configuration;
private $import;
public function __construct(
UrlProviderRegistry $urls,
@ -108,29 +102,43 @@ class Importer
$this->importLogRepository = $importLogRepository;
$this->fetchData = $fetchData;
$this->saveData = $saveData;
$this->import = new Import();
}
public function importConfiguration(ImportConfiguration $configuration): ImportLog
{
$this->configuration = $configuration;
if (!$configuration instanceof Typo3ImportConfiguration) {
throw new \InvalidArgumentException('Currently only can process ImportConfiguration of TYPO3.', 1629708772);
}
$this->importLog = GeneralUtility::makeInstance(ImportLog::class, $this->configuration);
$this->import->start($configuration);
$this->import();
$this->import->end();
$urlProvider = $this->urls->getProviderForConfiguration($this->configuration);
if ($this->import->done()) {
$this->importLogRepository->addLog($this->import->getLog());
}
return $this->import->getLog();
}
private function import(): void
{
$urlProvider = $this->urls->getProviderForConfiguration($this->import->getConfiguration());
if (!$urlProvider instanceof UrlProvider) {
return $this->importLog;
throw new \Exception('No URL Provider available for given configuration.', 1629296635);
}
foreach ($urlProvider->getUrls() as $url) {
$this->importResourceByUrl($url);
}
$this->importLogRepository->addLog($this->importLog);
return clone $this->importLog;
}
private function importResourceByUrl(string $url): void
{
if ($this->import->handledRemoteId($url)) {
return;
}
$content = $this->fetchData->jsonLDFromUrl($url);
if ($content === []) {
@ -144,6 +152,10 @@ class Importer
private function importJsonEntity(array $jsonEntity): void
{
if ($this->entityAllowed($jsonEntity) === false) {
return;
}
$targetEntity = $this->entityRegistry->getEntityByTypes($jsonEntity['@type']);
if ($targetEntity === '') {
return;
@ -151,7 +163,7 @@ class Importer
$entities = new EntityCollection();
foreach ($this->languages->getAvailable($this->configuration) as $language) {
foreach ($this->languages->getAvailable($this->import->getConfiguration()) as $language) {
$mappedEntity = $this->entityMapper->mapDataToEntity(
$jsonEntity,
$targetEntity,
@ -164,7 +176,7 @@ class Importer
}
$convertedEntity = $this->converter->convert(
$mappedEntity,
$this->configuration,
$this->import->getConfiguration(),
$language
);
@ -176,7 +188,22 @@ class Importer
$this->saveData->import(
$entities,
$this->importLog
$this->import->getLog()
);
}
private function entityAllowed(array $jsonEntity): bool
{
if ($this->import->getConfiguration()->getAllowedTypes() === []) {
return true;
}
foreach ($jsonEntity['@type'] as $type) {
if (in_array($type, $this->import->getConfiguration()->getAllowedTypes()) === true) {
return true;
}
}
return false;
}
}

View file

@ -24,8 +24,8 @@ declare(strict_types=1);
namespace WerkraumMedia\ThueCat\Domain\Import\Importer;
use WerkraumMedia\ThueCat\Domain\Import\Entity\MapsToType;
use WerkraumMedia\ThueCat\Domain\Import\ImportConfiguration;
use WerkraumMedia\ThueCat\Domain\Import\Model\Entity;
use WerkraumMedia\ThueCat\Domain\Model\Backend\ImportConfiguration;
interface Converter
{

View file

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace WerkraumMedia\ThueCat\Domain\Import\Importer;
use WerkraumMedia\ThueCat\Domain\Model\Backend\ImportConfiguration;
use WerkraumMedia\ThueCat\Domain\Import\ImportConfiguration;
interface Languages
{

View file

@ -28,6 +28,13 @@ use WerkraumMedia\ThueCat\Domain\Import\EntityMapper\JsonDecode;
use WerkraumMedia\ThueCat\Domain\Import\Entity\Properties\ForeignReference;
use WerkraumMedia\ThueCat\Domain\Import\Importer\FetchData;
/**
* Can be used to resolve foreign references.
*
* The reference will be resolved and returned as entity.
* It will not be imported!
* Use Importer instead to import foreign references.
*/
class ResolveForeignReference
{
/**
@ -78,4 +85,15 @@ class ResolveForeignReference
]
);
}
/**
* @param ForeignReference[] $foreignReferences
* @return string[]
*/
public static function convertToRemoteIds(array $foreignReferences): array
{
return array_map(function (ForeignReference $reference) {
return $reference->getId();
}, $foreignReferences);
}
}

View file

@ -28,7 +28,7 @@ use WerkraumMedia\ThueCat\Domain\Import\Importer\Converter;
use WerkraumMedia\ThueCat\Domain\Import\Model\Entity;
use WerkraumMedia\ThueCat\Domain\Import\Typo3Converter\Converter as Typo3ConcreteConverter;
use WerkraumMedia\ThueCat\Domain\Import\Typo3Converter\Registry;
use WerkraumMedia\ThueCat\Domain\Model\Backend\ImportConfiguration;
use WerkraumMedia\ThueCat\Domain\Model\Backend\ImportConfiguration as Typo3ImportConfiguration;
class Typo3Converter implements Converter
{
@ -48,6 +48,10 @@ class Typo3Converter implements Converter
ImportConfiguration $configuration,
string $language
): ?Entity {
if (!$configuration instanceof Typo3ImportConfiguration) {
throw new \InvalidArgumentException('Only supports TYPO3 import configuration.', 1629710386);
}
$concreteConverter = $this->registry->getConverterBasedOnType($mapped);
if (!$concreteConverter instanceof Typo3ConcreteConverter) {
throw new \Exception(
@ -55,6 +59,7 @@ class Typo3Converter implements Converter
1628244329
);
}
return $concreteConverter->convert(
$mapped,
$configuration,

View file

@ -29,8 +29,6 @@ use WerkraumMedia\ThueCat\Domain\Model\Backend\ImportConfiguration;
interface Converter
{
public function canConvert(MapsToType $entity): bool;
public function convert(
MapsToType $entity,
ImportConfiguration $configuration,

View file

@ -0,0 +1,373 @@
<?php
declare(strict_types=1);
/*
* Copyright (C) 2021 Daniel Siepmann <coding@daniel-siepmann.de>
*
* 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.
*/
namespace WerkraumMedia\ThueCat\Domain\Import\Typo3Converter;
use TYPO3\CMS\Extbase\Persistence\QueryResultInterface;
use WerkraumMedia\ThueCat\Domain\Import\Entity\Base;
use WerkraumMedia\ThueCat\Domain\Import\Entity\MapsToType;
use WerkraumMedia\ThueCat\Domain\Import\Entity\MediaObject;
use WerkraumMedia\ThueCat\Domain\Import\Entity\Minimum;
use WerkraumMedia\ThueCat\Domain\Import\Entity\ParkingFacility;
use WerkraumMedia\ThueCat\Domain\Import\Entity\Place;
use WerkraumMedia\ThueCat\Domain\Import\Entity\Properties\ForeignReference;
use WerkraumMedia\ThueCat\Domain\Import\Entity\Properties\PriceSpecification;
use WerkraumMedia\ThueCat\Domain\Import\Entity\TouristAttraction;
use WerkraumMedia\ThueCat\Domain\Import\Entity\TouristInformation;
use WerkraumMedia\ThueCat\Domain\Import\Entity\TouristMarketingCompany;
use WerkraumMedia\ThueCat\Domain\Import\Entity\Town;
use WerkraumMedia\ThueCat\Domain\Import\Importer;
use WerkraumMedia\ThueCat\Domain\Import\Model\Entity;
use WerkraumMedia\ThueCat\Domain\Import\Model\GenericEntity;
use WerkraumMedia\ThueCat\Domain\Import\ResolveForeignReference;
use WerkraumMedia\ThueCat\Domain\Model\Backend\ImportConfiguration;
use WerkraumMedia\ThueCat\Domain\Repository\Backend\OrganisationRepository;
use WerkraumMedia\ThueCat\Domain\Repository\Backend\ParkingFacilityRepository;
use WerkraumMedia\ThueCat\Domain\Repository\Backend\TownRepository;
class GeneralConverter implements Converter
{
/**
* @var ResolveForeignReference
*/
private $resolveForeignReference;
/**
* @var Importer
*/
private $importer;
/**
* @var LanguageHandling
*/
private $languageHandling;
/**
* @var OrganisationRepository
*/
private $organisationRepository;
/**
* @var TownRepository
*/
private $townRepository;
/**
* @var ParkingFacilityRepository
*/
private $parkingFacilityRepository;
/**
* @var ImportConfiguration
*/
private $importConfiguration;
/**
* @var string[]
*/
private $classToTableMapping = [
TouristAttraction::class => 'tx_thuecat_tourist_attraction',
ParkingFacility::class => 'tx_thuecat_parking_facility',
Town::class => 'tx_thuecat_town',
TouristInformation::class => 'tx_thuecat_tourist_information',
TouristMarketingCompany::class => 'tx_thuecat_organisation',
];
public function __construct(
ResolveForeignReference $resolveForeignReference,
Importer $importer,
LanguageHandling $languageHandling,
OrganisationRepository $organisationRepository,
TownRepository $townRepository,
ParkingFacilityRepository $parkingFacilityRepository
) {
$this->resolveForeignReference = $resolveForeignReference;
$this->importer = $importer;
$this->languageHandling = $languageHandling;
$this->organisationRepository = $organisationRepository;
$this->townRepository = $townRepository;
$this->parkingFacilityRepository = $parkingFacilityRepository;
}
public function convert(
MapsToType $entity,
ImportConfiguration $importConfiguration,
string $language
): ?Entity {
$this->importConfiguration = $importConfiguration;
if (!$entity instanceof Minimum || $entity->hasName() === false) {
return null;
}
return new GenericEntity(
$importConfiguration->getStoragePid(),
$this->getTableNameByEntityClass(get_class($entity)),
$this->languageHandling->getLanguageUidForString(
$importConfiguration->getStoragePid(),
$language
),
$entity->getId(),
$this->buildDataArrayFromEntity(
$entity,
$language
)
);
}
private function getTableNameByEntityClass(string $className): string
{
$tableName = $this->classToTableMapping[$className] ?? '';
if ($tableName == '') {
throw new \Exception('No table name configured for class ' . $className, 1629376990);
}
return $tableName;
}
private function buildDataArrayFromEntity(
Minimum $entity,
string $language
): array {
return [
'title' => $entity->getName(),
'description' => trim($entity->getDescription()),
'sanitation' => method_exists($entity, 'getSanitations') ? implode(',', $entity->getSanitations()) : '',
'managed_by' => $this->getManagerUid($entity),
'town' => $this->getTownUid($entity),
'media' => $entity instanceof Base ? $this->getMedia($entity, $language) : '',
'parking_facility_near_by' => $entity instanceof Base ? implode(',', $this->getParkingFacilitiesNearByUids($entity)) : '',
'opening_hours' => $entity instanceof Place ? $this->getOpeningHours($entity) : '',
'address' => $entity instanceof Place ? $this->getAddress($entity) : '',
'offers' => $entity instanceof Place ? $this->getOffers($entity) : '',
'other_service' => method_exists($entity, 'getOtherServices') ? implode(',', $entity->getOtherServices()) : '',
'traffic_infrastructure' => method_exists($entity, 'getTrafficInfrastructures') ? implode(',', $entity->getTrafficInfrastructures()) : '',
'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() : '',
'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()) : '',
'digital_offer' => method_exists($entity, 'getDigitalOffers') ? implode(',', $entity->getDigitalOffers()) : '',
'photography' => method_exists($entity, 'getPhotographies') ? implode(',', $entity->getPhotographies()) : '',
'pets_allowed' => method_exists($entity, 'getPetsAllowed') ? $entity->getPetsAllowed() : '',
'is_accessible_for_free' => method_exists($entity, 'getIsAccessibleForFree') ? $entity->getIsAccessibleForFree() : '',
'public_access' => method_exists($entity, 'getPublicAccess') ? $entity->getPublicAccess() : '',
'available_languages' => method_exists($entity, 'getAvailableLanguages') ? implode(',', $entity->getAvailableLanguages()) : '',
];
}
private function getManagerUid(object $entity): string
{
if (
method_exists($entity, 'getManagedBy') === false
|| !$entity->getManagedBy() instanceof ForeignReference
) {
return '';
}
$this->importer->importConfiguration(
ImportConfiguration::createFromBaseWithForeignReferences(
$this->importConfiguration,
[$entity->getManagedBy()]
)
);
$manager = $this->organisationRepository->findOneByRemoteId(
$entity->getManagedBy()->getId()
);
return $manager ? (string)$manager->getUid() : '';
}
private function getTownUid(object $entity): string
{
if (
$entity instanceof Town
|| method_exists($entity, 'getContainedInPlaces') === false
) {
return '';
}
$this->importer->importConfiguration(
ImportConfiguration::createFromBaseWithForeignReferences(
$this->importConfiguration,
$entity->getContainedInPlaces(),
['thuecat:Town']
)
);
$town = $this->townRepository->findOneByEntity($entity);
return $town ? (string) $town->getUid() : '';
}
private function getParkingFacilitiesNearByUids(Base $entity): array
{
if (method_exists($entity, 'getParkingFacilitiesNearBy') === false) {
return [];
}
$this->importer->importConfiguration(
ImportConfiguration::createFromBaseWithForeignReferences(
$this->importConfiguration,
$entity->getParkingFacilitiesNearBy()
)
);
return $this->getUids(
$this->parkingFacilityRepository->findByEntity($entity)
);
}
private function getMedia(
Base $entity,
string $language
): string {
$data = [];
if ($entity->getPhoto() instanceof ForeignReference) {
$photo = $this->resolveForeignReference->resolve(
$entity->getPhoto(),
$language
);
if ($photo instanceof MediaObject) {
$data[] = $this->getSingleMedia($photo, true);
}
}
foreach ($entity->getImages() as $image) {
$image = $this->resolveForeignReference->resolve(
$image,
$language
);
if ($image instanceof MediaObject) {
$data[] = $this->getSingleMedia($image, false);
}
}
return json_encode($data) ?: '';
}
private function getSingleMedia(
MediaObject $mediaObject,
bool $mainImage
): array {
return [
'mainImage' => $mainImage,
'type' => $mediaObject->getType(),
'title' => $mediaObject->getName(),
'description' => $mediaObject->getDescription(),
'url' => $mediaObject->getUrl(),
'copyrightYear' => $mediaObject->getCopyrightYear(),
'license' => [
'type' => $mediaObject->getLicense(),
'author' => $mediaObject->getLicenseAuthor(),
],
];
}
private function getOpeningHours(Place $entity): string
{
$data = [];
foreach ($entity->getOpeningHoursSpecification() as $openingHour) {
$data[] = [
'opens' => $openingHour->getOpens()->format('H:i:s'),
'closes' => $openingHour->getCloses()->format('H:i:s'),
'from' => $openingHour->getValidFrom() ?? '',
'through' => $openingHour->getValidThrough() ?? '',
'daysOfWeek' => $openingHour->getDaysOfWeek(),
];
}
return json_encode($data) ?: '';
}
private function getAddress(Place $entity): string
{
$data = [];
$address = $entity->getAddress();
if ($address !== null) {
$data += [
'street' => $address->getStreetAddress(),
'zip' => $address->getPostalCode(),
'city' => $address->getAddressLocality(),
'email' => $address->getEmail(),
'phone' => $address->getTelephone(),
'fax' => $address->getFaxNumber(),
];
}
$geo = $entity->getGeo();
if ($geo !== null) {
$data += [
'geo' => [
'latitude' => $geo->getLatitude(),
'longitude' => $geo->getLongitude(),
],
];
}
return json_encode($data) ?: '';
}
private function getOffers(Place $entity): string
{
$data = [];
foreach ($entity->getOffers() as $offer) {
$data[] = [
'title' => $offer->getName(),
'description' => $offer->getDescription(),
'prices' => array_map([$this, 'getPrice'], $offer->getPrices()),
];
}
return json_encode($data) ?: '';
}
private function getPrice(PriceSpecification $priceSpecification): array
{
return [
'title' => $priceSpecification->getName(),
'description' => $priceSpecification->getDescription(),
'price' => $priceSpecification->getPrice(),
'currency' => $priceSpecification->getCurrency(),
'rule' => $priceSpecification->getCalculationRule(),
];
}
private function getUids(?QueryResultInterface $result): array
{
if ($result === null) {
return [];
}
$uids = [];
foreach ($result as $entry) {
$uids[] = $entry->getUid();
}
return $uids;
}
}

View file

@ -25,8 +25,8 @@ namespace WerkraumMedia\ThueCat\Domain\Import\Typo3Converter;
use TYPO3\CMS\Core\Site\Entity\SiteLanguage;
use TYPO3\CMS\Core\Site\SiteFinder;
use WerkraumMedia\ThueCat\Domain\Import\ImportConfiguration;
use WerkraumMedia\ThueCat\Domain\Import\Importer\Languages;
use WerkraumMedia\ThueCat\Domain\Model\Backend\ImportConfiguration;
class LanguageHandling implements Languages
{
@ -43,6 +43,9 @@ class LanguageHandling implements Languages
public function getAvailable(ImportConfiguration $configuration): array
{
if (method_exists($configuration, 'getStoragePid') === false) {
throw new \InvalidArgumentException('Unsupported configuration, need to retrieve storage pid.', 1629710300);
}
return array_map(function (SiteLanguage $language) {
return $language->getTwoLetterIsoCode();
}, $this->getLanguages($configuration->getStoragePid()));

View file

@ -1,63 +0,0 @@
<?php
declare(strict_types=1);
/*
* Copyright (C) 2021 Daniel Siepmann <coding@daniel-siepmann.de>
*
* 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.
*/
namespace WerkraumMedia\ThueCat\Domain\Import\Typo3Converter;
use WerkraumMedia\ThueCat\Domain\Import\Entity\MapsToType;
use WerkraumMedia\ThueCat\Domain\Import\Entity\TouristMarketingCompany;
use WerkraumMedia\ThueCat\Domain\Import\Model\Entity;
use WerkraumMedia\ThueCat\Domain\Import\Model\GenericEntity;
use WerkraumMedia\ThueCat\Domain\Model\Backend\ImportConfiguration;
class Organisation implements Converter
{
public function canConvert(MapsToType $entity): bool
{
return $entity instanceof TouristMarketingCompany;
}
public function convert(
MapsToType $entity,
ImportConfiguration $configuration,
string $language
): ?Entity {
if (!$entity instanceof TouristMarketingCompany) {
throw new \InvalidArgumentException('Did not get entity of expected type.', 1628243431);
}
if ($entity->hasName() === false) {
return null;
}
return new GenericEntity(
$configuration->getStoragePid(),
'tx_thuecat_organisation',
0,
$entity->getId(),
[
'title' => $entity->getName(),
'description' => $entity->getDescription(),
]
);
}
}

View file

@ -27,6 +27,10 @@ use WerkraumMedia\ThueCat\Domain\Import\Entity\MapsToType;
/**
* Central registry of all available converters.
*
* Kept for now even if only a single exists.
* Necessary to prevent cycle dependency between Importer and Typo3Converter.
* Check if we still can reduce used code.
*/
class Registry
{
@ -42,12 +46,6 @@ class Registry
public function getConverterBasedOnType(MapsToType $entity): ?Converter
{
foreach ($this->converters as $converter) {
if ($converter->canConvert($entity)) {
return $converter;
}
}
return null;
return $this->converters[0];
}
}

View file

@ -1,252 +0,0 @@
<?php
declare(strict_types=1);
/*
* Copyright (C) 2021 Daniel Siepmann <coding@daniel-siepmann.de>
*
* 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.
*/
namespace WerkraumMedia\ThueCat\Domain\Import\Typo3Converter;
use WerkraumMedia\ThueCat\Domain\Import\Entity\MapsToType;
use WerkraumMedia\ThueCat\Domain\Import\Entity\MediaObject;
use WerkraumMedia\ThueCat\Domain\Import\Entity\Properties\ForeignReference;
use WerkraumMedia\ThueCat\Domain\Import\Entity\Properties\PriceSpecification;
use WerkraumMedia\ThueCat\Domain\Import\Entity\TouristAttraction as TouristAttractionEntity;
use WerkraumMedia\ThueCat\Domain\Import\Model\Entity;
use WerkraumMedia\ThueCat\Domain\Import\Model\GenericEntity;
use WerkraumMedia\ThueCat\Domain\Import\ResolveForeignReference;
use WerkraumMedia\ThueCat\Domain\Model\Backend\ImportConfiguration;
use WerkraumMedia\ThueCat\Domain\Repository\Backend\OrganisationRepository;
use WerkraumMedia\ThueCat\Domain\Repository\Backend\TownRepository;
class TouristAttraction implements Converter
{
/**
* @var ResolveForeignReference
*/
private $resolveForeignReference;
/**
* @var LanguageHandling
*/
private $languageHandling;
/**
* @var OrganisationRepository
*/
private $organisationRepository;
/**
* @var TownRepository
*/
private $townRepository;
public function __construct(
ResolveForeignReference $resolveForeignReference,
LanguageHandling $languageHandling,
OrganisationRepository $organisationRepository,
TownRepository $townRepository
) {
$this->resolveForeignReference = $resolveForeignReference;
$this->languageHandling = $languageHandling;
$this->organisationRepository = $organisationRepository;
$this->townRepository = $townRepository;
}
public function canConvert(MapsToType $entity): bool
{
return $entity instanceof TouristAttractionEntity;
}
public function convert(
MapsToType $entity,
ImportConfiguration $configuration,
string $language
): ?Entity {
if (!$entity instanceof TouristAttractionEntity) {
throw new \InvalidArgumentException('Did not get entity of expected type.', 1628243431);
}
if ($entity->hasName() === false) {
return null;
}
$manager = null;
if ($entity->getManagedBy() instanceof ForeignReference) {
$manager = $this->organisationRepository->findOneByRemoteId(
$entity->getManagedBy()->getId()
);
}
$town = $this->townRepository->findOneByEntity($entity);
return new GenericEntity(
$configuration->getStoragePid(),
'tx_thuecat_tourist_attraction',
$this->languageHandling->getLanguageUidForString(
$configuration->getStoragePid(),
$language
),
$entity->getId(),
[
'title' => $entity->getName(),
'description' => $entity->getDescription(),
'slogan' => $entity->getSlogan(),
'start_of_construction' => $entity->getStartOfConstruction(),
'sanitation' => implode(',', $entity->getSanitations()),
'managed_by' => $manager ? $manager->getUid() : 0,
'town' => $town ? $town->getUid() : 0,
'media' => $this->getMedia($entity, $language),
'opening_hours' => $this->getOpeningHours($entity),
'address' => $this->getAddress($entity),
'offers' => $this->getOffers($entity),
'other_service' => implode(',', $entity->getOtherServices()),
'museum_service' => implode(',', $entity->getMuseumServices()),
'architectural_style' => implode(',', $entity->getArchitecturalStyles()),
'traffic_infrastructure' => implode(',', $entity->getTrafficInfrastructures()),
'payment_accepted' => implode(',', $entity->getPaymentsAccepted()),
'digital_offer' => implode(',', $entity->getDigitalOffers()),
'photography' => implode(',', $entity->getPhotographies()),
'pets_allowed' => $entity->getPetsAllowed(),
'is_accessible_for_free' => $entity->getIsAccessibleForFree(),
'public_access' => $entity->getPublicAccess(),
'available_languages' => implode(',', $entity->getAvailableLanguages()),
'distance_to_public_transport' => $entity->getDistanceToPublicTransport(),
]
);
}
private function getMedia(
TouristAttractionEntity $entity,
string $language
): string {
$data = [];
if ($entity->getPhoto() instanceof ForeignReference) {
$photo = $this->resolveForeignReference->resolve(
$entity->getPhoto(),
$language
);
if ($photo instanceof MediaObject) {
$data[] = $this->getSingleMedia($photo, true);
}
}
foreach ($entity->getImages() as $image) {
$image = $this->resolveForeignReference->resolve(
$image,
$language
);
if ($image instanceof MediaObject) {
$data[] = $this->getSingleMedia($image, false);
}
}
return json_encode($data) ?: '';
}
private function getSingleMedia(
MediaObject $mediaObject,
bool $mainImage
): array {
return [
'mainImage' => $mainImage,
'type' => $mediaObject->getType(),
'title' => $mediaObject->getName(),
'description' => $mediaObject->getDescription(),
'url' => $mediaObject->getUrl(),
'copyrightYear' => $mediaObject->getCopyrightYear(),
'license' => [
'type' => $mediaObject->getLicense(),
'author' => $mediaObject->getLicenseAuthor(),
],
];
}
private function getOpeningHours(TouristAttractionEntity $entity): string
{
$data = [];
foreach ($entity->getOpeningHoursSpecification() as $openingHour) {
$data[] = [
'opens' => $openingHour->getOpens()->format('H:i:s'),
'closes' => $openingHour->getCloses()->format('H:i:s'),
'from' => $openingHour->getValidFrom(),
'through' => $openingHour->getValidThrough(),
'daysOfWeek' => $openingHour->getDaysOfWeek(),
];
}
return json_encode($data) ?: '';
}
private function getAddress(TouristAttractionEntity $entity): string
{
$data = [];
$address = $entity->getAddress();
if ($address !== null) {
$data += [
'street' => $address->getStreetAddress(),
'zip' => $address->getPostalCode(),
'city' => $address->getAddressLocality(),
'email' => $address->getEmail(),
'phone' => $address->getTelephone(),
'fax' => $address->getFaxNumber(),
];
}
$geo = $entity->getGeo();
if ($geo !== null) {
$data += [
'geo' => [
'latitude' => $geo->getLatitude(),
'longitude' => $geo->getLongitude(),
],
];
}
return json_encode($data) ?: '';
}
private function getOffers(TouristAttractionEntity $entity): string
{
$data = [];
foreach ($entity->getOffers() as $offer) {
$data[] = [
'title' => $offer->getName(),
'description' => $offer->getDescription(),
'prices' => array_map([$this, 'getPrice'], $offer->getPrices()),
];
}
return json_encode($data) ?: '';
}
private function getPrice(PriceSpecification $priceSpecification): array
{
return [
'title' => $priceSpecification->getName(),
'description' => $priceSpecification->getDescription(),
'price' => $priceSpecification->getPrice(),
'currency' => $priceSpecification->getCurrency(),
'rule' => $priceSpecification->getCalculationRule(),
];
}
}

View file

@ -1,95 +0,0 @@
<?php
declare(strict_types=1);
/*
* Copyright (C) 2021 Daniel Siepmann <coding@daniel-siepmann.de>
*
* 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.
*/
namespace WerkraumMedia\ThueCat\Domain\Import\Typo3Converter;
use WerkraumMedia\ThueCat\Domain\Import\Entity\MapsToType;
use WerkraumMedia\ThueCat\Domain\Import\Entity\Properties\ForeignReference;
use WerkraumMedia\ThueCat\Domain\Import\Entity\TouristInformation as TouristInformationEntity;
use WerkraumMedia\ThueCat\Domain\Import\Model\Entity;
use WerkraumMedia\ThueCat\Domain\Import\Model\GenericEntity;
use WerkraumMedia\ThueCat\Domain\Model\Backend\ImportConfiguration;
use WerkraumMedia\ThueCat\Domain\Repository\Backend\OrganisationRepository;
use WerkraumMedia\ThueCat\Domain\Repository\Backend\TownRepository;
class TouristInformation implements Converter
{
/**
* @var OrganisationRepository
*/
private $organisationRepository;
/**
* @var TownRepository
*/
private $townRepository;
public function __construct(
OrganisationRepository $organisationRepository,
TownRepository $townRepository
) {
$this->organisationRepository = $organisationRepository;
$this->townRepository = $townRepository;
}
public function canConvert(MapsToType $entity): bool
{
return $entity instanceof TouristInformationEntity;
}
public function convert(
MapsToType $entity,
ImportConfiguration $configuration,
string $language
): ?Entity {
if (!$entity instanceof TouristInformationEntity) {
throw new \InvalidArgumentException('Did not get entity of expected type.', 1628243431);
}
if ($entity->hasName() === false) {
return null;
}
$manager = null;
if ($entity->getManagedBy() instanceof ForeignReference) {
$manager = $this->organisationRepository->findOneByRemoteId(
$entity->getManagedBy()->getId()
);
}
$town = $this->townRepository->findOneByEntity($entity);
return new GenericEntity(
$configuration->getStoragePid(),
'tx_thuecat_tourist_information',
0,
$entity->getId(),
[
'title' => $entity->getName(),
'description' => $entity->getDescription(),
'managed_by' => $manager ? $manager->getUid() : 0,
'town' => $town ? $town->getUid() : 0,
]
);
}
}

View file

@ -1,84 +0,0 @@
<?php
declare(strict_types=1);
/*
* Copyright (C) 2021 Daniel Siepmann <coding@daniel-siepmann.de>
*
* 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.
*/
namespace WerkraumMedia\ThueCat\Domain\Import\Typo3Converter;
use WerkraumMedia\ThueCat\Domain\Import\Entity\MapsToType;
use WerkraumMedia\ThueCat\Domain\Import\Entity\Properties\ForeignReference;
use WerkraumMedia\ThueCat\Domain\Import\Entity\Town as TownEntity;
use WerkraumMedia\ThueCat\Domain\Import\Model\Entity;
use WerkraumMedia\ThueCat\Domain\Import\Model\GenericEntity;
use WerkraumMedia\ThueCat\Domain\Model\Backend\ImportConfiguration;
use WerkraumMedia\ThueCat\Domain\Repository\Backend\OrganisationRepository;
class Town implements Converter
{
/**
* @var OrganisationRepository
*/
private $organisationRepository;
public function __construct(
OrganisationRepository $organisationRepository
) {
$this->organisationRepository = $organisationRepository;
}
public function canConvert(MapsToType $entity): bool
{
return $entity instanceof TownEntity;
}
public function convert(
MapsToType $entity,
ImportConfiguration $configuration,
string $language
): ?Entity {
if (!$entity instanceof TownEntity) {
throw new \InvalidArgumentException('Did not get entity of expected type.', 1628243431);
}
if ($entity->hasName() === false) {
return null;
}
$manager = null;
if ($entity->getManagedBy() instanceof ForeignReference) {
$manager = $this->organisationRepository->findOneByRemoteId(
$entity->getManagedBy()->getId()
);
}
return new GenericEntity(
$configuration->getStoragePid(),
'tx_thuecat_town',
0,
$entity->getId(),
[
'title' => $entity->getName(),
'description' => $entity->getDescription(),
'managed_by' => $manager ? $manager->getUid() : 0,
]
);
}
}

View file

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace WerkraumMedia\ThueCat\Domain\Import\UrlProvider;
use WerkraumMedia\ThueCat\Domain\Model\Backend\ImportConfiguration;
use WerkraumMedia\ThueCat\Domain\Import\ImportConfiguration;
/**
* Central registry of all available url provider.

View file

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace WerkraumMedia\ThueCat\Domain\Import\UrlProvider;
use WerkraumMedia\ThueCat\Domain\Model\Backend\ImportConfiguration;
use WerkraumMedia\ThueCat\Domain\Import\ImportConfiguration;
class StaticUrlProvider implements UrlProvider
{

View file

@ -23,8 +23,8 @@ declare(strict_types=1);
namespace WerkraumMedia\ThueCat\Domain\Import\UrlProvider;
use WerkraumMedia\ThueCat\Domain\Import\ImportConfiguration;
use WerkraumMedia\ThueCat\Domain\Import\Importer\FetchData;
use WerkraumMedia\ThueCat\Domain\Model\Backend\ImportConfiguration;
class SyncScopeUrlProvider implements UrlProvider
{
@ -53,6 +53,9 @@ class SyncScopeUrlProvider implements UrlProvider
public function createWithConfiguration(
ImportConfiguration $configuration
): UrlProvider {
if (method_exists($configuration, 'getSyncScopeId') === false) {
throw new \InvalidArgumentException('Received incompatible import configuration.', 1629709276);
}
$instance = clone $this;
$instance->syncScopeId = $configuration->getSyncScopeId();

View file

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace WerkraumMedia\ThueCat\Domain\Import\UrlProvider;
use WerkraumMedia\ThueCat\Domain\Model\Backend\ImportConfiguration;
use WerkraumMedia\ThueCat\Domain\Import\ImportConfiguration;
interface UrlProvider
{

View file

@ -26,8 +26,11 @@ namespace WerkraumMedia\ThueCat\Domain\Model\Backend;
use TYPO3\CMS\Core\Utility\ArrayUtility;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;
use WerkraumMedia\ThueCat\Domain\Import\Entity\Properties\ForeignReference;
use WerkraumMedia\ThueCat\Domain\Import\ImportConfiguration as ImportConfigurationInterface;
use WerkraumMedia\ThueCat\Domain\Import\ResolveForeignReference;
class ImportConfiguration extends AbstractEntity
class ImportConfiguration extends AbstractEntity implements ImportConfigurationInterface
{
/**
* @var string
@ -49,6 +52,16 @@ class ImportConfiguration extends AbstractEntity
*/
protected $tstamp = null;
/**
* @var string[]|null
*/
protected $urls = null;
/**
* @var string[]
*/
protected $allowedTypes = [];
public function getTitle(): string
{
return $this->title;
@ -89,6 +102,10 @@ class ImportConfiguration extends AbstractEntity
public function getUrls(): array
{
if ($this->urls !== null) {
return $this->urls;
}
if ($this->configuration === '') {
return [];
}
@ -102,6 +119,11 @@ class ImportConfiguration extends AbstractEntity
return array_values($entries);
}
public function getAllowedTypes(): array
{
return $this->allowedTypes;
}
public function getSyncScopeId(): string
{
if ($this->configuration === '') {
@ -139,4 +161,19 @@ class ImportConfiguration extends AbstractEntity
{
return GeneralUtility::xml2array($this->configuration);
}
/**
* @param ForeignReference[] $foreignReferences
*/
public static function createFromBaseWithForeignReferences(
self $base,
array $foreignReferences,
array $allowedTypes = []
): self {
$configuration = clone $base;
$configuration->urls = ResolveForeignReference::convertToRemoteIds($foreignReferences);
$configuration->type = 'static';
$configuration->allowedTypes = $allowedTypes;
return $configuration;
}
}

View file

@ -121,4 +121,22 @@ class ImportLog extends Typo3AbstractEntity
return $summary;
}
public function handledRemoteId(string $remoteId): bool
{
foreach ($this->logEntries as $entry) {
if ($entry->getRemoteId() === $remoteId) {
return true;
}
}
return false;
}
public function merge(self $importLog): void
{
foreach ($importLog->getEntries() as $entry) {
$this->addEntry($entry);
}
}
}

View file

@ -28,6 +28,11 @@ use WerkraumMedia\ThueCat\Domain\Import\Model\Entity;
class ImportLogEntry extends Typo3AbstractEntity
{
/**
* @var string
*/
protected $remoteId = '';
/**
* @var bool
*/
@ -62,6 +67,7 @@ class ImportLogEntry extends Typo3AbstractEntity
Entity $entity,
array $dataHandlerErrorLog
) {
$this->remoteId = $entity->getRemoteId();
$this->insertion = $entity->wasCreated();
$this->recordUid = $entity->getTypo3Uid();
$this->recordPid = $entity->getTypo3StoragePid();
@ -69,6 +75,11 @@ class ImportLogEntry extends Typo3AbstractEntity
$this->errorsAsArray = $dataHandlerErrorLog;
}
public function getRemoteId(): string
{
return $this->remoteId;
}
public function wasInsertion(): bool
{
return $this->insertion;

View file

@ -0,0 +1,28 @@
<?php
declare(strict_types=1);
/*
* Copyright (C) 2021 Daniel Siepmann <coding@daniel-siepmann.de>
*
* 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.
*/
namespace WerkraumMedia\ThueCat\Domain\Model\Backend;
class ParkingFacility extends AbstractEntity
{
}

View file

@ -0,0 +1,59 @@
<?php
declare(strict_types=1);
/*
* Copyright (C) 2021 Daniel Siepmann <coding@daniel-siepmann.de>
*
* 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.
*/
namespace WerkraumMedia\ThueCat\Domain\Model\Frontend;
use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;
abstract class Base extends AbstractEntity
{
/**
* @var string
*/
protected $title = '';
/**
* @var string
*/
protected $description = '';
/**
* @var Media|null
*/
protected $media = null;
public function getTitle(): string
{
return $this->title;
}
public function getDescription(): string
{
return $this->description;
}
public function getMedia(): ?Media
{
return $this->media;
}
}

View file

@ -0,0 +1,28 @@
<?php
declare(strict_types=1);
/*
* Copyright (C) 2021 Daniel Siepmann <coding@daniel-siepmann.de>
*
* 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.
*/
namespace WerkraumMedia\ThueCat\Domain\Model\Frontend;
class ParkingFacility extends Place
{
}

View file

@ -0,0 +1,122 @@
<?php
declare(strict_types=1);
/*
* Copyright (C) 2021 Daniel Siepmann <coding@daniel-siepmann.de>
*
* 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.
*/
namespace WerkraumMedia\ThueCat\Domain\Model\Frontend;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Persistence\ObjectStorage;
abstract class Place extends Base
{
/**
* @var Address|null
*/
protected $address = null;
/**
* @var OpeningHours|null
*/
protected $openingHours = null;
/**
* @var ObjectStorage<ParkingFacility>
*/
protected $parkingFacilityNearBy;
/**
* @var string
*/
protected $sanitation = '';
/**
* @var string
*/
protected $otherService = '';
/**
* @var string
*/
protected $trafficInfrastructure = '';
/**
* @var string
*/
protected $paymentAccepted = '';
/**
* @var string
*/
protected $distanceToPublicTransport = '';
public function initializeObject(): void
{
$this->parkingFacilityNearBy = new ObjectStorage();
}
public function getAddress(): ?Address
{
return $this->address;
}
public function getOpeningHours(): ?OpeningHours
{
return $this->openingHours;
}
public function getParkingFacilitiesNearBy(): ObjectStorage
{
return $this->parkingFacilityNearBy;
}
public function getSanitation(): array
{
return GeneralUtility::trimExplode(',', $this->sanitation, true);
}
public function getOtherServices(): array
{
return GeneralUtility::trimExplode(',', $this->otherService, true);
}
public function getTrafficInfrastructures(): array
{
return GeneralUtility::trimExplode(',', $this->trafficInfrastructure, true);
}
public function getPaymentAccepted(): array
{
return GeneralUtility::trimExplode(',', $this->paymentAccepted, true);
}
public function getDistanceToPublicTransport(): array
{
$values = GeneralUtility::trimExplode(':', $this->distanceToPublicTransport, true, 2);
if ($values === []) {
return [];
}
return [
'value' => $values[0] ?? '',
'unit' => $values[1] ?? '',
];
}
}

View file

@ -24,65 +24,29 @@ declare(strict_types=1);
namespace WerkraumMedia\ThueCat\Domain\Model\Frontend;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;
class TouristAttraction extends AbstractEntity
class TouristAttraction extends Place
{
/**
* @var string
*/
protected $title = '';
/**
* @var string
*/
protected $description = '';
/**
* @var string
*/
protected $slogan = '';
/**
* @var OpeningHours|null
*/
protected $openingHours = null;
/**
* @var Offers|null
*/
protected $offers = null;
/**
* @var Address|null
*/
protected $address = null;
/**
* @var Town|null
*/
protected $town = null;
/**
* @var Media|null
*/
protected $media = null;
/**
* @var string
*/
protected $startOfConstruction = '';
/**
* @var string
*/
protected $sanitation = '';
/**
* @var string
*/
protected $otherService = '';
/**
* @var string
*/
@ -93,16 +57,6 @@ class TouristAttraction extends AbstractEntity
*/
protected $architecturalStyle = '';
/**
* @var string
*/
protected $trafficInfrastructure = '';
/**
* @var string
*/
protected $paymentAccepted = '';
/**
* @var string
*/
@ -128,66 +82,26 @@ class TouristAttraction extends AbstractEntity
*/
protected $publicAccess = '';
/**
* @var string
*/
protected $distanceToPublicTransport = '';
public function getTitle(): string
{
return $this->title;
}
public function getDescription(): string
{
return $this->description;
}
public function getSlogan(): string
{
return $this->slogan;
}
public function getOpeningHours(): ?OpeningHours
{
return $this->openingHours;
}
public function getOffers(): ?Offers
{
return $this->offers;
}
public function getAddress(): ?Address
{
return $this->address;
}
public function getTown(): ?Town
{
return $this->town;
}
public function getMedia(): ?Media
{
return $this->media;
}
public function getStartOfConstruction(): string
{
return $this->startOfConstruction;
}
public function getSanitation(): array
{
return GeneralUtility::trimExplode(',', $this->sanitation, true);
}
public function getOtherServices(): array
{
return GeneralUtility::trimExplode(',', $this->otherService, true);
}
public function getMuseumServices(): array
{
return GeneralUtility::trimExplode(',', $this->museumService, true);
@ -198,16 +112,6 @@ class TouristAttraction extends AbstractEntity
return GeneralUtility::trimExplode(',', $this->architecturalStyle, true);
}
public function getTrafficInfrastructures(): array
{
return GeneralUtility::trimExplode(',', $this->trafficInfrastructure, true);
}
public function getPaymentAccepted(): array
{
return GeneralUtility::trimExplode(',', $this->paymentAccepted, true);
}
public function getDigitalOffer(): array
{
return GeneralUtility::trimExplode(',', $this->digitalOffer, true);
@ -232,16 +136,4 @@ class TouristAttraction extends AbstractEntity
{
return $this->publicAccess;
}
public function getDistanceToPublicTransport(): array
{
$values = GeneralUtility::trimExplode(':', $this->distanceToPublicTransport, true, 2);
if ($values === []) {
return [];
}
return [
'value' => $values[0] ?? '',
'unit' => $values[1] ?? '',
];
}
}

View file

@ -23,27 +23,6 @@ declare(strict_types=1);
namespace WerkraumMedia\ThueCat\Domain\Model\Frontend;
use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;
class Town extends AbstractEntity
class Town extends Base
{
/**
* @var string
*/
protected $title = '';
/**
* @var string
*/
protected $description = '';
public function getTitle(): string
{
return $this->title;
}
public function getDescription(): string
{
return $this->description;
}
}

View file

@ -0,0 +1,65 @@
<?php
declare(strict_types=1);
/*
* Copyright (C) 2021 Daniel Siepmann <coding@daniel-siepmann.de>
*
* 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.
*/
namespace WerkraumMedia\ThueCat\Domain\Repository\Backend;
use TYPO3\CMS\Extbase\Object\ObjectManagerInterface;
use TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings;
use TYPO3\CMS\Extbase\Persistence\QueryResultInterface;
use TYPO3\CMS\Extbase\Persistence\Repository;
use WerkraumMedia\ThueCat\Domain\Import\Entity\Properties\ForeignReference;
class ParkingFacilityRepository extends Repository
{
public function __construct(
ObjectManagerInterface $objectManager,
Typo3QuerySettings $querySettings
) {
parent::__construct($objectManager);
$querySettings->setRespectStoragePage(false);
$this->setDefaultQuerySettings($querySettings);
}
public function findByEntity(object $entity): ?QueryResultInterface
{
if (method_exists($entity, 'getParkingFacilitiesNearBy') === false) {
return null;
}
$remoteIds = array_map(function (ForeignReference $reference) {
return $reference->getId();
}, $entity->getParkingFacilitiesNearBy());
if ($remoteIds === []) {
return null;
}
$query = $this->createQuery();
$query->in('remoteId', $remoteIds);
return $query->execute();
}
}

View file

@ -26,7 +26,7 @@ namespace WerkraumMedia\ThueCat\Domain\Repository\Backend;
use TYPO3\CMS\Extbase\Object\ObjectManagerInterface;
use TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings;
use TYPO3\CMS\Extbase\Persistence\Repository;
use WerkraumMedia\ThueCat\Domain\Import\Entity\Properties\ForeignReference;
use WerkraumMedia\ThueCat\Domain\Import\ResolveForeignReference;
use WerkraumMedia\ThueCat\Domain\Model\Backend\Town;
class TownRepository extends Repository
@ -48,9 +48,7 @@ class TownRepository extends Repository
return null;
}
$remoteIds = array_map(function (ForeignReference $reference) {
return $reference->getId();
}, $entity->getContainedInPlaces());
$remoteIds = ResolveForeignReference::convertToRemoteIds($entity->getContainedInPlaces());
if ($remoteIds === []) {
return null;

View file

@ -1,5 +1,6 @@
<?php
return [
\WerkraumMedia\ThueCat\Domain\Model\Backend\Organisation::class => [
'tableName' => 'tx_thuecat_organisation',
@ -10,6 +11,9 @@ return [
\WerkraumMedia\ThueCat\Domain\Model\Backend\TouristInformation::class => [
'tableName' => 'tx_thuecat_tourist_information',
],
WerkraumMedia\ThueCat\Domain\Model\Backend\ParkingFacility::class => [
'tableName' => 'tx_thuecat_parking_facility',
],
\WerkraumMedia\ThueCat\Domain\Model\Backend\ImportConfiguration::class => [
'tableName' => 'tx_thuecat_import_configuration',
],
@ -25,4 +29,7 @@ return [
\WerkraumMedia\ThueCat\Domain\Model\Frontend\Town::class => [
'tableName' => 'tx_thuecat_town',
],
WerkraumMedia\ThueCat\Domain\Model\Frontend\ParkingFacility::class => [
'tableName' => 'tx_thuecat_parking_facility',
],
];

View file

@ -0,0 +1,207 @@
<?php
defined('TYPO3') or die();
return (static function (string $extensionKey, string $tableName) {
$languagePath = \WerkraumMedia\ThueCat\Extension::getLanguagePath() . 'locallang_tca.xlf:' . $tableName;
return [
'ctrl' => [
'label' => 'title',
'iconfile' => \WerkraumMedia\ThueCat\Extension::getIconPath() . $tableName . '.svg',
'default_sortby' => 'title',
'tstamp' => 'tstamp',
'crdate' => 'crdate',
'cruser_id' => 'cruser_id',
'title' => $languagePath,
'enablecolumns' => [
'disabled' => 'disable',
],
'searchFields' => 'title, description',
'transOrigPointerField' => 'l18n_parent',
'transOrigDiffSourceField' => 'l18n_diffsource',
'languageField' => 'sys_language_uid',
'translationSource' => 'l10n_source',
],
'columns' => [
'sys_language_uid' => [
'exclude' => true,
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.language',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'special' => 'languages',
'items' => [
[
'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.allLanguages',
-1,
'flags-multiple',
],
],
'default' => 0,
],
],
'l18n_parent' => [
'displayCond' => 'FIELD:sys_language_uid:>:0',
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.l18n_parent',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'items' => [['', 0]],
'foreign_table' => $tableName,
'foreign_table_where' => 'AND ' . $tableName . '.pid=###CURRENT_PID### AND ' . $tableName . '.sys_language_uid IN (-1,0)',
'default' => 0,
],
],
'l10n_source' => [
'config' => [
'type' => 'passthrough',
],
],
'title' => [
'label' => $languagePath . '.title',
'l10n_mode' => 'prefixLangTitle',
'config' => [
'type' => 'input',
'size' => 20,
'max' => 255,
'readOnly' => true,
],
],
'description' => [
'label' => $languagePath . '.description',
'l10n_mode' => 'prefixLangTitle',
'config' => [
'type' => 'text',
'readOnly' => true,
],
],
'sanitation' => [
'label' => $languagePath . '.sanitation',
'l10n_mode' => 'prefixLangTitle',
'config' => [
'type' => 'input',
'readOnly' => true,
],
],
'other_service' => [
'label' => $languagePath . '.other_service',
'l10n_mode' => 'prefixLangTitle',
'config' => [
'type' => 'input',
'readOnly' => true,
],
],
'traffic_infrastructure' => [
'label' => $languagePath . '.traffic_infrastructure',
'l10n_mode' => 'prefixLangTitle',
'config' => [
'type' => 'input',
'readOnly' => true,
],
],
'payment_accepted' => [
'label' => $languagePath . '.payment_accepted',
'l10n_mode' => 'prefixLangTitle',
'config' => [
'type' => 'input',
'readOnly' => true,
],
],
'distance_to_public_transport' => [
'label' => $languagePath . '.distance_to_public_transport',
'l10n_mode' => 'prefixLangTitle',
'config' => [
'type' => 'input',
'readOnly' => true,
],
],
'opening_hours' => [
'label' => $languagePath . '.opening_hours',
'l10n_mode' => 'exclude',
'config' => [
'type' => 'text',
'readOnly' => true,
],
],
'address' => [
'label' => $languagePath . '.address',
'l10n_mode' => 'exclude',
'config' => [
'type' => 'text',
'readOnly' => true,
],
],
'media' => [
'label' => $languagePath . '.media',
'l10n_mode' => 'exclude',
'config' => [
'type' => 'text',
'readOnly' => true,
],
],
'offers' => [
'label' => $languagePath . '.offers',
'l10n_mode' => 'exclude',
'config' => [
'type' => 'text',
'readOnly' => true,
],
],
'remote_id' => [
'label' => $languagePath . '.remote_id',
'l10n_mode' => 'exclude',
'config' => [
'type' => 'input',
'readOnly' => true,
],
],
'town' => [
'label' => $languagePath . '.town',
'l10n_mode' => 'exclude',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'foreign_table' => 'tx_thuecat_town',
'default' => '0',
'items' => [
[
$languagePath . '.town.unkown',
0,
],
],
'readOnly' => true,
],
],
'managed_by' => [
'label' => $languagePath . '.managed_by',
'l10n_mode' => 'exclude',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'foreign_table' => 'tx_thuecat_organisation',
'default' => '0',
'items' => [
[
$languagePath . '.managed_by.unkown',
0,
],
],
'readOnly' => true,
],
],
],
'palettes' => [
'language' => [
'label' => $languagePath . '.palette.language',
'showitem' => 'sys_language_uid,l18n_parent',
],
],
'types' => [
'0' => [
'showitem' => '--palette--;;language, title, description, sanitation, other_service, traffic_infrastructure, payment_accepted, distance_to_public_transport, opening_hours, offers, address, media, remote_id, --div--;' . $languagePath . '.tab.relations, town, managed_by',
],
],
];
})(\WerkraumMedia\ThueCat\Extension::EXTENSION_KEY, 'tx_thuecat_parking_facility');

View file

@ -271,6 +271,22 @@ return (static function (string $extensionKey, string $tableName) {
'readOnly' => true,
],
],
'parking_facility_near_by' => [
'label' => $languagePath . '.parking_facility_near_by',
'l10n_mode' => 'exclude',
'config' => [
'type' => 'group',
'internal_type' => 'db',
'allowed' => 'tx_thuecat_parking_facility',
'foreign_table' => 'tx_thuecat_parking_facility',
'suggestOptions' => [
'tx_thuecat_parking_facility' => [
'searchCondition' => 'sys_language_uid IN (0,-1)'
],
],
'readOnly' => true,
],
],
],
'palettes' => [
'language' => [
@ -280,7 +296,7 @@ return (static function (string $extensionKey, string $tableName) {
],
'types' => [
'0' => [
'showitem' => '--palette--;;language, title, description, slogan, start_of_construction, sanitation, other_service, museum_service, architectural_style, traffic_infrastructure, payment_accepted, digital_offer, photography, pets_allowed, is_accessible_for_free, public_access, available_languages, distance_to_public_transport, opening_hours, offers, address, media, remote_id, --div--;' . $languagePath . '.tab.relations, town, managed_by',
'showitem' => '--palette--;;language, title, description, slogan, start_of_construction, sanitation, other_service, museum_service, architectural_style, traffic_infrastructure, payment_accepted, digital_offer, photography, pets_allowed, is_accessible_for_free, public_access, available_languages, distance_to_public_transport, opening_hours, offers, address, media, remote_id, --div--;' . $languagePath . '.tab.relations, town, managed_by, parking_facility_near_by',
],
],
];

View file

@ -15,6 +15,38 @@
<source>per person</source>
<target>pro Person</target>
</trans-unit>
<trans-unit id="content.price.rule.PerBike" xml:space="preserve">
<source>per bike</source>
<target>pro Krad</target>
</trans-unit>
<trans-unit id="content.price.rule.PerBus" xml:space="preserve">
<source>per bus</source>
<target>pro Bus</target>
</trans-unit>
<trans-unit id="content.price.rule.PerCar" xml:space="preserve">
<source>per car</source>
<target>pro PKW</target>
</trans-unit>
<trans-unit id="content.price.rule.PerCarOrBike" xml:space="preserve">
<source>per car or bike</source>
<target>pro PKW/Krad</target>
</trans-unit>
<trans-unit id="content.price.rule.PerHour" xml:space="preserve">
<source>per hour</source>
<target>pro Stunde</target>
</trans-unit>
<trans-unit id="content.price.rule.PerPersonAndNight" xml:space="preserve">
<source>per person and night</source>
<target>pro Person und Nacht</target>
</trans-unit>
<trans-unit id="content.price.rule.PerPiece" xml:space="preserve">
<source>per piece</source>
<target>pro Stück</target>
</trans-unit>
<trans-unit id="content.price.rule.PerUnitAndNight" xml:space="preserve">
<source>per unit and night</source>
<target>pro Einheit und Nacht</target>
</trans-unit>
<trans-unit id="content.sanitation.Toilets" xml:space="preserve">
<source>Toilets</source>
<target>Toilette</target>
@ -370,11 +402,59 @@
<source>Distance to Public Transport</source>
<target>Entfernung zum ÖPNV:</target>
</trans-unit>
<trans-unit id="content.parkingFacilitiesNearBy">
<source>Parking Facilities near by</source>
<target>Parkhäuser in der Nähe</target>
</trans-unit>
<trans-unit id="content.unit.ANN">
<source>Years</source>
<target>Jahre</target>
</trans-unit>
<trans-unit id="content.unit.CEL">
<source>Celsius</source>
<target>Grad Celsius</target>
</trans-unit>
<trans-unit id="content.unit.CMT">
<source>Centimeter</source>
<target>Zentimeter</target>
</trans-unit>
<trans-unit id="content.unit.HAR">
<source>Hectare</source>
<target>Hektar</target>
</trans-unit>
<trans-unit id="content.unit.HUR">
<source>Hours</source>
<target>Stunden</target>
</trans-unit>
<trans-unit id="content.unit.KTM">
<source>Kilometer</source>
<target>Kilometer</target>
</trans-unit>
<trans-unit id="content.unit.MIN">
<source>Minutes</source>
<target>Minuten</target>
</trans-unit>
<trans-unit id="content.unit.MTK">
<source>Square Metres</source>
<target>Quadratmeter</target>
</trans-unit>
<trans-unit id="content.unit.MTR">
<source>Meters</source>
<target>Meter</target>
</trans-unit>
<trans-unit id="content.unit.P1">
<source>Percent</source>
<target>Prozent</target>
</trans-unit>
<trans-unit id="content.unit.PIX">
<source>Pixel</source>
<target>Pixel</target>
</trans-unit>
<trans-unit id="content.unit.SEC">
<source>Seconds</source>
<target>Sekunden</target>
</trans-unit>
</body>
</file>
</xliff>

View file

@ -96,6 +96,9 @@
<trans-unit id="module.imports.summary.tableName.tx_thuecat_tourist_attraction" xml:space="preserve">
<source>Tourist Attraction</source>
</trans-unit>
<trans-unit id="module.imports.summary.tableName.tx_thuecat_parking_facility" xml:space="preserve">
<source>Parking Facility</source>
</trans-unit>
<trans-unit id="controller.backend.import.import.success.title" xml:space="preserve">
<source>Import finished</source>
@ -384,6 +387,50 @@
<trans-unit id="content.availableLanguage.French">
<source>French</source>
</trans-unit>
<trans-unit id="content.distanceToPublicTransport">
<source>Distance to Public Transport</source>
</trans-unit>
<trans-unit id="content.parkingFacilitiesNearBy">
<source>Parking Facilities near by</source>
</trans-unit>
<trans-unit id="content.unit.ANN">
<source>Years</source>
</trans-unit>
<trans-unit id="content.unit.CEL">
<source>Celsius</source>
</trans-unit>
<trans-unit id="content.unit.CMT">
<source>Centimeter</source>
</trans-unit>
<trans-unit id="content.unit.HAR">
<source>Hectare</source>
</trans-unit>
<trans-unit id="content.unit.HUR">
<source>Hours</source>
</trans-unit>
<trans-unit id="content.unit.KTM">
<source>Kilometer</source>
</trans-unit>
<trans-unit id="content.unit.MIN">
<source>Minutes</source>
</trans-unit>
<trans-unit id="content.unit.MTK">
<source>Square Metres</source>
</trans-unit>
<trans-unit id="content.unit.MTR">
<source>Meters</source>
</trans-unit>
<trans-unit id="content.unit.P1">
<source>Percent</source>
</trans-unit>
<trans-unit id="content.unit.PIX">
<source>Pixel</source>
</trans-unit>
<trans-unit id="content.unit.SEC">
<source>Seconds</source>
</trans-unit>
</body>
</file>
</xliff>

View file

@ -163,6 +163,58 @@
<source>Unkown</source>
</trans-unit>
<trans-unit id="tx_thuecat_parking_facility" xml:space="preserve">
<source>Parking Facility</source>
</trans-unit>
<trans-unit id="tx_thuecat_parking_facility.title" xml:space="preserve">
<source>Title</source>
</trans-unit>
<trans-unit id="tx_thuecat_parking_facility.description" xml:space="preserve">
<source>Description</source>
</trans-unit>
<trans-unit id="tx_thuecat_parking_facility.sanitation" xml:space="preserve">
<source>Sanitation</source>
</trans-unit>
<trans-unit id="tx_thuecat_parking_facility.other_service" xml:space="preserve">
<source>Other Service</source>
</trans-unit>
<trans-unit id="tx_thuecat_parking_facility.traffic_infrastructure" xml:space="preserve">
<source>Traffic Infrastructure</source>
</trans-unit>
<trans-unit id="tx_thuecat_parking_facility.payment_accepted" xml:space="preserve">
<source>Payment Accepted</source>
</trans-unit>
<trans-unit id="tx_thuecat_parking_facility.distance_to_public_transport" xml:space="preserve">
<source>Distance to Public Transport</source>
</trans-unit>
<trans-unit id="tx_thuecat_parking_facility.opening_hours" xml:space="preserve">
<source>Opening Hours</source>
</trans-unit>
<trans-unit id="tx_thuecat_parking_facility.address" xml:space="preserve">
<source>Address</source>
</trans-unit>
<trans-unit id="tx_thuecat_parking_facility.media" xml:space="preserve">
<source>Media</source>
</trans-unit>
<trans-unit id="tx_thuecat_parking_facility.offers" xml:space="preserve">
<source>Offers</source>
</trans-unit>
<trans-unit id="tx_thuecat_parking_facility.remote_id" xml:space="preserve">
<source>Remote ID</source>
</trans-unit>
<trans-unit id="tx_thuecat_parking_facility.town" xml:space="preserve">
<source>Town</source>
</trans-unit>
<trans-unit id="tx_thuecat_parking_facility.managed_by" xml:space="preserve">
<source>Managed by</source>
</trans-unit>
<trans-unit id="tx_thuecat_parking_facility.palette.language" xml:space="preserve">
<source>Language</source>
</trans-unit>
<trans-unit id="tx_thuecat_parking_facility.tab.relations" xml:space="preserve">
<source>Relations</source>
</trans-unit>
<trans-unit id="tx_thuecat_import_configuration" xml:space="preserve">
<source>Import Configuration</source>
</trans-unit>

View file

@ -20,13 +20,7 @@
</f:for>
<f:if condition="{entity.address}">
<p>
{entity.address.street}<br>
{entity.address.zip} {entity.address.city}<br>
{entity.address.email}<br>
{entity.address.phone}<br>
{entity.address.fax}
</p>
{f:render(section: 'Address', arguments: {address: entity.address})}
</f:if>
<f:if condition="{entity.offers}">
@ -91,5 +85,23 @@
<f:if condition="{entity.distanceToPublicTransport}">
{f:translate(id: 'content.distanceToPublicTransport', extensionName: 'thuecat')} {entity.distanceToPublicTransport.value} {f:translate(id: 'content.unit.{entity.distanceToPublicTransport.unit}', default: entity.distanceToPublicTransport.unit, extensionName: 'thuecat')}
</f:if>
<f:if condition="{entity.parkingFacilitiesNearBy}">
{f:translate(id: 'content.parkingFacilitiesNearBy', extensionName: 'Thuecat')}
<f:for each="{entity.parkingFacilitiesNearBy}" as="parkingFacility">
{parkingFacility.title}
{f:render(section: 'Address', arguments: {address: parkingFacility.address})}
</f:for>
</f:if>
</f:for>
<f:section name="Address">
<p>
{address.street}<br>
{address.zip} {address.city}<br>
{address.email}<br>
{address.phone}<br>
{address.fax}
</p>
</f:section>
</html>

View file

@ -0,0 +1 @@
<svg id="Ebene_1" data-name="Ebene 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><polygon points="11.535 15.154 4.516 15.154 4.516 2.858 11.535 0.809 11.535 15.154" fill="#fff" stroke="#b9b9b9" stroke-miterlimit="10" stroke-width="0.5"/><path d="M11.728,15.34707H4.32273V2.71276L11.728.55049Zm-7.01839-.38688h6.6315V1.06659L4.70962,3.00292Z" fill="#b9b9b9" stroke="#b9b9b9" stroke-miterlimit="10" stroke-width="0.5"/><rect x="6.09855" y="4.33894" width="1.21507" height="1.21507" fill="#b9b9b9"/><rect x="8.73725" y="4.33894" width="1.21507" height="1.21507" fill="#b9b9b9"/><rect x="6.09855" y="6.52425" width="1.21507" height="1.21507" fill="#b9b9b9"/><rect x="8.73725" y="6.52425" width="1.21507" height="1.21507" fill="#b9b9b9"/><rect x="6.09855" y="8.70956" width="1.21507" height="1.21507" fill="#b9b9b9"/><rect x="8.73725" y="8.70956" width="1.21507" height="1.21507" fill="#b9b9b9"/><rect x="6.09855" y="10.89487" width="1.21507" height="1.21507" fill="#b9b9b9"/><rect x="8.73725" y="10.89487" width="1.21507" height="1.21507" fill="#b9b9b9"/><rect x="7.02452" y="13.15182" width="2.00183" height="2.00183" fill="#b9b9b9"/><rect x="13.49923" y="11.49938" width="0.38689" height="3.86284" fill="#b9b9b9" stroke="#b9b9b9" stroke-miterlimit="10" stroke-width="0.5"/><circle cx="13.69273" cy="10.17712" r="1.45083" fill="#79a547"/><path d="M13.69267,11.82144A1.64428,1.64428,0,1,1,15.337,10.17717,1.64623,1.64623,0,0,1,13.69267,11.82144Zm0-2.90166a1.25739,1.25739,0,1,0,1.25739,1.25739A1.25884,1.25884,0,0,0,13.69267,8.91978Z" fill="#79a547"/><circle cx="13.69273" cy="7.49449" r="1.13508" fill="#79a547"/><path d="M13.69267,8.82306a1.32851,1.32851,0,1,1,1.32861-1.32861A1.33007,1.33007,0,0,1,13.69267,8.82306Zm0-2.27014a.94163.94163,0,1,0,.94172.94153A.94264.94264,0,0,0,13.69267,6.55292Z" fill="#79a547"/><rect x="1.84895" y="11.49938" width="0.38689" height="3.86284" fill="#b9b9b9" stroke="#b9b9b9" stroke-miterlimit="10" stroke-width="0.5"/><circle cx="2.04239" cy="10.04855" r="1.45083" fill="#79a547"/><path d="M2.04239,11.69279a1.64428,1.64428,0,1,1,1.64428-1.64427A1.64623,1.64623,0,0,1,2.04239,11.69279Zm0-2.90166a1.25739,1.25739,0,1,0,1.25739,1.25739A1.25884,1.25884,0,0,0,2.04239,8.79113Z" fill="#79a547"/></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View file

@ -1,4 +1,4 @@
base: '/'
base: /
languages:
-
title: Deutsch

View file

@ -23,6 +23,7 @@
<pets_allowed>Tiere sind im Gebäude nicht gestattet, ausgenommen sind Blinden- und Blindenbegleithunde.</pets_allowed>
<available_languages>German,English,French</available_languages>
<distance_to_public_transport>250:MTR</distance_to_public_transport>
<parking_facility_near_by>1,2</parking_facility_near_by>
</tx_thuecat_tourist_attraction>
<tx_thuecat_town>
<uid>1</uid>
@ -30,5 +31,17 @@
<title>Beispielstadt</title>
<description>Die Beschreibung der Stadt</description>
</tx_thuecat_town>
<tx_thuecat_parking_facility>
<uid>1</uid>
<pid>3</pid>
<title>Parkhaus Domplatz</title>
<address>{"street":"Bechtheimer Str. 1","zip":"99084","city":"Erfurt","email":"info@stadtwerke-erfurt.de","phone":"+49 361 5640","fax":"","geo":{"latitude":50.977648905044,"longitude":11.022127985954299}}</address>
</tx_thuecat_parking_facility>
<tx_thuecat_parking_facility>
<uid>2</uid>
<pid>3</pid>
<title>Q-Park Anger 1 Parkhaus</title>
<address>{"street":"Anger 1","zip":"99084","city":"Erfurt","email":"servicecenter@q-park.de","phone":"+49 218 18190290","fax":"","geo":{"latitude":50.977999330565794,"longitude":11.037503264052475}}</address>
</tx_thuecat_parking_facility>
</dataset>

View file

@ -0,0 +1,19 @@
HTTP/1.1 200 OK
Date: Mon, 09 Aug 2021 06:28:07 GMT
Content-Type: application/ld+json; charset=utf-8
Content-Length: 30967
Connection: keep-alive
Set-Cookie: ahSession=ce38109539e852ab96dd57bc3c1a153b30a79a54;path=/;expires=Thu, 09 Sep 2021 06:28:07 GMT;httpOnly=true;
Access-Control-Allow-Methods: HEAD, GET, POST, DELETE, OPTIONS
Access-Control-Allow-Headers: Authorization, Content-Type
Strict-Transport-Security: max-age=15724800; includeSubDomains
Access-Control-Allow-Credentials: true
X-Frame-Options: deny
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin
Feature-Policy: microphone 'none'; camera 'none'; payment 'none'
Content-Security-Policy: default-src 'self'; script-src 'self' 'sha256-xfTbtWk8kVI65iLJs8LB3lWf2g0g10DS71pDdoutFHc=' 'sha256-tuKkEf3LPSeyF8feKxOP/mEsa6nRR8toFxvAwO9cuhE='; style-src 'self' 'unsafe-inline' https://stackpath.bootstrapcdn.com; img-src 'self' data: blob: *
Access-Control-Allow-Origin: https://cdb.thuecat.org
{"@context":{"schema":"http://schema.org/","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#","sh":"http://www.w3.org/ns/shacl#","xsd":"http://www.w3.org/2001/XMLSchema#","ttgds":"https://thuecat.org/ontology/ttgds/1.0/","cdb":"https://thuecat.org/ontology/cdb/1.0/","dachkg":"https://thuecat.org/ontology/dachkg/1.0/","thuecat":"https://thuecat.org/ontology/thuecat/1.0/","epapp":"https://thuecat.org/ontology/epapp/1.0/"},"@graph":[{"@id":"https://thuecat.org/resources/052821473718-oxfq","@type":["schema:Place","schema:Organization","schema:LocalBusiness","schema:Thing","schema:TouristAttraction","ttgds:OtherInfraStructure","thuecat:OtherPOI","thuecat:StrollingMile"],"schema:description":[{"@language":"de","@value":"Der Wenigemarkt befindet sich am östlichen Zugang der Krämerbrücke. Hier finden Sie eine Vielzahl Cafés und Restaurants, die zum Verbleiben und Entspannen einladen."},{"@language":"fr","@value":"Le Wenigemarkt est situé à l'entrée orientale du Krämerbrücke. Vous y trouverez une variété de cafés et de restaurants qui vous invitent à rester et à vous détendre."},{"@language":"en","@value":"The Wenigemarkt is located at the eastern entrance of the Krämerbrücke. Here you will find a variety of cafes and restaurants that invite you to stay and relax."},{"@id":"genid-0f944fd40aa04d3d85374be0fe18c485-b1","@type":["schema:Intangible","schema:Thing","schema:ComputerLanguage","thuecat:Html"],"schema:value":{"@language":"de","@value":"<p>Der Wenigemarkt befindet sich am östlichen Zugang der Krämerbrücke. Hier finden Sie eine Vielzahl Cafés und Restaurants, die zum Verbleiben und Entspannen einladen.</p>"}},{"@id":"genid-0f944fd40aa04d3d85374be0fe18c485-b2","@type":["schema:Intangible","schema:Thing","schema:ComputerLanguage","thuecat:Html"],"schema:value":{"@language":"en","@value":"<p>The Wenigemarkt is located at the eastern entrance of the Krämerbrücke. Here you will find a variety of cafes and restaurants that invite you to stay and relax.</p>"}},{"@id":"genid-0f944fd40aa04d3d85374be0fe18c485-b3","@type":["schema:Intangible","schema:Thing","schema:ComputerLanguage","thuecat:Html"],"schema:value":{"@language":"fr","@value":"<p>Le Wenigemarkt est situé à l'entrée orientale du Krämerbrücke. Vous y trouverez une variété de cafés et de restaurants qui vous invitent à rester et à vous détendre.</p>"}}],"schema:name":{"@language":"de","@value":"Wenigemarkt Erfurt"},"schema:containedInPlace":{"@id":"https://thuecat.org/resources/043064193523-jcyt"},"schema:containsPlace":[{"@id":"https://thuecat.org/resources/215230952334-yyno"},{"@id":"https://thuecat.org/resources/r_16573254-oapoi"},{"@id":"https://thuecat.org/resources/455305021239-hmfe"}],"schema:photo":{"@id":"https://thuecat.org/resources/dms_5143698"},"schema:image":{"@id":"https://thuecat.org/resources/dms_5143698"},"schema:petsAllowed":{"@type":"schema:Boolean","@value":"true"},"schema:hasMap":{"@type":"schema:URL","@value":"https://www.google.de/maps/@50.9785793,11.0319168,21z"},"schema:geo":{"@id":"genid-0f944fd40aa04d3d85374be0fe18c485-b4","@type":["schema:Intangible","schema:StructuredValue","schema:Thing","schema:GeoCoordinates"],"schema:longitude":{"@type":"schema:Number","@value":"11.031994832523964"},"schema:latitude":{"@type":"schema:Number","@value":"50.97859562923252"}},"schema:smokingAllowed":{"@type":"schema:Boolean","@value":"true"},"schema:address":{"@id":"genid-0f944fd40aa04d3d85374be0fe18c485-b0","@type":["schema:Intangible","schema:PostalAddress","schema:StructuredValue","schema:Thing","schema:ContactPoint"],"schema:addressLocality":{"@language":"de","@value":"Erfurt"},"schema:addressCountry":{"@type":"thuecat:AddressCountry","@value":"thuecat:Germany"},"schema:postalCode":{"@language":"de","@value":"99084"},"schema:addressRegion":{"@type":"thuecat:AddressFederalState","@value":"thuecat:Thuringia"},"schema:streetAddress":{"@language":"de","@value":"Wenigermarkt"},"thuecat:typOfAddress":{"@type":"thuecat:TypOfAddress","@value":"thuecat:HouseAddress"}},"thuecat:contentResponsible":{"@id":"https://thuecat.org/resources/018132452787-ngbe"},"thuecat:gastro":[{"@type":"thuecat:GastroPoi","@value":"thuecat:TakeawayShop"},{"@type":"thuecat:GastroPoi","@value":"thuecat:Cafe"},{"@type":"thuecat:GastroPoi","@value":"thuecat:BarEnumMem"},{"@type":"thuecat:GastroPoi","@value":"thuecat:Restaurant"}],"thuecat:sanitation":{"@type":"thuecat:Sanitation","@value":"thuecat:ZeroSanitation"}}]}

View file

@ -0,0 +1,19 @@
HTTP/1.1 200 OK
Date: Wed, 17 Feb 2021 08:04:06 GMT
Content-Type: application/ld+json; charset=utf-8
Content-Length: 11716
Connection: keep-alive
Set-Cookie: ahSession=06f1bc392b6485385a5ad291337e404c45d21e40;path=/;expires=Sat, 20 Mar 2021 08:04:05 GMT;httpOnly=true;
Access-Control-Allow-Methods: HEAD, GET, POST, DELETE, OPTIONS
Access-Control-Allow-Headers: Authorization, Content-Type
Strict-Transport-Security: max-age=15724800; includeSubDomains
Access-Control-Allow-Credentials: true
X-Frame-Options: deny
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin
Feature-Policy: microphone 'none'; camera 'none'; payment 'none'
Content-Security-Policy: default-src 'self'; script-src 'self' 'sha256-xfTbtWk8kVI65iLJs8LB3lWf2g0g10DS71pDdoutFHc='; style-src 'self' 'unsafe-inline' https://stackpath.bootstrapcdn.com; img-src 'self' data: blob: *
Access-Control-Allow-Origin: https://cdb.thuecat.org
{"@context":{"schema":"http://schema.org/","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#","sh":"http://www.w3.org/ns/shacl#","xsd":"http://www.w3.org/2001/XMLSchema#","ttgds":"https://thuecat.org/ontology/ttgds/1.0/","cdb":"https://thuecat.org/ontology/cdb/1.0/","dachkg":"https://thuecat.org/ontology/dachkg/1.0/","thuecat":"https://thuecat.org/ontology/thuecat/1.0/","epapp":"https://thuecat.org/ontology/epapp/1.0/"},"@graph":[{"@id":"https://thuecat.org/resources/573211638937-gmqb","@type":[],"schema:containsPlace":[{"@id":"https://thuecat.org/resources/932209179057-xqhd"},{"@id":"https://thuecat.org/resources/427978371125-hekp"}]}]}

View file

@ -0,0 +1,33 @@
"tx_thuecat_import_log",,,,,,,
,"uid","pid","configuration",,,,
,1,0,1,,,,
"tx_thuecat_import_log_entry",,,,,,,
,"uid","pid","import_log","record_uid","table_name","insertion","errors"
,1,0,1,1,"tx_thuecat_organisation",1,"[]"
,2,0,1,1,"tx_thuecat_town",1,"[]"
,3,0,1,1,"tx_thuecat_parking_facility",1,"[]"
,4,0,1,2,"tx_thuecat_parking_facility",0,"[]"
,5,0,1,3,"tx_thuecat_parking_facility",0,"[]"
,6,0,1,1,"tx_thuecat_tourist_attraction",1,"[]"
,7,0,1,2,"tx_thuecat_tourist_attraction",0,"[]"
,8,0,1,3,"tx_thuecat_tourist_attraction",1,"[]"
,9,0,1,4,"tx_thuecat_tourist_attraction",0,"[]"
,10,0,1,5,"tx_thuecat_tourist_attraction",0,"[]"
"tx_thuecat_organisation",,,,,,,
,"uid","pid","remote_id","title",,,
,1,10,"https://thuecat.org/resources/018132452787-ngbe","Erfurt Tourismus und Marketing GmbH",,,
"tx_thuecat_town",,,,,,,
,"uid","pid","remote_id","title","managed_by",,
,1,10,"https://thuecat.org/resources/043064193523-jcyt","Erfurt",1,,
"tx_thuecat_parking_facility",,,,,,,
,"uid","pid","sys_language_uid","remote_id","title","managed_by",
,1,10,0,"https://thuecat.org/resources/396420044896-drzt","Parkhaus Domplatz",1,
,2,10,1,"https://thuecat.org/resources/396420044896-drzt","Car park Domplatz",1,
,3,10,2,"https://thuecat.org/resources/396420044896-drzt","Parking Domplatz",1,
"tx_thuecat_tourist_attraction",,,,,,,
,"uid","pid","sys_language_uid","remote_id","title","managed_by","town"
,1,10,0,"https://thuecat.org/resources/835224016581-dara","Dom St. Marien",1,1
,2,10,1,"https://thuecat.org/resources/835224016581-dara","Cathedral of St. Mary",1,1
,3,10,0,"https://thuecat.org/resources/165868194223-zmqf","Alte Synagoge",1,1
,4,10,1,"https://thuecat.org/resources/165868194223-zmqf","Old Synagogue",1,1
,5,10,2,"https://thuecat.org/resources/165868194223-zmqf","La vieille synagogue",1,1
1 tx_thuecat_import_log
2 uid pid configuration
3 1 0 1
4 tx_thuecat_import_log_entry
5 uid pid import_log record_uid table_name insertion errors
6 1 0 1 1 tx_thuecat_organisation 1 []
7 2 0 1 1 tx_thuecat_town 1 []
8 3 0 1 1 tx_thuecat_parking_facility 1 []
9 4 0 1 2 tx_thuecat_parking_facility 0 []
10 5 0 1 3 tx_thuecat_parking_facility 0 []
11 6 0 1 1 tx_thuecat_tourist_attraction 1 []
12 7 0 1 2 tx_thuecat_tourist_attraction 0 []
13 8 0 1 3 tx_thuecat_tourist_attraction 1 []
14 9 0 1 4 tx_thuecat_tourist_attraction 0 []
15 10 0 1 5 tx_thuecat_tourist_attraction 0 []
16 tx_thuecat_organisation
17 uid pid remote_id title
18 1 10 https://thuecat.org/resources/018132452787-ngbe Erfurt Tourismus und Marketing GmbH
19 tx_thuecat_town
20 uid pid remote_id title managed_by
21 1 10 https://thuecat.org/resources/043064193523-jcyt Erfurt 1
22 tx_thuecat_parking_facility
23 uid pid sys_language_uid remote_id title managed_by
24 1 10 0 https://thuecat.org/resources/396420044896-drzt Parkhaus Domplatz 1
25 2 10 1 https://thuecat.org/resources/396420044896-drzt Car park Domplatz 1
26 3 10 2 https://thuecat.org/resources/396420044896-drzt Parking Domplatz 1
27 tx_thuecat_tourist_attraction
28 uid pid sys_language_uid remote_id title managed_by town
29 1 10 0 https://thuecat.org/resources/835224016581-dara Dom St. Marien 1 1
30 2 10 1 https://thuecat.org/resources/835224016581-dara Cathedral of St. Mary 1 1
31 3 10 0 https://thuecat.org/resources/165868194223-zmqf Alte Synagoge 1 1
32 4 10 1 https://thuecat.org/resources/165868194223-zmqf Old Synagogue 1 1
33 5 10 2 https://thuecat.org/resources/165868194223-zmqf La vieille synagogue 1 1

View file

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="utf-8"?>
<dataset>
<pages>
<uid>1</uid>
<pid>0</pid>
<tstamp>1613400587</tstamp>
<crdate>1613400558</crdate>
<cruser_id>1</cruser_id>
<doktype>4</doktype>
<title>Rootpage</title>
<is_siteroot>1</is_siteroot>
</pages>
<pages>
<uid>10</uid>
<pid>1</pid>
<tstamp>1613400587</tstamp>
<crdate>1613400558</crdate>
<cruser_id>1</cruser_id>
<doktype>254</doktype>
<title>Storage folder</title>
</pages>
<sys_language>
<uid>1</uid>
<pid>0</pid>
<title>English</title>
<flag>en-us-gb</flag>
<language_isocode>en</language_isocode>
</sys_language>
<sys_language>
<uid>2</uid>
<pid>0</pid>
<title>French</title>
<flag>fr</flag>
<language_isocode>fr</language_isocode>
</sys_language>
<tx_thuecat_import_configuration>
<uid>1</uid>
<pid>0</pid>
<tstamp>1613400587</tstamp>
<crdate>1613400558</crdate>
<cruser_id>1</cruser_id>
<disable>0</disable>
<title>Attractions within Town Erfurt</title>
<type>static</type>
<configuration><![CDATA[<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<T3FlexForms>
<data>
<sheet index="sDEF">
<language index="lDEF">
<field index="storagePid">
<value index="vDEF">10</value>
</field>
<field index="urls">
<el index="el">
<field index="602a89f54d694654233086">
<value index="url">
<el>
<field index="url">
<value index="vDEF">https://thuecat.org/resources/835224016581-dara</value>
</field>
</el>
</value>
</field>
<field index="602a89f5e6c52907080672">
<value index="url">
<el>
<field index="url">
<value index="vDEF">https://thuecat.org/resources/165868194223-zmqf</value>
</field>
</el>
</value>
<value index="_TOGGLE">0</value>
</field>
</el>
</field>
</language>
</sheet>
</data>
</T3FlexForms>
]]></configuration>
</tx_thuecat_import_configuration>
</dataset>

View file

Can't render this file because it has a wrong number of fields in line 2.

View file

@ -74,18 +74,4 @@
<tourist_information>0</tourist_information>
<title>Erfurt</title>
</tx_thuecat_town>
<tx_thuecat_organisation>
<uid>1</uid>
<pid>10</pid>
<tstamp>1613400969</tstamp>
<crdate>1613400969</crdate>
<cruser_id>1</cruser_id>
<disable>0</disable>
<remote_id>https://thuecat.org/resources/018132452787-ngbe</remote_id>
<title>Erfurt Tourismus und Marketing GmbH</title>
<description>Die Erfurt Tourismus &amp; Marketing GmbH (ETMG) wurde 1997 als offizielle Organisation zur Tourismusförderung in der Landeshauptstadt Erfurt gegründet und nahm am 01.0 1.1998 die Geschäftstätigkeit auf.</description>
<manages_towns>0</manages_towns>
<manages_tourist_information>0</manages_tourist_information>
</tx_thuecat_organisation>
</dataset>

View file

@ -0,0 +1,35 @@
"tx_thuecat_tourist_attraction",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,"uid","pid","sys_language_uid","l18n_parent","l10n_source","l10n_state","remote_id","title","description","managed_by","town","address","offers","media","opening_hours","slogan","start_of_construction","sanitation","other_service","museum_service","architectural_style","traffic_infrastructure","payment_accepted","digital_offer","photography","pets_allowed","is_accessible_for_free","public_access","available_languages","distance_to_public_transport","parking_facility_near_by"
,1,10,0,0,0,"\NULL","https://thuecat.org/resources/835224016581-dara","Dom St. Marien","Über eine 70-stufige Freitreppe gelangt man vom Domplatz auf den Domberg mit seinen beiden ehemaligen Stiftskirchen. Der Dom, mit hochgotischem Chor, romanischem Turmbereich und spätgotischer Westhalle, ist Nachfolger des 724 von Rom veranlassten Sakralbaus. Er war die Hauptkirche des 742 von Bischof Bonifatius gegründeten Bistums Erfurt und während des Mittelalters bis in das frühe 19. Jahrhundert Sitz des Collegiatstifts St. Marien. 1507 erhielt Martin Luther hier die Priesterweihe.
Der ursprünglich romanische Kirchenbau wurde in der Zeit der Gotik entscheidend umgebaut. Besonders sehenswert sind die gotischen Chorfenster, das umfängliche Chorgestühl (14. Jhd.) sowie die romanischen Skulpturen einer thronenden Madonna und eines monumentalen Kerzenträgers im Innenraum. Berühmt ist er auch wegen der „Gloriosa“, der mit 2,56 m Durchmesser größten freischwingenden mittelalterlichen Glocke der Welt.
Das Ensemble von Dom und Severikirche bildet eine imposante Kulisse für die jährlich im Sommer stattfindenden DomStufen-Festspiele.",1,1,"{""street"":""Domstufen 1"",""zip"":""99084"",""city"":""Erfurt"",""email"":""dominformation@domberg-erfurt.de"",""phone"":""+49 361 6461265"",""fax"":"""",""geo"":{""latitude"":50.975955358589545,""longitude"":11.023667024961856}}","[]","[{""mainImage"":true,""type"":""image"",""title"":""Erfurt-Dom und Severikirche-beleuchtet.jpg"",""description"":"""",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5159216\/Preview-1280x0\/image"",""copyrightYear"":2016,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Dom-und-Severikirche.jpg"",""description"":""Sicht auf Dom St. Marien, St. Severikirche sowie die davor liegenden Klostergeb\u00e4ude und einem Ausschnitt des Biergartens umgeben von einem d\u00e4mmerungsverf\u00e4rten Himmel"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5159186\/Preview-1280x0\/image"",""copyrightYear"":2020,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Dom und Severikirche-beleuchtet.jpg"",""description"":"""",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5159216\/Preview-1280x0\/image"",""copyrightYear"":2016,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""""}}]","[{""opens"":""09:30:00"",""closes"":""18:00:00"",""from"":{""date"":""2021-05-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2021-10-31 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Saturday"",""Friday"",""Thursday"",""Tuesday"",""Monday"",""Wednesday""]},{""opens"":""13:00:00"",""closes"":""18:00:00"",""from"":{""date"":""2021-05-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2021-10-31 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Sunday""]},{""opens"":""09:30:00"",""closes"":""17:00:00"",""from"":{""date"":""2021-11-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2022-04-30 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Saturday"",""Friday"",""Thursday"",""Tuesday"",""Monday"",""Wednesday""]},{""opens"":""13:00:00"",""closes"":""17:00:00"",""from"":{""date"":""2021-11-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2022-04-30 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Sunday""]}]",,,"Toilets,DisabledToilets","SeatingPossibilitiesRestArea,SouvenirShop",,"GothicArt","BicycleLockersEnumMem,BusParkCoachParkEnumMem",,"AugmentedReality","Fotogenehmigung für innen","false","true","true","German,English","350:MTR",1
,2,10,1,1,1,"\NULL","https://thuecat.org/resources/835224016581-dara","Cathedral of St. Mary","The late Gothic cathedral with its high-Gothic choir and Romanesque tower replaced the church built on this site for Bishop Boniface in 742. The central tower houses the ""Gloriosa"", the worlds largest medieval free-swinging bell.",1,1,"{""street"":""Domstufen 1"",""zip"":""99084"",""city"":""Erfurt"",""email"":""dominformation@domberg-erfurt.de"",""phone"":""+49 361 6461265"",""fax"":"""",""geo"":{""latitude"":50.975955358589545,""longitude"":11.023667024961856}}","[]","[{""mainImage"":true,""type"":""image"",""title"":""Erfurt-Dom und Severikirche-beleuchtet.jpg"",""description"":"""",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5159216\/Preview-1280x0\/image"",""copyrightYear"":2016,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Dom-und-Severikirche.jpg"",""description"":""Sicht auf Dom St. Marien, St. Severikirche sowie die davor liegenden Klostergeb\u00e4ude und einem Ausschnitt des Biergartens umgeben von einem d\u00e4mmerungsverf\u00e4rten Himmel"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5159186\/Preview-1280x0\/image"",""copyrightYear"":2020,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Dom und Severikirche-beleuchtet.jpg"",""description"":"""",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5159216\/Preview-1280x0\/image"",""copyrightYear"":2016,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""""}}]","[{""opens"":""09:30:00"",""closes"":""18:00:00"",""from"":{""date"":""2021-05-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2021-10-31 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Saturday"",""Friday"",""Thursday"",""Tuesday"",""Monday"",""Wednesday""]},{""opens"":""13:00:00"",""closes"":""18:00:00"",""from"":{""date"":""2021-05-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2021-10-31 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Sunday""]},{""opens"":""09:30:00"",""closes"":""17:00:00"",""from"":{""date"":""2021-11-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2022-04-30 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Saturday"",""Friday"",""Thursday"",""Tuesday"",""Monday"",""Wednesday""]},{""opens"":""13:00:00"",""closes"":""17:00:00"",""from"":{""date"":""2021-11-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2022-04-30 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Sunday""]}]",,,"Toilets,DisabledToilets","SeatingPossibilitiesRestArea,SouvenirShop",,"GothicArt","BicycleLockersEnumMem,BusParkCoachParkEnumMem",,"AugmentedReality",,"false","true","true","German,English","350:MTR",1
,3,10,0,0,0,"\NULL","https://thuecat.org/resources/165868194223-zmqf","Alte Synagoge","Beispiel Beschreibung",1,1,"{""street"":""Waagegasse 8"",""zip"":""99084"",""city"":""Erfurt"",""email"":""altesynagoge@erfurt.de"",""phone"":""+49 361 6551520"",""fax"":""+49 361 6551669"",""geo"":{""latitude"":50.978765,""longitude"":11.029133}}","[{""title"":""F\u00fchrungen"",""description"":""Immer samstags, um 11:15 Uhr findet eine \u00f6ffentliche F\u00fchrung durch das Museum statt. Dauer etwa 90 Minuten"",""prices"":[{""title"":""Erwachsene"",""description"":"""",""price"":8,""currency"":""EUR"",""rule"":""PerPerson""},{""title"":""Erm\u00e4\u00dfigt"",""description"":""als erm\u00e4\u00dfigt gelten schulpflichtige Kinder, Auszubildende, Studierende, Rentner\/-innen, Menschen mit Behinderungen, Inhaber Sozialausweis der Landeshauptstadt Erfurt"",""price"":5,""currency"":""EUR"",""rule"":""PerPerson""}]},{""title"":""Eintritt"",""description"":""Schulklassen und Kitagruppen im Rahmen des Unterrichts: Eintritt frei\nAn jedem ersten Dienstag im Monat: Eintritt frei"",""prices"":[{""title"":""Erm\u00e4\u00dfigt"",""description"":""als erm\u00e4\u00dfigt gelten schulpflichtige Kinder, Auszubildende, Studierende, Rentner\/-innen, Menschen mit Behinderungen, Inhaber Sozialausweis der Landeshauptstadt Erfurt"",""price"":5,""currency"":""EUR"",""rule"":""PerPerson""},{""title"":""Familienkarte"",""description"":"""",""price"":17,""currency"":""EUR"",""rule"":""PerGroup""},{""title"":""ErfurtCard"",""description"":"""",""price"":14.9,""currency"":""EUR"",""rule"":""PerPackage""},{""title"":""Erwachsene"",""description"":"""",""price"":8,""currency"":""EUR"",""rule"":""PerPerson""}]}]","[{""mainImage"":true,""type"":""image"",""title"":""Erfurt-Alte Synagoge"",""description"":""Frontaler Blick auf die Hausfront\/Hausfassade im Innenhof mit Zugang \u00fcber die Waagegasse"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5099196\/Preview-1280x0\/image"",""copyrightYear"":2009,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""F:\\Bilddatenbank\\Museen und Ausstellungen\\Alte Synagoge""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Alte Synagoge"",""description"":""Frontaler Blick auf die Hausfront\/Hausfassade im Innenhof mit Zugang \u00fcber die Waagegasse"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5099196\/Preview-1280x0\/image"",""copyrightYear"":2009,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""F:\\Bilddatenbank\\Museen und Ausstellungen\\Alte Synagoge""}}]","[{""opens"":""10:00:00"",""closes"":""18:00:00"",""from"":{""date"":""2021-03-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2021-12-31 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Saturday"",""Sunday"",""Friday"",""Thursday"",""Tuesday"",""Wednesday""]}]","Highlight","11. Jh.","Toilets,DisabledToilets,NappyChangingArea,FamilyAndChildFriendly","SeatingPossibilitiesRestArea,LockBoxes,SouvenirShop,BaggageStorage","MuseumShop","GothicArt","ZeroSpecialTrafficInfrastructure","CashPayment,EC","AudioGuide,VideoGuide","ZeroPhotography","Tiere sind im Gebäude nicht gestattet, ausgenommen sind Blinden- und Blindenbegleithunde.","false","true","German,English,French","200:MTR",
,4,10,1,3,3,"\NULL","https://thuecat.org/resources/165868194223-zmqf","Old Synagogue","The Old Synagogue is one of very few preserved medieval synagogues in Europe. Thanks to the extensive preservation of the original structure, it has a special place in the history of art and architecture and is among the most impressive and highly rated architectural monuments in Erfurt and Thuringia. The synagogue was constructed during the Middle Ages on the ""via regia"", one of the major European trade routes, at the heart of the historical old quarter very close to the Merchants Bridge and the town hall. Many parts of the structure still remain today, including all four thick outer walls, the Roman­esque gemel window, the Gothic rose window and the entrance to the synagogue room.",1,1,"{""street"":""Waagegasse 8"",""zip"":""99084"",""city"":""Erfurt"",""email"":""altesynagoge@erfurt.de"",""phone"":""+49 361 6551520"",""fax"":""+49 361 6551669"",""geo"":{""latitude"":50.978765,""longitude"":11.029133}}","[{""title"":""F\u00fchrungen"",""description"":""Immer samstags, um 11:15 Uhr findet eine \u00f6ffentliche F\u00fchrung durch das Museum statt. Dauer etwa 90 Minuten"",""prices"":[{""title"":""Erwachsene"",""description"":"""",""price"":8,""currency"":""EUR"",""rule"":""PerPerson""},{""title"":""Erm\u00e4\u00dfigt"",""description"":""als erm\u00e4\u00dfigt gelten schulpflichtige Kinder, Auszubildende, Studierende, Rentner\/-innen, Menschen mit Behinderungen, Inhaber Sozialausweis der Landeshauptstadt Erfurt"",""price"":5,""currency"":""EUR"",""rule"":""PerPerson""}]},{""title"":""Eintritt"",""description"":""Schulklassen und Kitagruppen im Rahmen des Unterrichts: Eintritt frei\nAn jedem ersten Dienstag im Monat: Eintritt frei"",""prices"":[{""title"":""Erm\u00e4\u00dfigt"",""description"":""als erm\u00e4\u00dfigt gelten schulpflichtige Kinder, Auszubildende, Studierende, Rentner\/-innen, Menschen mit Behinderungen, Inhaber Sozialausweis der Landeshauptstadt Erfurt"",""price"":5,""currency"":""EUR"",""rule"":""PerPerson""},{""title"":""Familienkarte"",""description"":"""",""price"":17,""currency"":""EUR"",""rule"":""PerGroup""},{""title"":""ErfurtCard"",""description"":"""",""price"":14.9,""currency"":""EUR"",""rule"":""PerPackage""},{""title"":""Erwachsene"",""description"":"""",""price"":8,""currency"":""EUR"",""rule"":""PerPerson""}]}]","[{""mainImage"":true,""type"":""image"",""title"":""Erfurt-Alte Synagoge"",""description"":""Frontaler Blick auf die Hausfront\/Hausfassade im Innenhof mit Zugang \u00fcber die Waagegasse"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5099196\/Preview-1280x0\/image"",""copyrightYear"":2009,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""F:\\Bilddatenbank\\Museen und Ausstellungen\\Alte Synagoge""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Alte Synagoge"",""description"":""Frontaler Blick auf die Hausfront\/Hausfassade im Innenhof mit Zugang \u00fcber die Waagegasse"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5099196\/Preview-1280x0\/image"",""copyrightYear"":2009,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""F:\\Bilddatenbank\\Museen und Ausstellungen\\Alte Synagoge""}}]","[{""opens"":""10:00:00"",""closes"":""18:00:00"",""from"":{""date"":""2021-03-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2021-12-31 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Saturday"",""Sunday"",""Friday"",""Thursday"",""Tuesday"",""Wednesday""]}]","Highlight","11th century","Toilets,DisabledToilets,NappyChangingArea,FamilyAndChildFriendly","SeatingPossibilitiesRestArea,LockBoxes,SouvenirShop,BaggageStorage","MuseumShop","GothicArt","ZeroSpecialTrafficInfrastructure","CashPayment,EC","AudioGuide,VideoGuide","ZeroPhotography",,"false","true","German,English,French","200:MTR",
,5,10,2,3,3,"\NULL","https://thuecat.org/resources/165868194223-zmqf","La vieille synagogue","La vieille synagogue (datant des années 1100) est la synagogue la plus vieille dEurope totalement conservée, dans laquelle est exposé un trésor datant des 13/14èmes siècles avec une alliance juive unique et des écritures hébraïques (datant des 12ème, 13ème et 14èmes siècles). Après la redécouverte du Mikwé, Erfurt abrite des témoins uniques et fascinants dune communauté juive médiévale.",1,1,"{""street"":""Waagegasse 8"",""zip"":""99084"",""city"":""Erfurt"",""email"":""altesynagoge@erfurt.de"",""phone"":""+49 361 6551520"",""fax"":""+49 361 6551669"",""geo"":{""latitude"":50.978765,""longitude"":11.029133}}","[{""title"":""F\u00fchrungen"",""description"":""Immer samstags, um 11:15 Uhr findet eine \u00f6ffentliche F\u00fchrung durch das Museum statt. Dauer etwa 90 Minuten"",""prices"":[{""title"":""Erwachsene"",""description"":"""",""price"":8,""currency"":""EUR"",""rule"":""PerPerson""},{""title"":""Erm\u00e4\u00dfigt"",""description"":""als erm\u00e4\u00dfigt gelten schulpflichtige Kinder, Auszubildende, Studierende, Rentner\/-innen, Menschen mit Behinderungen, Inhaber Sozialausweis der Landeshauptstadt Erfurt"",""price"":5,""currency"":""EUR"",""rule"":""PerPerson""}]},{""title"":""Eintritt"",""description"":""Schulklassen und Kitagruppen im Rahmen des Unterrichts: Eintritt frei\nAn jedem ersten Dienstag im Monat: Eintritt frei"",""prices"":[{""title"":""Erm\u00e4\u00dfigt"",""description"":""als erm\u00e4\u00dfigt gelten schulpflichtige Kinder, Auszubildende, Studierende, Rentner\/-innen, Menschen mit Behinderungen, Inhaber Sozialausweis der Landeshauptstadt Erfurt"",""price"":5,""currency"":""EUR"",""rule"":""PerPerson""},{""title"":""Familienkarte"",""description"":"""",""price"":17,""currency"":""EUR"",""rule"":""PerGroup""},{""title"":""ErfurtCard"",""description"":"""",""price"":14.9,""currency"":""EUR"",""rule"":""PerPackage""},{""title"":""Erwachsene"",""description"":"""",""price"":8,""currency"":""EUR"",""rule"":""PerPerson""}]}]","[{""mainImage"":true,""type"":""image"",""title"":""Erfurt-Alte Synagoge"",""description"":""Frontaler Blick auf die Hausfront\/Hausfassade im Innenhof mit Zugang \u00fcber die Waagegasse"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5099196\/Preview-1280x0\/image"",""copyrightYear"":2009,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""F:\\Bilddatenbank\\Museen und Ausstellungen\\Alte Synagoge""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Alte Synagoge"",""description"":""Frontaler Blick auf die Hausfront\/Hausfassade im Innenhof mit Zugang \u00fcber die Waagegasse"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5099196\/Preview-1280x0\/image"",""copyrightYear"":2009,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""F:\\Bilddatenbank\\Museen und Ausstellungen\\Alte Synagoge""}}]","[{""opens"":""10:00:00"",""closes"":""18:00:00"",""from"":{""date"":""2021-03-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2021-12-31 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Saturday"",""Sunday"",""Friday"",""Thursday"",""Tuesday"",""Wednesday""]}]","Highlight",,"Toilets,DisabledToilets,NappyChangingArea,FamilyAndChildFriendly","SeatingPossibilitiesRestArea,LockBoxes,SouvenirShop,BaggageStorage","MuseumShop","GothicArt","ZeroSpecialTrafficInfrastructure","CashPayment,EC","AudioGuide,VideoGuide","ZeroPhotography",,"false","true","German,English,French","200:MTR",
,6,10,0,0,0,"\NULL","https://thuecat.org/resources/215230952334-yyno","Krämerbrücke","Ein bekanntes Wahrzeichen Erfurts ist die Krämerbrücke, die längste bebaute und bewohnte Brücke Europas.Die Krämerbrücke wurde zu Beginn aus Holz und 1325 aus Stein erbaut. Zunächst war die 120 m lange Brücke mit 62 schmalen Häusern bebaut. Später wurden einige der Häuser auf nun mehr 32 zusammengefasst. An beiden Enden der Brücke standen zwei Brückenkopfkirchen. Heute existiert nur noch eine der beiden, die östlich gelegene Ägidienkirche.Auf der Krämerbrücke kann man in Galerien und Boutiquen sehr schön bummeln gehen. Man kann Thüringer Handwerksmeistern bei ihrer Arbeit über die Schulter schauen. Keramik, Porzellan und Holzschnitzereien, Blaudruck und Lauschaer Glas sind beliebte Souvenirs. Cafès, Weinhändler und Feinkostgeschäfte mit Thüringer Spezialitäten laden zum Verweilen ein.",1,1,"{""street"":""Benediktsplatz 1"",""zip"":""99084"",""city"":""Erfurt"",""email"":""service@erfurt-tourismus.de"",""phone"":""+49 361 66 400"",""fax"":"""",""geo"":{""latitude"":50.978772,""longitude"":11.031622}}","[]","[{""mainImage"":true,""type"":""image"",""title"":""Erfurt-Kraemerbruecke-11.jpg"",""description"":""Kr\u00e4merbr\u00fccke in Erfurt"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134362\/Preview-1280x0\/image"",""copyrightYear"":2019,""license"":{""type"":""https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de"",""author"":""https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Kraemerbruecke.jpg"",""description"":""Kr\u00e4merbr\u00fccke in Erfurt"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134288\/Preview-1280x0\/image"",""copyrightYear"":2019,""license"":{""type"":""https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de"",""author"":""https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Kraemerbruecke-11.jpg"",""description"":""Kr\u00e4merbr\u00fccke in Erfurt"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134362\/Preview-1280x0\/image"",""copyrightYear"":2019,""license"":{""type"":""https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de"",""author"":""https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Kraemerbruecke-13.jpg"",""description"":""Ansicht der Kr\u00e4merbr\u00fccke, Erfurt"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/652340\/Preview-1280x0\/image"",""copyrightYear"":2019,""license"":{""type"":""https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de"",""author"":""https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion""}}]","[]",,,"ZeroSanitation","Playground,SeatingPossibilitiesRestArea,SouvenirShop,PlayCornerOrPlayArea",,"ZeroInformationArchitecturalStyle","BicycleLockersEnumMem",,"ZeroDigitalOffer","TakingPicturesPermitted","true","true","true","German,English,French","250:MTR","1,4"
,7,10,1,6,6,"\NULL","https://thuecat.org/resources/215230952334-yyno","Merchants' Bridge","Another Erfurt landmark is the Merchants' Bridge (Krämerbrücke), the longest series of inhabited buildings on any bridge in Europe. The Merchants' Bridge is Erfurts most interesting secular construction, initially in wood but rebuilt in stone in 1325. There were originally 62 narrow buildings along its 120-metre length, but subsequent redevelopment left just 32 buildings. Of what was once a pair of bridgehead churches, only the Church of St. Aegidius remains at the eastern end of the bridge today. The Merchants' Bridge is lined with galleries, cafés and boutiques offering traditional crafts, Thuringian blue printed fabrics, hand-painted ceramics, handblown glassware, jewellery, wood carvings, antiques and delicious Thuringian specialities - perfect for browsing.",1,1,"{""street"":""Benediktsplatz 1"",""zip"":""99084"",""city"":""Erfurt"",""email"":""service@erfurt-tourismus.de"",""phone"":""+49 361 66 400"",""fax"":"""",""geo"":{""latitude"":50.978772,""longitude"":11.031622}}","[]","[{""mainImage"":true,""type"":""image"",""title"":""Erfurt-Kraemerbruecke-11.jpg"",""description"":""Kr\u00e4merbr\u00fccke in Erfurt"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134362\/Preview-1280x0\/image"",""copyrightYear"":2019,""license"":{""type"":""https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de"",""author"":""https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Kraemerbruecke.jpg"",""description"":""Kr\u00e4merbr\u00fccke in Erfurt"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134288\/Preview-1280x0\/image"",""copyrightYear"":2019,""license"":{""type"":""https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de"",""author"":""https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Kraemerbruecke-11.jpg"",""description"":""Kr\u00e4merbr\u00fccke in Erfurt"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134362\/Preview-1280x0\/image"",""copyrightYear"":2019,""license"":{""type"":""https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de"",""author"":""https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Kraemerbruecke-13.jpg"",""description"":""Ansicht der Kr\u00e4merbr\u00fccke, Erfurt"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/652340\/Preview-1280x0\/image"",""copyrightYear"":2019,""license"":{""type"":""https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de"",""author"":""https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion""}}]","[]",,,"ZeroSanitation","Playground,SeatingPossibilitiesRestArea,SouvenirShop,PlayCornerOrPlayArea",,"ZeroInformationArchitecturalStyle","BicycleLockersEnumMem",,"ZeroDigitalOffer","TakingPicturesPermitted","true","true","true","German,English,French","250:MTR","1,4"
,8,10,2,6,6,"\NULL","https://thuecat.org/resources/215230952334-yyno","Pont de l'épicier","Le pont de lépicier est un des symboles de la ville dErfurt, le plus grand pont habité en continu dEurope. A lorigine, le pont de lépicier faisait 120 m de long et comptait 62 maisons étroites, qui furent plus tard regroupées en 32 maisons. Sur le pont de lépicier se trouvent des galeries et des petites échoppes proposant des étoffes à motifs bleu indigo de Thuringe, des céramiques peintes main, du verre de Lauscha, des bijoux et des sculptures en bois.",1,1,"{""street"":""Benediktsplatz 1"",""zip"":""99084"",""city"":""Erfurt"",""email"":""service@erfurt-tourismus.de"",""phone"":""+49 361 66 400"",""fax"":"""",""geo"":{""latitude"":50.978772,""longitude"":11.031622}}","[]","[{""mainImage"":true,""type"":""image"",""title"":""Erfurt-Kraemerbruecke-11.jpg"",""description"":""Kr\u00e4merbr\u00fccke in Erfurt"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134362\/Preview-1280x0\/image"",""copyrightYear"":2019,""license"":{""type"":""https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de"",""author"":""https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Kraemerbruecke.jpg"",""description"":""Kr\u00e4merbr\u00fccke in Erfurt"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134288\/Preview-1280x0\/image"",""copyrightYear"":2019,""license"":{""type"":""https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de"",""author"":""https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Kraemerbruecke-11.jpg"",""description"":""Kr\u00e4merbr\u00fccke in Erfurt"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134362\/Preview-1280x0\/image"",""copyrightYear"":2019,""license"":{""type"":""https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de"",""author"":""https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Kraemerbruecke-13.jpg"",""description"":""Ansicht der Kr\u00e4merbr\u00fccke, Erfurt"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/652340\/Preview-1280x0\/image"",""copyrightYear"":2019,""license"":{""type"":""https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de"",""author"":""https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion""}}]","[]",,,"ZeroSanitation","Playground,SeatingPossibilitiesRestArea,SouvenirShop,PlayCornerOrPlayArea",,"ZeroInformationArchitecturalStyle","BicycleLockersEnumMem",,"ZeroDigitalOffer","TakingPicturesPermitted","true","true","true","German,English,French","250:MTR","1,4"
"tx_thuecat_parking_facility",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,"uid","pid","sys_language_uid","l18n_parent","l10n_source","l10n_state","remote_id","title","description","managed_by","address","offers","media","opening_hours","sanitation","other_service","traffic_infrastructure","payment_accepted","distance_to_public_transport",,,,,,,,,,,,
,1,10,0,0,0,"\NULL","https://thuecat.org/resources/396420044896-drzt","Parkhaus Domplatz","Das Parkhaus Domplatz befindet sich unmittelbar unterhalb der Zitadelle Petersberg am nördlichen Rand des Domplatzes. Durch die zentrale Lage ist es ein idealer Ausgangspunkt für Stadtbummel und Erkundungen des Zentrums, des Petersbergs und des Andreasviertels.",1,"{""street"":""Bechtheimer Str. 1"",""zip"":""99084"",""city"":""Erfurt"",""email"":""info@stadtwerke-erfurt.de"",""phone"":""+49 361 5640"",""fax"":"""",""geo"":{""latitude"":50.977648905044,""longitude"":11.022127985954299}}","[{""title"":"""",""description"":"""",""prices"":[{""title"":"""",""description"":"""",""price"":35,""currency"":""EUR"",""rule"":""PerCar""}]},{""title"":"""",""description"":"""",""prices"":[{""title"":"""",""description"":"""",""price"":1.5,""currency"":""EUR"",""rule"":""PerCar""}]},{""title"":"""",""description"":"""",""prices"":[{""title"":"""",""description"":"""",""price"":10,""currency"":""EUR"",""rule"":""PerCar""}]},{""title"":"""",""description"":"""",""prices"":[{""title"":"""",""description"":"""",""price"":50,""currency"":""EUR"",""rule"":""PerCar""}]}]","[{""mainImage"":true,""type"":""image"",""title"":""Erfurt-Parkhaus-Domplatz.jpg"",""description"":"""",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/6486108\/Preview-1280x0\/image"",""copyrightYear"":2021,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Parkhaus-Domplatz.jpg"",""description"":"""",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/6486108\/Preview-1280x0\/image"",""copyrightYear"":2021,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""""}}]","[{""opens"":""07:00:00"",""closes"":""22:00:00"",""from"":"""",""through"":"""",""daysOfWeek"":[""Saturday"",""Friday"",""Thursday"",""Tuesday"",""Monday"",""Wednesday""]},{""opens"":""09:00:00"",""closes"":""22:00:00"",""from"":"""",""through"":"""",""daysOfWeek"":[""Sunday"",""PublicHolidays""]}]","ZeroSanitation","ZeroOtherServiceEnumMem","ElectricVehicleCarChargingStationEnumMem",,"240:MTR",,,,,,,,,,,,
,2,10,1,1,1,"\NULL","https://thuecat.org/resources/396420044896-drzt","Car park Domplatz","The Domplatz multi-storey car park is located directly below the Petersberg Citadel on the northern edge of the Domplatz. Its central location makes it an ideal starting point for strolling through the city and exploring the centre, the Petersberg and the Andreasviertel.",1,"{""street"":""Bechtheimer Str. 1"",""zip"":""99084"",""city"":""Erfurt"",""email"":""info@stadtwerke-erfurt.de"",""phone"":""+49 361 5640"",""fax"":"""",""geo"":{""latitude"":50.977648905044,""longitude"":11.022127985954299}}","[{""title"":"""",""description"":"""",""prices"":[{""title"":"""",""description"":"""",""price"":35,""currency"":""EUR"",""rule"":""PerCar""}]},{""title"":"""",""description"":"""",""prices"":[{""title"":"""",""description"":"""",""price"":1.5,""currency"":""EUR"",""rule"":""PerCar""}]},{""title"":"""",""description"":"""",""prices"":[{""title"":"""",""description"":"""",""price"":10,""currency"":""EUR"",""rule"":""PerCar""}]},{""title"":"""",""description"":"""",""prices"":[{""title"":"""",""description"":"""",""price"":50,""currency"":""EUR"",""rule"":""PerCar""}]}]","[{""mainImage"":true,""type"":""image"",""title"":""Erfurt-Parkhaus-Domplatz.jpg"",""description"":"""",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/6486108\/Preview-1280x0\/image"",""copyrightYear"":2021,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Parkhaus-Domplatz.jpg"",""description"":"""",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/6486108\/Preview-1280x0\/image"",""copyrightYear"":2021,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""""}}]","[{""opens"":""07:00:00"",""closes"":""22:00:00"",""from"":"""",""through"":"""",""daysOfWeek"":[""Saturday"",""Friday"",""Thursday"",""Tuesday"",""Monday"",""Wednesday""]},{""opens"":""09:00:00"",""closes"":""22:00:00"",""from"":"""",""through"":"""",""daysOfWeek"":[""Sunday"",""PublicHolidays""]}]","ZeroSanitation","ZeroOtherServiceEnumMem","ElectricVehicleCarChargingStationEnumMem",,"240:MTR",,,,,,,,,,,,
,3,10,2,1,1,"\NULL","https://thuecat.org/resources/396420044896-drzt","Parking Domplatz","Le parking à étages de la Domplatz est situé juste en dessous de la citadelle de Petersberg, sur le bord nord de la Domplatz. Son emplacement central en fait un point de départ idéal pour se promener dans la ville et explorer le centre, le Petersberg et l'Andreasviertel.",1,"{""street"":""Bechtheimer Str. 1"",""zip"":""99084"",""city"":""Erfurt"",""email"":""info@stadtwerke-erfurt.de"",""phone"":""+49 361 5640"",""fax"":"""",""geo"":{""latitude"":50.977648905044,""longitude"":11.022127985954299}}","[{""title"":"""",""description"":"""",""prices"":[{""title"":"""",""description"":"""",""price"":35,""currency"":""EUR"",""rule"":""PerCar""}]},{""title"":"""",""description"":"""",""prices"":[{""title"":"""",""description"":"""",""price"":1.5,""currency"":""EUR"",""rule"":""PerCar""}]},{""title"":"""",""description"":"""",""prices"":[{""title"":"""",""description"":"""",""price"":10,""currency"":""EUR"",""rule"":""PerCar""}]},{""title"":"""",""description"":"""",""prices"":[{""title"":"""",""description"":"""",""price"":50,""currency"":""EUR"",""rule"":""PerCar""}]}]","[{""mainImage"":true,""type"":""image"",""title"":""Erfurt-Parkhaus-Domplatz.jpg"",""description"":"""",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/6486108\/Preview-1280x0\/image"",""copyrightYear"":2021,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Parkhaus-Domplatz.jpg"",""description"":"""",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/6486108\/Preview-1280x0\/image"",""copyrightYear"":2021,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""""}}]","[{""opens"":""07:00:00"",""closes"":""22:00:00"",""from"":"""",""through"":"""",""daysOfWeek"":[""Saturday"",""Friday"",""Thursday"",""Tuesday"",""Monday"",""Wednesday""]},{""opens"":""09:00:00"",""closes"":""22:00:00"",""from"":"""",""through"":"""",""daysOfWeek"":[""Sunday"",""PublicHolidays""]}]","ZeroSanitation","ZeroOtherServiceEnumMem","ElectricVehicleCarChargingStationEnumMem",,"240:MTR",,,,,,,,,,,,
,4,10,0,0,0,"\NULL","https://thuecat.org/resources/440055527204-ocar","Q-Park Anger 1 Parkhaus","Der Q-Park liegt direkt hinter dem Kaufhaus Anger 1 im Erfurter Stadtzentrum und ist über Juri-Gagarin-Ring/Meyfartstraße zu erreichen. Durch die direkte Anbindung an den Stadtring, ist das Parkhaus gut von außerhalb über Schnellstraßen und Autobahnen zu erreichen und befindet sich gleichzeitig im unmittelbaren modernen Zentrum Erfurts.",1,"{""street"":""Anger 1"",""zip"":""99084"",""city"":""Erfurt"",""email"":""servicecenter@q-park.de"",""phone"":""+49 218 18190290"",""fax"":"""",""geo"":{""latitude"":50.977999330565794,""longitude"":11.037503264052475}}","[{""title"":"""",""description"":"""",""prices"":[{""title"":"""",""description"":"""",""price"":2.2,""currency"":""EUR"",""rule"":""PerCar""}]},{""title"":"""",""description"":"""",""prices"":[{""title"":"""",""description"":"""",""price"":1,""currency"":""EUR"",""rule"":""PerCar""}]},{""title"":"""",""description"":"""",""prices"":[{""title"":"""",""description"":"""",""price"":13,""currency"":""EUR"",""rule"":""PerCar""}]}]","[{""mainImage"":true,""type"":""image"",""title"":""Q-Park-Parkhaus-Anger1-Juri-Gagarin-Ring.JPG"",""description"":""Stra\u00dfenansicht des Parkhauses Q-Park am Kaufhaus Anger 1, schr\u00e4g \u00fcber den Juri-Gagarin-Ring"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5197164\/Preview-1280x0\/image"",""copyrightYear"":2020,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""""}},{""mainImage"":false,""type"":""image"",""title"":""Q-Park-Parkhaus-Anger1-Juri-Gagarin-Ring.JPG"",""description"":""Stra\u00dfenansicht des Parkhauses Q-Park am Kaufhaus Anger 1, schr\u00e4g \u00fcber den Juri-Gagarin-Ring"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5197164\/Preview-1280x0\/image"",""copyrightYear"":2020,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""""}}]","[{""opens"":""05:30:00"",""closes"":""23:59:00"",""from"":{""date"":""2020-12-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2021-12-31 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Saturday"",""Sunday"",""Friday"",""Thursday"",""Tuesday"",""Monday"",""Wednesday""]}]","Toilets","ZeroOtherServiceEnumMem",,,"120:MTR",,,,,,,,,,,,
,5,10,1,4,4,"\NULL","https://thuecat.org/resources/440055527204-ocar","Q-Park Anger 1 multi-storey car park","The Q-Park is located directly behind the department store Anger 1 in Erfurt's city centre and can be reached via Juri-Gagarin-Ring/Meyfartstraße.",1,"{""street"":""Anger 1"",""zip"":""99084"",""city"":""Erfurt"",""email"":""servicecenter@q-park.de"",""phone"":""+49 218 18190290"",""fax"":"""",""geo"":{""latitude"":50.977999330565794,""longitude"":11.037503264052475}}","[{""title"":"""",""description"":"""",""prices"":[{""title"":"""",""description"":"""",""price"":2.2,""currency"":""EUR"",""rule"":""PerCar""}]},{""title"":"""",""description"":"""",""prices"":[{""title"":"""",""description"":"""",""price"":1,""currency"":""EUR"",""rule"":""PerCar""}]},{""title"":"""",""description"":"""",""prices"":[{""title"":"""",""description"":"""",""price"":13,""currency"":""EUR"",""rule"":""PerCar""}]}]","[{""mainImage"":true,""type"":""image"",""title"":""Q-Park-Parkhaus-Anger1-Juri-Gagarin-Ring.JPG"",""description"":""Stra\u00dfenansicht des Parkhauses Q-Park am Kaufhaus Anger 1, schr\u00e4g \u00fcber den Juri-Gagarin-Ring"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5197164\/Preview-1280x0\/image"",""copyrightYear"":2020,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""""}},{""mainImage"":false,""type"":""image"",""title"":""Q-Park-Parkhaus-Anger1-Juri-Gagarin-Ring.JPG"",""description"":""Stra\u00dfenansicht des Parkhauses Q-Park am Kaufhaus Anger 1, schr\u00e4g \u00fcber den Juri-Gagarin-Ring"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5197164\/Preview-1280x0\/image"",""copyrightYear"":2020,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""""}}]","[{""opens"":""05:30:00"",""closes"":""23:59:00"",""from"":{""date"":""2020-12-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2021-12-31 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Saturday"",""Sunday"",""Friday"",""Thursday"",""Tuesday"",""Monday"",""Wednesday""]}]","Toilets","ZeroOtherServiceEnumMem",,,"120:MTR",,,,,,,,,,,,
,6,10,2,4,4,"\NULL","https://thuecat.org/resources/440055527204-ocar","Q-Park Anger 1 parking à étages","Le Q-Park est situé directement derrière le grand magasin Anger 1 dans le centre-ville d'Erfurt et peut être atteint par la Juri-Gagarin-Ring/Meyfartstraße.",1,"{""street"":""Anger 1"",""zip"":""99084"",""city"":""Erfurt"",""email"":""servicecenter@q-park.de"",""phone"":""+49 218 18190290"",""fax"":"""",""geo"":{""latitude"":50.977999330565794,""longitude"":11.037503264052475}}","[{""title"":"""",""description"":"""",""prices"":[{""title"":"""",""description"":"""",""price"":2.2,""currency"":""EUR"",""rule"":""PerCar""}]},{""title"":"""",""description"":"""",""prices"":[{""title"":"""",""description"":"""",""price"":1,""currency"":""EUR"",""rule"":""PerCar""}]},{""title"":"""",""description"":"""",""prices"":[{""title"":"""",""description"":"""",""price"":13,""currency"":""EUR"",""rule"":""PerCar""}]}]","[{""mainImage"":true,""type"":""image"",""title"":""Q-Park-Parkhaus-Anger1-Juri-Gagarin-Ring.JPG"",""description"":""Stra\u00dfenansicht des Parkhauses Q-Park am Kaufhaus Anger 1, schr\u00e4g \u00fcber den Juri-Gagarin-Ring"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5197164\/Preview-1280x0\/image"",""copyrightYear"":2020,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""""}},{""mainImage"":false,""type"":""image"",""title"":""Q-Park-Parkhaus-Anger1-Juri-Gagarin-Ring.JPG"",""description"":""Stra\u00dfenansicht des Parkhauses Q-Park am Kaufhaus Anger 1, schr\u00e4g \u00fcber den Juri-Gagarin-Ring"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5197164\/Preview-1280x0\/image"",""copyrightYear"":2020,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""""}}]","[{""opens"":""05:30:00"",""closes"":""23:59:00"",""from"":{""date"":""2020-12-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2021-12-31 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Saturday"",""Sunday"",""Friday"",""Thursday"",""Tuesday"",""Monday"",""Wednesday""]}]","Toilets","ZeroOtherServiceEnumMem",,,"120:MTR",,,,,,,,,,,,
"tx_thuecat_organisation",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,"uid","pid","remote_id","title","description",,,,,,,,,,,,,,,,,,,,,,,,,,
,1,10,"https://thuecat.org/resources/018132452787-ngbe","Erfurt Tourismus und Marketing GmbH","Die Erfurt Tourismus & Marketing GmbH (ETMG) wurde 1997 als offizielle Organisation zur Tourismusförderung in der Landeshauptstadt Erfurt gegründet und nahm am 01.01.1998 die Geschäftstätigkeit auf.
Zu den Aufgaben zählen die kommunale Tourismusförderung als wesentliches Instrument der Wirtschafts- und Stadtentwicklung der Landeshauptstadt Erfurt, die Positionierung der Stadt Erfurt auf dem nationalen und internationalen Tourismusmarkt als dynamische und sympathische Landeshauptstadt, attraktives Städtereiseziel und Tagungsstandort, die Vervollkommnung des touristischen Serviceangebotes entsprechend den Bedürfnissen der individuellen Gäste und der Tourismuswirtschaft und das Betreiben der Erfurt Tourist Information.
Im Januar 2009 wurde das Marketing für die Landeshauptstadt Erfurt an die ETMG übertragen und neu geordnet. Die Hauptaufgaben im Stadtmarketing liegen darin, die Wahrnehmung der Stadt in folgenden Bereichen zu verstärken: traditionsreicher und innovativer Wirtschaftsstandort, lebendiger und kreativer Wissenschaftsstandort, attraktiver Wohnstandort mit Flair und Sportstandort mit exzellenten Bedingungen für Nachwuchs- und Spitzensportler.
Gesellschafter: Stadt Erfurt
Geschäftsführerin: Frau Dr. Carmen Hildebrandt
Aufsichtsratsvorsitzender: Herr Dominik Kordon
Mitarbeiter: ca. 30 Angestellte, 4 Auszubildende",,,,,,,,,,,,,,,,,,,,,,,,,,
1 tx_thuecat_tourist_attraction
2 uid pid sys_language_uid l18n_parent l10n_source l10n_state remote_id title description managed_by town address offers media opening_hours slogan start_of_construction sanitation other_service museum_service architectural_style traffic_infrastructure payment_accepted digital_offer photography pets_allowed is_accessible_for_free public_access available_languages distance_to_public_transport parking_facility_near_by
3 1 10 0 0 0 \NULL https://thuecat.org/resources/835224016581-dara Dom St. Marien Über eine 70-stufige Freitreppe gelangt man vom Domplatz auf den Domberg mit seinen beiden ehemaligen Stiftskirchen. Der Dom, mit hochgotischem Chor, romanischem Turmbereich und spätgotischer Westhalle, ist Nachfolger des 724 von Rom veranlassten Sakralbaus. Er war die Hauptkirche des 742 von Bischof Bonifatius gegründeten Bistums Erfurt und während des Mittelalters bis in das frühe 19. Jahrhundert Sitz des Collegiatstifts St. Marien. 1507 erhielt Martin Luther hier die Priesterweihe. Der ursprünglich romanische Kirchenbau wurde in der Zeit der Gotik entscheidend umgebaut. Besonders sehenswert sind die gotischen Chorfenster, das umfängliche Chorgestühl (14. Jhd.) sowie die romanischen Skulpturen einer thronenden Madonna und eines monumentalen Kerzenträgers im Innenraum. Berühmt ist er auch wegen der „Gloriosa“, der mit 2,56 m Durchmesser größten freischwingenden mittelalterlichen Glocke der Welt. Das Ensemble von Dom und Severikirche bildet eine imposante Kulisse für die jährlich im Sommer stattfindenden DomStufen-Festspiele. 1 1 {"street":"Domstufen 1","zip":"99084","city":"Erfurt","email":"dominformation@domberg-erfurt.de","phone":"+49 361 6461265","fax":"","geo":{"latitude":50.975955358589545,"longitude":11.023667024961856}} [] [{"mainImage":true,"type":"image","title":"Erfurt-Dom und Severikirche-beleuchtet.jpg","description":"","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5159216\/Preview-1280x0\/image","copyrightYear":2016,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":""}},{"mainImage":false,"type":"image","title":"Erfurt-Dom-und-Severikirche.jpg","description":"Sicht auf Dom St. Marien, St. Severikirche sowie die davor liegenden Klostergeb\u00e4ude und einem Ausschnitt des Biergartens umgeben von einem d\u00e4mmerungsverf\u00e4rten Himmel","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5159186\/Preview-1280x0\/image","copyrightYear":2020,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":""}},{"mainImage":false,"type":"image","title":"Erfurt-Dom und Severikirche-beleuchtet.jpg","description":"","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5159216\/Preview-1280x0\/image","copyrightYear":2016,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":""}}] [{"opens":"09:30:00","closes":"18:00:00","from":{"date":"2021-05-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2021-10-31 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Saturday","Friday","Thursday","Tuesday","Monday","Wednesday"]},{"opens":"13:00:00","closes":"18:00:00","from":{"date":"2021-05-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2021-10-31 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Sunday"]},{"opens":"09:30:00","closes":"17:00:00","from":{"date":"2021-11-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2022-04-30 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Saturday","Friday","Thursday","Tuesday","Monday","Wednesday"]},{"opens":"13:00:00","closes":"17:00:00","from":{"date":"2021-11-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2022-04-30 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Sunday"]}] Toilets,DisabledToilets SeatingPossibilitiesRestArea,SouvenirShop GothicArt BicycleLockersEnumMem,BusParkCoachParkEnumMem AugmentedReality Fotogenehmigung für innen false true true German,English 350:MTR 1
4 2 10 1 1 1 \NULL https://thuecat.org/resources/835224016581-dara Cathedral of St. Mary The late Gothic cathedral with its high-Gothic choir and Romanesque tower replaced the church built on this site for Bishop Boniface in 742. The central tower houses the "Gloriosa", the world’s largest medieval free-swinging bell. 1 1 {"street":"Domstufen 1","zip":"99084","city":"Erfurt","email":"dominformation@domberg-erfurt.de","phone":"+49 361 6461265","fax":"","geo":{"latitude":50.975955358589545,"longitude":11.023667024961856}} [] [{"mainImage":true,"type":"image","title":"Erfurt-Dom und Severikirche-beleuchtet.jpg","description":"","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5159216\/Preview-1280x0\/image","copyrightYear":2016,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":""}},{"mainImage":false,"type":"image","title":"Erfurt-Dom-und-Severikirche.jpg","description":"Sicht auf Dom St. Marien, St. Severikirche sowie die davor liegenden Klostergeb\u00e4ude und einem Ausschnitt des Biergartens umgeben von einem d\u00e4mmerungsverf\u00e4rten Himmel","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5159186\/Preview-1280x0\/image","copyrightYear":2020,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":""}},{"mainImage":false,"type":"image","title":"Erfurt-Dom und Severikirche-beleuchtet.jpg","description":"","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5159216\/Preview-1280x0\/image","copyrightYear":2016,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":""}}] [{"opens":"09:30:00","closes":"18:00:00","from":{"date":"2021-05-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2021-10-31 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Saturday","Friday","Thursday","Tuesday","Monday","Wednesday"]},{"opens":"13:00:00","closes":"18:00:00","from":{"date":"2021-05-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2021-10-31 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Sunday"]},{"opens":"09:30:00","closes":"17:00:00","from":{"date":"2021-11-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2022-04-30 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Saturday","Friday","Thursday","Tuesday","Monday","Wednesday"]},{"opens":"13:00:00","closes":"17:00:00","from":{"date":"2021-11-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2022-04-30 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Sunday"]}] Toilets,DisabledToilets SeatingPossibilitiesRestArea,SouvenirShop GothicArt BicycleLockersEnumMem,BusParkCoachParkEnumMem AugmentedReality false true true German,English 350:MTR 1
5 3 10 0 0 0 \NULL https://thuecat.org/resources/165868194223-zmqf Alte Synagoge Beispiel Beschreibung 1 1 {"street":"Waagegasse 8","zip":"99084","city":"Erfurt","email":"altesynagoge@erfurt.de","phone":"+49 361 6551520","fax":"+49 361 6551669","geo":{"latitude":50.978765,"longitude":11.029133}} [{"title":"F\u00fchrungen","description":"Immer samstags, um 11:15 Uhr findet eine \u00f6ffentliche F\u00fchrung durch das Museum statt. Dauer etwa 90 Minuten","prices":[{"title":"Erwachsene","description":"","price":8,"currency":"EUR","rule":"PerPerson"},{"title":"Erm\u00e4\u00dfigt","description":"als erm\u00e4\u00dfigt gelten schulpflichtige Kinder, Auszubildende, Studierende, Rentner\/-innen, Menschen mit Behinderungen, Inhaber Sozialausweis der Landeshauptstadt Erfurt","price":5,"currency":"EUR","rule":"PerPerson"}]},{"title":"Eintritt","description":"Schulklassen und Kitagruppen im Rahmen des Unterrichts: Eintritt frei\nAn jedem ersten Dienstag im Monat: Eintritt frei","prices":[{"title":"Erm\u00e4\u00dfigt","description":"als erm\u00e4\u00dfigt gelten schulpflichtige Kinder, Auszubildende, Studierende, Rentner\/-innen, Menschen mit Behinderungen, Inhaber Sozialausweis der Landeshauptstadt Erfurt","price":5,"currency":"EUR","rule":"PerPerson"},{"title":"Familienkarte","description":"","price":17,"currency":"EUR","rule":"PerGroup"},{"title":"ErfurtCard","description":"","price":14.9,"currency":"EUR","rule":"PerPackage"},{"title":"Erwachsene","description":"","price":8,"currency":"EUR","rule":"PerPerson"}]}] [{"mainImage":true,"type":"image","title":"Erfurt-Alte Synagoge","description":"Frontaler Blick auf die Hausfront\/Hausfassade im Innenhof mit Zugang \u00fcber die Waagegasse","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5099196\/Preview-1280x0\/image","copyrightYear":2009,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":"F:\\Bilddatenbank\\Museen und Ausstellungen\\Alte Synagoge"}},{"mainImage":false,"type":"image","title":"Erfurt-Alte Synagoge","description":"Frontaler Blick auf die Hausfront\/Hausfassade im Innenhof mit Zugang \u00fcber die Waagegasse","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5099196\/Preview-1280x0\/image","copyrightYear":2009,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":"F:\\Bilddatenbank\\Museen und Ausstellungen\\Alte Synagoge"}}] [{"opens":"10:00:00","closes":"18:00:00","from":{"date":"2021-03-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2021-12-31 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Saturday","Sunday","Friday","Thursday","Tuesday","Wednesday"]}] Highlight 11. Jh. Toilets,DisabledToilets,NappyChangingArea,FamilyAndChildFriendly SeatingPossibilitiesRestArea,LockBoxes,SouvenirShop,BaggageStorage MuseumShop GothicArt ZeroSpecialTrafficInfrastructure CashPayment,EC AudioGuide,VideoGuide ZeroPhotography Tiere sind im Gebäude nicht gestattet, ausgenommen sind Blinden- und Blindenbegleithunde. false true German,English,French 200:MTR
6 4 10 1 3 3 \NULL https://thuecat.org/resources/165868194223-zmqf Old Synagogue The Old Synagogue is one of very few preserved medieval synagogues in Europe. Thanks to the extensive preservation of the original structure, it has a special place in the history of art and architecture and is among the most impressive and highly rated architectural monuments in Erfurt and Thuringia. The synagogue was constructed during the Middle Ages on the "via regia", one of the major European trade routes, at the heart of the historical old quarter very close to the Merchants Bridge and the town hall. Many parts of the structure still remain today, including all four thick outer walls, the Roman­esque gemel window, the Gothic rose window and the entrance to the synagogue room. 1 1 {"street":"Waagegasse 8","zip":"99084","city":"Erfurt","email":"altesynagoge@erfurt.de","phone":"+49 361 6551520","fax":"+49 361 6551669","geo":{"latitude":50.978765,"longitude":11.029133}} [{"title":"F\u00fchrungen","description":"Immer samstags, um 11:15 Uhr findet eine \u00f6ffentliche F\u00fchrung durch das Museum statt. Dauer etwa 90 Minuten","prices":[{"title":"Erwachsene","description":"","price":8,"currency":"EUR","rule":"PerPerson"},{"title":"Erm\u00e4\u00dfigt","description":"als erm\u00e4\u00dfigt gelten schulpflichtige Kinder, Auszubildende, Studierende, Rentner\/-innen, Menschen mit Behinderungen, Inhaber Sozialausweis der Landeshauptstadt Erfurt","price":5,"currency":"EUR","rule":"PerPerson"}]},{"title":"Eintritt","description":"Schulklassen und Kitagruppen im Rahmen des Unterrichts: Eintritt frei\nAn jedem ersten Dienstag im Monat: Eintritt frei","prices":[{"title":"Erm\u00e4\u00dfigt","description":"als erm\u00e4\u00dfigt gelten schulpflichtige Kinder, Auszubildende, Studierende, Rentner\/-innen, Menschen mit Behinderungen, Inhaber Sozialausweis der Landeshauptstadt Erfurt","price":5,"currency":"EUR","rule":"PerPerson"},{"title":"Familienkarte","description":"","price":17,"currency":"EUR","rule":"PerGroup"},{"title":"ErfurtCard","description":"","price":14.9,"currency":"EUR","rule":"PerPackage"},{"title":"Erwachsene","description":"","price":8,"currency":"EUR","rule":"PerPerson"}]}] [{"mainImage":true,"type":"image","title":"Erfurt-Alte Synagoge","description":"Frontaler Blick auf die Hausfront\/Hausfassade im Innenhof mit Zugang \u00fcber die Waagegasse","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5099196\/Preview-1280x0\/image","copyrightYear":2009,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":"F:\\Bilddatenbank\\Museen und Ausstellungen\\Alte Synagoge"}},{"mainImage":false,"type":"image","title":"Erfurt-Alte Synagoge","description":"Frontaler Blick auf die Hausfront\/Hausfassade im Innenhof mit Zugang \u00fcber die Waagegasse","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5099196\/Preview-1280x0\/image","copyrightYear":2009,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":"F:\\Bilddatenbank\\Museen und Ausstellungen\\Alte Synagoge"}}] [{"opens":"10:00:00","closes":"18:00:00","from":{"date":"2021-03-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2021-12-31 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Saturday","Sunday","Friday","Thursday","Tuesday","Wednesday"]}] Highlight 11th century Toilets,DisabledToilets,NappyChangingArea,FamilyAndChildFriendly SeatingPossibilitiesRestArea,LockBoxes,SouvenirShop,BaggageStorage MuseumShop GothicArt ZeroSpecialTrafficInfrastructure CashPayment,EC AudioGuide,VideoGuide ZeroPhotography false true German,English,French 200:MTR
7 5 10 2 3 3 \NULL https://thuecat.org/resources/165868194223-zmqf La vieille synagogue La vieille synagogue (datant des années 1100) est la synagogue la plus vieille d’Europe totalement conservée, dans laquelle est exposé un trésor datant des 13/14èmes siècles avec une alliance juive unique et des écritures hébraïques (datant des 12ème, 13ème et 14èmes siècles). Après la redécouverte du Mikwé, Erfurt abrite des témoins uniques et fascinants d’une communauté juive médiévale. 1 1 {"street":"Waagegasse 8","zip":"99084","city":"Erfurt","email":"altesynagoge@erfurt.de","phone":"+49 361 6551520","fax":"+49 361 6551669","geo":{"latitude":50.978765,"longitude":11.029133}} [{"title":"F\u00fchrungen","description":"Immer samstags, um 11:15 Uhr findet eine \u00f6ffentliche F\u00fchrung durch das Museum statt. Dauer etwa 90 Minuten","prices":[{"title":"Erwachsene","description":"","price":8,"currency":"EUR","rule":"PerPerson"},{"title":"Erm\u00e4\u00dfigt","description":"als erm\u00e4\u00dfigt gelten schulpflichtige Kinder, Auszubildende, Studierende, Rentner\/-innen, Menschen mit Behinderungen, Inhaber Sozialausweis der Landeshauptstadt Erfurt","price":5,"currency":"EUR","rule":"PerPerson"}]},{"title":"Eintritt","description":"Schulklassen und Kitagruppen im Rahmen des Unterrichts: Eintritt frei\nAn jedem ersten Dienstag im Monat: Eintritt frei","prices":[{"title":"Erm\u00e4\u00dfigt","description":"als erm\u00e4\u00dfigt gelten schulpflichtige Kinder, Auszubildende, Studierende, Rentner\/-innen, Menschen mit Behinderungen, Inhaber Sozialausweis der Landeshauptstadt Erfurt","price":5,"currency":"EUR","rule":"PerPerson"},{"title":"Familienkarte","description":"","price":17,"currency":"EUR","rule":"PerGroup"},{"title":"ErfurtCard","description":"","price":14.9,"currency":"EUR","rule":"PerPackage"},{"title":"Erwachsene","description":"","price":8,"currency":"EUR","rule":"PerPerson"}]}] [{"mainImage":true,"type":"image","title":"Erfurt-Alte Synagoge","description":"Frontaler Blick auf die Hausfront\/Hausfassade im Innenhof mit Zugang \u00fcber die Waagegasse","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5099196\/Preview-1280x0\/image","copyrightYear":2009,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":"F:\\Bilddatenbank\\Museen und Ausstellungen\\Alte Synagoge"}},{"mainImage":false,"type":"image","title":"Erfurt-Alte Synagoge","description":"Frontaler Blick auf die Hausfront\/Hausfassade im Innenhof mit Zugang \u00fcber die Waagegasse","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5099196\/Preview-1280x0\/image","copyrightYear":2009,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":"F:\\Bilddatenbank\\Museen und Ausstellungen\\Alte Synagoge"}}] [{"opens":"10:00:00","closes":"18:00:00","from":{"date":"2021-03-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2021-12-31 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Saturday","Sunday","Friday","Thursday","Tuesday","Wednesday"]}] Highlight Toilets,DisabledToilets,NappyChangingArea,FamilyAndChildFriendly SeatingPossibilitiesRestArea,LockBoxes,SouvenirShop,BaggageStorage MuseumShop GothicArt ZeroSpecialTrafficInfrastructure CashPayment,EC AudioGuide,VideoGuide ZeroPhotography false true German,English,French 200:MTR
8 6 10 0 0 0 \NULL https://thuecat.org/resources/215230952334-yyno Krämerbrücke Ein bekanntes Wahrzeichen Erfurts ist die Krämerbrücke, die längste bebaute und bewohnte Brücke Europas.Die Krämerbrücke wurde zu Beginn aus Holz und 1325 aus Stein erbaut. Zunächst war die 120 m lange Brücke mit 62 schmalen Häusern bebaut. Später wurden einige der Häuser auf nun mehr 32 zusammengefasst. An beiden Enden der Brücke standen zwei Brückenkopfkirchen. Heute existiert nur noch eine der beiden, die östlich gelegene Ägidienkirche.Auf der Krämerbrücke kann man in Galerien und Boutiquen sehr schön bummeln gehen. Man kann Thüringer Handwerksmeistern bei ihrer Arbeit über die Schulter schauen. Keramik, Porzellan und Holzschnitzereien, Blaudruck und Lauschaer Glas sind beliebte Souvenirs. Cafès, Weinhändler und Feinkostgeschäfte mit Thüringer Spezialitäten laden zum Verweilen ein. 1 1 {"street":"Benediktsplatz 1","zip":"99084","city":"Erfurt","email":"service@erfurt-tourismus.de","phone":"+49 361 66 400","fax":"","geo":{"latitude":50.978772,"longitude":11.031622}} [] [{"mainImage":true,"type":"image","title":"Erfurt-Kraemerbruecke-11.jpg","description":"Kr\u00e4merbr\u00fccke in Erfurt","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134362\/Preview-1280x0\/image","copyrightYear":2019,"license":{"type":"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de","author":"https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion"}},{"mainImage":false,"type":"image","title":"Erfurt-Kraemerbruecke.jpg","description":"Kr\u00e4merbr\u00fccke in Erfurt","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134288\/Preview-1280x0\/image","copyrightYear":2019,"license":{"type":"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de","author":"https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion"}},{"mainImage":false,"type":"image","title":"Erfurt-Kraemerbruecke-11.jpg","description":"Kr\u00e4merbr\u00fccke in Erfurt","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134362\/Preview-1280x0\/image","copyrightYear":2019,"license":{"type":"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de","author":"https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion"}},{"mainImage":false,"type":"image","title":"Erfurt-Kraemerbruecke-13.jpg","description":"Ansicht der Kr\u00e4merbr\u00fccke, Erfurt","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/652340\/Preview-1280x0\/image","copyrightYear":2019,"license":{"type":"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de","author":"https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion"}}] [] ZeroSanitation Playground,SeatingPossibilitiesRestArea,SouvenirShop,PlayCornerOrPlayArea ZeroInformationArchitecturalStyle BicycleLockersEnumMem ZeroDigitalOffer TakingPicturesPermitted true true true German,English,French 250:MTR 1,4
9 7 10 1 6 6 \NULL https://thuecat.org/resources/215230952334-yyno Merchants' Bridge Another Erfurt landmark is the Merchants' Bridge (Krämerbrücke), the longest series of inhabited buildings on any bridge in Europe. The Merchants' Bridge is Erfurts most interesting secular construction, initially in wood but rebuilt in stone in 1325. There were originally 62 narrow buildings along its 120-metre length, but subsequent redevelopment left just 32 buildings. Of what was once a pair of bridgehead churches, only the Church of St. Aegidius remains at the eastern end of the bridge today. The Merchants' Bridge is lined with galleries, cafés and boutiques offering traditional crafts, Thuringian blue printed fabrics, hand-painted ceramics, handblown glassware, jewellery, wood carvings, antiques and delicious Thuringian specialities - perfect for browsing. 1 1 {"street":"Benediktsplatz 1","zip":"99084","city":"Erfurt","email":"service@erfurt-tourismus.de","phone":"+49 361 66 400","fax":"","geo":{"latitude":50.978772,"longitude":11.031622}} [] [{"mainImage":true,"type":"image","title":"Erfurt-Kraemerbruecke-11.jpg","description":"Kr\u00e4merbr\u00fccke in Erfurt","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134362\/Preview-1280x0\/image","copyrightYear":2019,"license":{"type":"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de","author":"https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion"}},{"mainImage":false,"type":"image","title":"Erfurt-Kraemerbruecke.jpg","description":"Kr\u00e4merbr\u00fccke in Erfurt","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134288\/Preview-1280x0\/image","copyrightYear":2019,"license":{"type":"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de","author":"https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion"}},{"mainImage":false,"type":"image","title":"Erfurt-Kraemerbruecke-11.jpg","description":"Kr\u00e4merbr\u00fccke in Erfurt","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134362\/Preview-1280x0\/image","copyrightYear":2019,"license":{"type":"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de","author":"https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion"}},{"mainImage":false,"type":"image","title":"Erfurt-Kraemerbruecke-13.jpg","description":"Ansicht der Kr\u00e4merbr\u00fccke, Erfurt","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/652340\/Preview-1280x0\/image","copyrightYear":2019,"license":{"type":"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de","author":"https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion"}}] [] ZeroSanitation Playground,SeatingPossibilitiesRestArea,SouvenirShop,PlayCornerOrPlayArea ZeroInformationArchitecturalStyle BicycleLockersEnumMem ZeroDigitalOffer TakingPicturesPermitted true true true German,English,French 250:MTR 1,4
10 8 10 2 6 6 \NULL https://thuecat.org/resources/215230952334-yyno Pont de l'épicier Le pont de l’épicier est un des symboles de la ville d’Erfurt, le plus grand pont habité en continu d’Europe. A l’origine, le pont de l’épicier faisait 120 m de long et comptait 62 maisons étroites, qui furent plus tard regroupées en 32 maisons. Sur le pont de l’épicier se trouvent des galeries et des petites échoppes proposant des étoffes à motifs bleu indigo de Thuringe, des céramiques peintes main, du verre de Lauscha, des bijoux et des sculptures en bois. 1 1 {"street":"Benediktsplatz 1","zip":"99084","city":"Erfurt","email":"service@erfurt-tourismus.de","phone":"+49 361 66 400","fax":"","geo":{"latitude":50.978772,"longitude":11.031622}} [] [{"mainImage":true,"type":"image","title":"Erfurt-Kraemerbruecke-11.jpg","description":"Kr\u00e4merbr\u00fccke in Erfurt","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134362\/Preview-1280x0\/image","copyrightYear":2019,"license":{"type":"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de","author":"https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion"}},{"mainImage":false,"type":"image","title":"Erfurt-Kraemerbruecke.jpg","description":"Kr\u00e4merbr\u00fccke in Erfurt","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134288\/Preview-1280x0\/image","copyrightYear":2019,"license":{"type":"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de","author":"https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion"}},{"mainImage":false,"type":"image","title":"Erfurt-Kraemerbruecke-11.jpg","description":"Kr\u00e4merbr\u00fccke in Erfurt","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134362\/Preview-1280x0\/image","copyrightYear":2019,"license":{"type":"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de","author":"https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion"}},{"mainImage":false,"type":"image","title":"Erfurt-Kraemerbruecke-13.jpg","description":"Ansicht der Kr\u00e4merbr\u00fccke, Erfurt","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/652340\/Preview-1280x0\/image","copyrightYear":2019,"license":{"type":"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de","author":"https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion"}}] [] ZeroSanitation Playground,SeatingPossibilitiesRestArea,SouvenirShop,PlayCornerOrPlayArea ZeroInformationArchitecturalStyle BicycleLockersEnumMem ZeroDigitalOffer TakingPicturesPermitted true true true German,English,French 250:MTR 1,4
11 tx_thuecat_parking_facility
12 uid pid sys_language_uid l18n_parent l10n_source l10n_state remote_id title description managed_by address offers media opening_hours sanitation other_service traffic_infrastructure payment_accepted distance_to_public_transport
13 1 10 0 0 0 \NULL https://thuecat.org/resources/396420044896-drzt Parkhaus Domplatz Das Parkhaus Domplatz befindet sich unmittelbar unterhalb der Zitadelle Petersberg am nördlichen Rand des Domplatzes. Durch die zentrale Lage ist es ein idealer Ausgangspunkt für Stadtbummel und Erkundungen des Zentrums, des Petersbergs und des Andreasviertels. 1 {"street":"Bechtheimer Str. 1","zip":"99084","city":"Erfurt","email":"info@stadtwerke-erfurt.de","phone":"+49 361 5640","fax":"","geo":{"latitude":50.977648905044,"longitude":11.022127985954299}} [{"title":"","description":"","prices":[{"title":"","description":"","price":35,"currency":"EUR","rule":"PerCar"}]},{"title":"","description":"","prices":[{"title":"","description":"","price":1.5,"currency":"EUR","rule":"PerCar"}]},{"title":"","description":"","prices":[{"title":"","description":"","price":10,"currency":"EUR","rule":"PerCar"}]},{"title":"","description":"","prices":[{"title":"","description":"","price":50,"currency":"EUR","rule":"PerCar"}]}] [{"mainImage":true,"type":"image","title":"Erfurt-Parkhaus-Domplatz.jpg","description":"","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/6486108\/Preview-1280x0\/image","copyrightYear":2021,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":""}},{"mainImage":false,"type":"image","title":"Erfurt-Parkhaus-Domplatz.jpg","description":"","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/6486108\/Preview-1280x0\/image","copyrightYear":2021,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":""}}] [{"opens":"07:00:00","closes":"22:00:00","from":"","through":"","daysOfWeek":["Saturday","Friday","Thursday","Tuesday","Monday","Wednesday"]},{"opens":"09:00:00","closes":"22:00:00","from":"","through":"","daysOfWeek":["Sunday","PublicHolidays"]}] ZeroSanitation ZeroOtherServiceEnumMem ElectricVehicleCarChargingStationEnumMem 240:MTR
14 2 10 1 1 1 \NULL https://thuecat.org/resources/396420044896-drzt Car park Domplatz The Domplatz multi-storey car park is located directly below the Petersberg Citadel on the northern edge of the Domplatz. Its central location makes it an ideal starting point for strolling through the city and exploring the centre, the Petersberg and the Andreasviertel. 1 {"street":"Bechtheimer Str. 1","zip":"99084","city":"Erfurt","email":"info@stadtwerke-erfurt.de","phone":"+49 361 5640","fax":"","geo":{"latitude":50.977648905044,"longitude":11.022127985954299}} [{"title":"","description":"","prices":[{"title":"","description":"","price":35,"currency":"EUR","rule":"PerCar"}]},{"title":"","description":"","prices":[{"title":"","description":"","price":1.5,"currency":"EUR","rule":"PerCar"}]},{"title":"","description":"","prices":[{"title":"","description":"","price":10,"currency":"EUR","rule":"PerCar"}]},{"title":"","description":"","prices":[{"title":"","description":"","price":50,"currency":"EUR","rule":"PerCar"}]}] [{"mainImage":true,"type":"image","title":"Erfurt-Parkhaus-Domplatz.jpg","description":"","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/6486108\/Preview-1280x0\/image","copyrightYear":2021,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":""}},{"mainImage":false,"type":"image","title":"Erfurt-Parkhaus-Domplatz.jpg","description":"","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/6486108\/Preview-1280x0\/image","copyrightYear":2021,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":""}}] [{"opens":"07:00:00","closes":"22:00:00","from":"","through":"","daysOfWeek":["Saturday","Friday","Thursday","Tuesday","Monday","Wednesday"]},{"opens":"09:00:00","closes":"22:00:00","from":"","through":"","daysOfWeek":["Sunday","PublicHolidays"]}] ZeroSanitation ZeroOtherServiceEnumMem ElectricVehicleCarChargingStationEnumMem 240:MTR
15 3 10 2 1 1 \NULL https://thuecat.org/resources/396420044896-drzt Parking Domplatz Le parking à étages de la Domplatz est situé juste en dessous de la citadelle de Petersberg, sur le bord nord de la Domplatz. Son emplacement central en fait un point de départ idéal pour se promener dans la ville et explorer le centre, le Petersberg et l'Andreasviertel. 1 {"street":"Bechtheimer Str. 1","zip":"99084","city":"Erfurt","email":"info@stadtwerke-erfurt.de","phone":"+49 361 5640","fax":"","geo":{"latitude":50.977648905044,"longitude":11.022127985954299}} [{"title":"","description":"","prices":[{"title":"","description":"","price":35,"currency":"EUR","rule":"PerCar"}]},{"title":"","description":"","prices":[{"title":"","description":"","price":1.5,"currency":"EUR","rule":"PerCar"}]},{"title":"","description":"","prices":[{"title":"","description":"","price":10,"currency":"EUR","rule":"PerCar"}]},{"title":"","description":"","prices":[{"title":"","description":"","price":50,"currency":"EUR","rule":"PerCar"}]}] [{"mainImage":true,"type":"image","title":"Erfurt-Parkhaus-Domplatz.jpg","description":"","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/6486108\/Preview-1280x0\/image","copyrightYear":2021,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":""}},{"mainImage":false,"type":"image","title":"Erfurt-Parkhaus-Domplatz.jpg","description":"","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/6486108\/Preview-1280x0\/image","copyrightYear":2021,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":""}}] [{"opens":"07:00:00","closes":"22:00:00","from":"","through":"","daysOfWeek":["Saturday","Friday","Thursday","Tuesday","Monday","Wednesday"]},{"opens":"09:00:00","closes":"22:00:00","from":"","through":"","daysOfWeek":["Sunday","PublicHolidays"]}] ZeroSanitation ZeroOtherServiceEnumMem ElectricVehicleCarChargingStationEnumMem 240:MTR
16 4 10 0 0 0 \NULL https://thuecat.org/resources/440055527204-ocar Q-Park Anger 1 Parkhaus Der Q-Park liegt direkt hinter dem Kaufhaus Anger 1 im Erfurter Stadtzentrum und ist über Juri-Gagarin-Ring/Meyfartstraße zu erreichen. Durch die direkte Anbindung an den Stadtring, ist das Parkhaus gut von außerhalb über Schnellstraßen und Autobahnen zu erreichen und befindet sich gleichzeitig im unmittelbaren modernen Zentrum Erfurts. 1 {"street":"Anger 1","zip":"99084","city":"Erfurt","email":"servicecenter@q-park.de","phone":"+49 218 18190290","fax":"","geo":{"latitude":50.977999330565794,"longitude":11.037503264052475}} [{"title":"","description":"","prices":[{"title":"","description":"","price":2.2,"currency":"EUR","rule":"PerCar"}]},{"title":"","description":"","prices":[{"title":"","description":"","price":1,"currency":"EUR","rule":"PerCar"}]},{"title":"","description":"","prices":[{"title":"","description":"","price":13,"currency":"EUR","rule":"PerCar"}]}] [{"mainImage":true,"type":"image","title":"Q-Park-Parkhaus-Anger1-Juri-Gagarin-Ring.JPG","description":"Stra\u00dfenansicht des Parkhauses Q-Park am Kaufhaus Anger 1, schr\u00e4g \u00fcber den Juri-Gagarin-Ring","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5197164\/Preview-1280x0\/image","copyrightYear":2020,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":""}},{"mainImage":false,"type":"image","title":"Q-Park-Parkhaus-Anger1-Juri-Gagarin-Ring.JPG","description":"Stra\u00dfenansicht des Parkhauses Q-Park am Kaufhaus Anger 1, schr\u00e4g \u00fcber den Juri-Gagarin-Ring","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5197164\/Preview-1280x0\/image","copyrightYear":2020,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":""}}] [{"opens":"05:30:00","closes":"23:59:00","from":{"date":"2020-12-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2021-12-31 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Saturday","Sunday","Friday","Thursday","Tuesday","Monday","Wednesday"]}] Toilets ZeroOtherServiceEnumMem 120:MTR
17 5 10 1 4 4 \NULL https://thuecat.org/resources/440055527204-ocar Q-Park Anger 1 multi-storey car park The Q-Park is located directly behind the department store Anger 1 in Erfurt's city centre and can be reached via Juri-Gagarin-Ring/Meyfartstraße. 1 {"street":"Anger 1","zip":"99084","city":"Erfurt","email":"servicecenter@q-park.de","phone":"+49 218 18190290","fax":"","geo":{"latitude":50.977999330565794,"longitude":11.037503264052475}} [{"title":"","description":"","prices":[{"title":"","description":"","price":2.2,"currency":"EUR","rule":"PerCar"}]},{"title":"","description":"","prices":[{"title":"","description":"","price":1,"currency":"EUR","rule":"PerCar"}]},{"title":"","description":"","prices":[{"title":"","description":"","price":13,"currency":"EUR","rule":"PerCar"}]}] [{"mainImage":true,"type":"image","title":"Q-Park-Parkhaus-Anger1-Juri-Gagarin-Ring.JPG","description":"Stra\u00dfenansicht des Parkhauses Q-Park am Kaufhaus Anger 1, schr\u00e4g \u00fcber den Juri-Gagarin-Ring","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5197164\/Preview-1280x0\/image","copyrightYear":2020,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":""}},{"mainImage":false,"type":"image","title":"Q-Park-Parkhaus-Anger1-Juri-Gagarin-Ring.JPG","description":"Stra\u00dfenansicht des Parkhauses Q-Park am Kaufhaus Anger 1, schr\u00e4g \u00fcber den Juri-Gagarin-Ring","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5197164\/Preview-1280x0\/image","copyrightYear":2020,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":""}}] [{"opens":"05:30:00","closes":"23:59:00","from":{"date":"2020-12-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2021-12-31 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Saturday","Sunday","Friday","Thursday","Tuesday","Monday","Wednesday"]}] Toilets ZeroOtherServiceEnumMem 120:MTR
18 6 10 2 4 4 \NULL https://thuecat.org/resources/440055527204-ocar Q-Park Anger 1 parking à étages Le Q-Park est situé directement derrière le grand magasin Anger 1 dans le centre-ville d'Erfurt et peut être atteint par la Juri-Gagarin-Ring/Meyfartstraße. 1 {"street":"Anger 1","zip":"99084","city":"Erfurt","email":"servicecenter@q-park.de","phone":"+49 218 18190290","fax":"","geo":{"latitude":50.977999330565794,"longitude":11.037503264052475}} [{"title":"","description":"","prices":[{"title":"","description":"","price":2.2,"currency":"EUR","rule":"PerCar"}]},{"title":"","description":"","prices":[{"title":"","description":"","price":1,"currency":"EUR","rule":"PerCar"}]},{"title":"","description":"","prices":[{"title":"","description":"","price":13,"currency":"EUR","rule":"PerCar"}]}] [{"mainImage":true,"type":"image","title":"Q-Park-Parkhaus-Anger1-Juri-Gagarin-Ring.JPG","description":"Stra\u00dfenansicht des Parkhauses Q-Park am Kaufhaus Anger 1, schr\u00e4g \u00fcber den Juri-Gagarin-Ring","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5197164\/Preview-1280x0\/image","copyrightYear":2020,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":""}},{"mainImage":false,"type":"image","title":"Q-Park-Parkhaus-Anger1-Juri-Gagarin-Ring.JPG","description":"Stra\u00dfenansicht des Parkhauses Q-Park am Kaufhaus Anger 1, schr\u00e4g \u00fcber den Juri-Gagarin-Ring","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5197164\/Preview-1280x0\/image","copyrightYear":2020,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":""}}] [{"opens":"05:30:00","closes":"23:59:00","from":{"date":"2020-12-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2021-12-31 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Saturday","Sunday","Friday","Thursday","Tuesday","Monday","Wednesday"]}] Toilets ZeroOtherServiceEnumMem 120:MTR
19 tx_thuecat_organisation
20 uid pid remote_id title description
21 1 10 https://thuecat.org/resources/018132452787-ngbe Erfurt Tourismus und Marketing GmbH Die Erfurt Tourismus & Marketing GmbH (ETMG) wurde 1997 als offizielle Organisation zur Tourismusförderung in der Landeshauptstadt Erfurt gegründet und nahm am 01.01.1998 die Geschäftstätigkeit auf. Zu den Aufgaben zählen die kommunale Tourismusförderung als wesentliches Instrument der Wirtschafts- und Stadtentwicklung der Landeshauptstadt Erfurt, die Positionierung der Stadt Erfurt auf dem nationalen und internationalen Tourismusmarkt als dynamische und sympathische Landeshauptstadt, attraktives Städtereiseziel und Tagungsstandort, die Vervollkommnung des touristischen Serviceangebotes entsprechend den Bedürfnissen der individuellen Gäste und der Tourismuswirtschaft und das Betreiben der Erfurt Tourist Information. Im Januar 2009 wurde das Marketing für die Landeshauptstadt Erfurt an die ETMG übertragen und neu geordnet. Die Hauptaufgaben im Stadtmarketing liegen darin, die Wahrnehmung der Stadt in folgenden Bereichen zu verstärken: traditionsreicher und innovativer Wirtschaftsstandort, lebendiger und kreativer Wissenschaftsstandort, attraktiver Wohnstandort mit Flair und Sportstandort mit exzellenten Bedingungen für Nachwuchs- und Spitzensportler. Gesellschafter: Stadt Erfurt Geschäftsführerin: Frau Dr. Carmen Hildebrandt Aufsichtsratsvorsitzender: Herr Dominik Kordon Mitarbeiter: ca. 30 Angestellte, 4 Auszubildende

View file

@ -106,18 +106,4 @@
<tourist_information>0</tourist_information>
<title>Erfurt</title>
</tx_thuecat_town>
<tx_thuecat_organisation>
<uid>1</uid>
<pid>10</pid>
<tstamp>1613400969</tstamp>
<crdate>1613400969</crdate>
<cruser_id>1</cruser_id>
<disable>0</disable>
<remote_id>https://thuecat.org/resources/018132452787-ngbe</remote_id>
<title>Erfurt Tourismus und Marketing GmbH</title>
<description>Die Erfurt Tourismus &amp; Marketing GmbH (ETMG) wurde 1997 als offizielle Organisation zur Tourismusförderung in der Landeshauptstadt Erfurt gegründet und nahm am 01.0 1.1998 die Geschäftstätigkeit auf.</description>
<manages_towns>0</manages_towns>
<manages_tourist_information>0</manages_tourist_information>
</tx_thuecat_organisation>
</dataset>

View file

@ -1,10 +0,0 @@
"tx_thuecat_tourist_attraction",,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,"uid","pid","sys_language_uid","l18n_parent","l10n_source","l10n_state","remote_id","title","managed_by","town","address","offers","media","opening_hours","slogan","start_of_construction","sanitation","other_service","museum_service","architectural_style","traffic_infrastructure","payment_accepted","digital_offer","photography","pets_allowed","is_accessible_for_free","public_access","available_languages","distance_to_public_transport"
,1,10,0,0,0,"\NULL","https://thuecat.org/resources/835224016581-dara","Dom St. Marien",1,1,"{""street"":""Domstufen 1"",""zip"":""99084"",""city"":""Erfurt"",""email"":""dominformation@domberg-erfurt.de"",""phone"":""+49 361 6461265"",""fax"":"""",""geo"":{""latitude"":50.975955358589545,""longitude"":11.023667024961856}}","[]","[{""mainImage"":true,""type"":""image"",""title"":""Erfurt-Dom und Severikirche-beleuchtet.jpg"",""description"":"""",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5159216\/Preview-1280x0\/image"",""copyrightYear"":2016,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Dom-und-Severikirche.jpg"",""description"":""Sicht auf Dom St. Marien, St. Severikirche sowie die davor liegenden Klostergeb\u00e4ude und einem Ausschnitt des Biergartens umgeben von einem d\u00e4mmerungsverf\u00e4rten Himmel"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5159186\/Preview-1280x0\/image"",""copyrightYear"":2020,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Dom und Severikirche-beleuchtet.jpg"",""description"":"""",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5159216\/Preview-1280x0\/image"",""copyrightYear"":2016,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""""}}]","[{""opens"":""09:30:00"",""closes"":""18:00:00"",""from"":{""date"":""2021-05-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2021-10-31 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Saturday"",""Friday"",""Thursday"",""Tuesday"",""Monday"",""Wednesday""]},{""opens"":""13:00:00"",""closes"":""18:00:00"",""from"":{""date"":""2021-05-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2021-10-31 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Sunday""]},{""opens"":""09:30:00"",""closes"":""17:00:00"",""from"":{""date"":""2021-11-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2022-04-30 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Saturday"",""Friday"",""Thursday"",""Tuesday"",""Monday"",""Wednesday""]},{""opens"":""13:00:00"",""closes"":""17:00:00"",""from"":{""date"":""2021-11-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2022-04-30 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Sunday""]}]",,,"Toilets,DisabledToilets","SeatingPossibilitiesRestArea,SouvenirShop",,"GothicArt","BicycleLockersEnumMem,BusParkCoachParkEnumMem",,"AugmentedReality","Fotogenehmigung für innen","false","true","true","German,English","350:MTR"
,2,10,1,1,1,"\NULL","https://thuecat.org/resources/835224016581-dara","Cathedral of St. Mary",1,1,"{""street"":""Domstufen 1"",""zip"":""99084"",""city"":""Erfurt"",""email"":""dominformation@domberg-erfurt.de"",""phone"":""+49 361 6461265"",""fax"":"""",""geo"":{""latitude"":50.975955358589545,""longitude"":11.023667024961856}}","[]","[{""mainImage"":true,""type"":""image"",""title"":""Erfurt-Dom und Severikirche-beleuchtet.jpg"",""description"":"""",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5159216\/Preview-1280x0\/image"",""copyrightYear"":2016,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Dom-und-Severikirche.jpg"",""description"":""Sicht auf Dom St. Marien, St. Severikirche sowie die davor liegenden Klostergeb\u00e4ude und einem Ausschnitt des Biergartens umgeben von einem d\u00e4mmerungsverf\u00e4rten Himmel"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5159186\/Preview-1280x0\/image"",""copyrightYear"":2020,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Dom und Severikirche-beleuchtet.jpg"",""description"":"""",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5159216\/Preview-1280x0\/image"",""copyrightYear"":2016,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""""}}]","[{""opens"":""09:30:00"",""closes"":""18:00:00"",""from"":{""date"":""2021-05-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2021-10-31 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Saturday"",""Friday"",""Thursday"",""Tuesday"",""Monday"",""Wednesday""]},{""opens"":""13:00:00"",""closes"":""18:00:00"",""from"":{""date"":""2021-05-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2021-10-31 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Sunday""]},{""opens"":""09:30:00"",""closes"":""17:00:00"",""from"":{""date"":""2021-11-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2022-04-30 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Saturday"",""Friday"",""Thursday"",""Tuesday"",""Monday"",""Wednesday""]},{""opens"":""13:00:00"",""closes"":""17:00:00"",""from"":{""date"":""2021-11-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2022-04-30 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Sunday""]}]",,,"Toilets,DisabledToilets","SeatingPossibilitiesRestArea,SouvenirShop",,"GothicArt","BicycleLockersEnumMem,BusParkCoachParkEnumMem",,"AugmentedReality",,"false","true","true","German,English","350:MTR"
,3,10,0,0,0,"\NULL","https://thuecat.org/resources/165868194223-zmqf","Alte Synagoge",1,1,"{""street"":""Waagegasse 8"",""zip"":""99084"",""city"":""Erfurt"",""email"":""altesynagoge@erfurt.de"",""phone"":""+49 361 6551520"",""fax"":""+49 361 6551669"",""geo"":{""latitude"":50.978765,""longitude"":11.029133}}","[{""title"":""F\u00fchrungen"",""description"":""Immer samstags, um 11:15 Uhr findet eine \u00f6ffentliche F\u00fchrung durch das Museum statt. Dauer etwa 90 Minuten"",""prices"":[{""title"":""Erwachsene"",""description"":"""",""price"":8,""currency"":""EUR"",""rule"":""PerPerson""},{""title"":""Erm\u00e4\u00dfigt"",""description"":""als erm\u00e4\u00dfigt gelten schulpflichtige Kinder, Auszubildende, Studierende, Rentner\/-innen, Menschen mit Behinderungen, Inhaber Sozialausweis der Landeshauptstadt Erfurt"",""price"":5,""currency"":""EUR"",""rule"":""PerPerson""}]},{""title"":""Eintritt"",""description"":""Schulklassen und Kitagruppen im Rahmen des Unterrichts: Eintritt frei\nAn jedem ersten Dienstag im Monat: Eintritt frei"",""prices"":[{""title"":""Erm\u00e4\u00dfigt"",""description"":""als erm\u00e4\u00dfigt gelten schulpflichtige Kinder, Auszubildende, Studierende, Rentner\/-innen, Menschen mit Behinderungen, Inhaber Sozialausweis der Landeshauptstadt Erfurt"",""price"":5,""currency"":""EUR"",""rule"":""PerPerson""},{""title"":""Familienkarte"",""description"":"""",""price"":17,""currency"":""EUR"",""rule"":""PerGroup""},{""title"":""ErfurtCard"",""description"":"""",""price"":14.9,""currency"":""EUR"",""rule"":""PerPackage""},{""title"":""Erwachsene"",""description"":"""",""price"":8,""currency"":""EUR"",""rule"":""PerPerson""}]}]","[{""mainImage"":true,""type"":""image"",""title"":""Erfurt-Alte Synagoge"",""description"":""Frontaler Blick auf die Hausfront\/Hausfassade im Innenhof mit Zugang \u00fcber die Waagegasse"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5099196\/Preview-1280x0\/image"",""copyrightYear"":2009,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""F:\\Bilddatenbank\\Museen und Ausstellungen\\Alte Synagoge""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Alte Synagoge"",""description"":""Frontaler Blick auf die Hausfront\/Hausfassade im Innenhof mit Zugang \u00fcber die Waagegasse"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5099196\/Preview-1280x0\/image"",""copyrightYear"":2009,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""F:\\Bilddatenbank\\Museen und Ausstellungen\\Alte Synagoge""}}]","[{""opens"":""10:00:00"",""closes"":""18:00:00"",""from"":{""date"":""2021-03-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2021-12-31 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Saturday"",""Sunday"",""Friday"",""Thursday"",""Tuesday"",""Wednesday""]}]","Highlight","11. Jh.","Toilets,DisabledToilets,NappyChangingArea,FamilyAndChildFriendly","SeatingPossibilitiesRestArea,LockBoxes,SouvenirShop,BaggageStorage","MuseumShop","GothicArt","ZeroSpecialTrafficInfrastructure","CashPayment,EC","AudioGuide,VideoGuide","ZeroPhotography","Tiere sind im Gebäude nicht gestattet, ausgenommen sind Blinden- und Blindenbegleithunde.","false","true","German,English,French","200:MTR"
,4,10,1,3,3,"\NULL","https://thuecat.org/resources/165868194223-zmqf","Old Synagogue",1,1,"{""street"":""Waagegasse 8"",""zip"":""99084"",""city"":""Erfurt"",""email"":""altesynagoge@erfurt.de"",""phone"":""+49 361 6551520"",""fax"":""+49 361 6551669"",""geo"":{""latitude"":50.978765,""longitude"":11.029133}}","[{""title"":""F\u00fchrungen"",""description"":""Immer samstags, um 11:15 Uhr findet eine \u00f6ffentliche F\u00fchrung durch das Museum statt. Dauer etwa 90 Minuten"",""prices"":[{""title"":""Erwachsene"",""description"":"""",""price"":8,""currency"":""EUR"",""rule"":""PerPerson""},{""title"":""Erm\u00e4\u00dfigt"",""description"":""als erm\u00e4\u00dfigt gelten schulpflichtige Kinder, Auszubildende, Studierende, Rentner\/-innen, Menschen mit Behinderungen, Inhaber Sozialausweis der Landeshauptstadt Erfurt"",""price"":5,""currency"":""EUR"",""rule"":""PerPerson""}]},{""title"":""Eintritt"",""description"":""Schulklassen und Kitagruppen im Rahmen des Unterrichts: Eintritt frei\nAn jedem ersten Dienstag im Monat: Eintritt frei"",""prices"":[{""title"":""Erm\u00e4\u00dfigt"",""description"":""als erm\u00e4\u00dfigt gelten schulpflichtige Kinder, Auszubildende, Studierende, Rentner\/-innen, Menschen mit Behinderungen, Inhaber Sozialausweis der Landeshauptstadt Erfurt"",""price"":5,""currency"":""EUR"",""rule"":""PerPerson""},{""title"":""Familienkarte"",""description"":"""",""price"":17,""currency"":""EUR"",""rule"":""PerGroup""},{""title"":""ErfurtCard"",""description"":"""",""price"":14.9,""currency"":""EUR"",""rule"":""PerPackage""},{""title"":""Erwachsene"",""description"":"""",""price"":8,""currency"":""EUR"",""rule"":""PerPerson""}]}]","[{""mainImage"":true,""type"":""image"",""title"":""Erfurt-Alte Synagoge"",""description"":""Frontaler Blick auf die Hausfront\/Hausfassade im Innenhof mit Zugang \u00fcber die Waagegasse"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5099196\/Preview-1280x0\/image"",""copyrightYear"":2009,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""F:\\Bilddatenbank\\Museen und Ausstellungen\\Alte Synagoge""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Alte Synagoge"",""description"":""Frontaler Blick auf die Hausfront\/Hausfassade im Innenhof mit Zugang \u00fcber die Waagegasse"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5099196\/Preview-1280x0\/image"",""copyrightYear"":2009,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""F:\\Bilddatenbank\\Museen und Ausstellungen\\Alte Synagoge""}}]","[{""opens"":""10:00:00"",""closes"":""18:00:00"",""from"":{""date"":""2021-03-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2021-12-31 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Saturday"",""Sunday"",""Friday"",""Thursday"",""Tuesday"",""Wednesday""]}]","Highlight","11th century","Toilets,DisabledToilets,NappyChangingArea,FamilyAndChildFriendly","SeatingPossibilitiesRestArea,LockBoxes,SouvenirShop,BaggageStorage","MuseumShop","GothicArt","ZeroSpecialTrafficInfrastructure","CashPayment,EC","AudioGuide,VideoGuide","ZeroPhotography",,"false","true","German,English,French","200:MTR"
,5,10,2,3,3,"\NULL","https://thuecat.org/resources/165868194223-zmqf","La vieille synagogue",1,1,"{""street"":""Waagegasse 8"",""zip"":""99084"",""city"":""Erfurt"",""email"":""altesynagoge@erfurt.de"",""phone"":""+49 361 6551520"",""fax"":""+49 361 6551669"",""geo"":{""latitude"":50.978765,""longitude"":11.029133}}","[{""title"":""F\u00fchrungen"",""description"":""Immer samstags, um 11:15 Uhr findet eine \u00f6ffentliche F\u00fchrung durch das Museum statt. Dauer etwa 90 Minuten"",""prices"":[{""title"":""Erwachsene"",""description"":"""",""price"":8,""currency"":""EUR"",""rule"":""PerPerson""},{""title"":""Erm\u00e4\u00dfigt"",""description"":""als erm\u00e4\u00dfigt gelten schulpflichtige Kinder, Auszubildende, Studierende, Rentner\/-innen, Menschen mit Behinderungen, Inhaber Sozialausweis der Landeshauptstadt Erfurt"",""price"":5,""currency"":""EUR"",""rule"":""PerPerson""}]},{""title"":""Eintritt"",""description"":""Schulklassen und Kitagruppen im Rahmen des Unterrichts: Eintritt frei\nAn jedem ersten Dienstag im Monat: Eintritt frei"",""prices"":[{""title"":""Erm\u00e4\u00dfigt"",""description"":""als erm\u00e4\u00dfigt gelten schulpflichtige Kinder, Auszubildende, Studierende, Rentner\/-innen, Menschen mit Behinderungen, Inhaber Sozialausweis der Landeshauptstadt Erfurt"",""price"":5,""currency"":""EUR"",""rule"":""PerPerson""},{""title"":""Familienkarte"",""description"":"""",""price"":17,""currency"":""EUR"",""rule"":""PerGroup""},{""title"":""ErfurtCard"",""description"":"""",""price"":14.9,""currency"":""EUR"",""rule"":""PerPackage""},{""title"":""Erwachsene"",""description"":"""",""price"":8,""currency"":""EUR"",""rule"":""PerPerson""}]}]","[{""mainImage"":true,""type"":""image"",""title"":""Erfurt-Alte Synagoge"",""description"":""Frontaler Blick auf die Hausfront\/Hausfassade im Innenhof mit Zugang \u00fcber die Waagegasse"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5099196\/Preview-1280x0\/image"",""copyrightYear"":2009,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""F:\\Bilddatenbank\\Museen und Ausstellungen\\Alte Synagoge""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Alte Synagoge"",""description"":""Frontaler Blick auf die Hausfront\/Hausfassade im Innenhof mit Zugang \u00fcber die Waagegasse"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5099196\/Preview-1280x0\/image"",""copyrightYear"":2009,""license"":{""type"":""https:\/\/creativecommons.org\/licenses\/by\/4.0\/"",""author"":""F:\\Bilddatenbank\\Museen und Ausstellungen\\Alte Synagoge""}}]","[{""opens"":""10:00:00"",""closes"":""18:00:00"",""from"":{""date"":""2021-03-01 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""through"":{""date"":""2021-12-31 00:00:00.000000"",""timezone_type"":3,""timezone"":""UTC""},""daysOfWeek"":[""Saturday"",""Sunday"",""Friday"",""Thursday"",""Tuesday"",""Wednesday""]}]","Highlight",,"Toilets,DisabledToilets,NappyChangingArea,FamilyAndChildFriendly","SeatingPossibilitiesRestArea,LockBoxes,SouvenirShop,BaggageStorage","MuseumShop","GothicArt","ZeroSpecialTrafficInfrastructure","CashPayment,EC","AudioGuide,VideoGuide","ZeroPhotography",,"false","true","German,English,French","200:MTR"
,6,10,0,0,0,"\NULL","https://thuecat.org/resources/215230952334-yyno","Krämerbrücke",1,1,"{""street"":""Benediktsplatz 1"",""zip"":""99084"",""city"":""Erfurt"",""email"":""service@erfurt-tourismus.de"",""phone"":""+49 361 66 400"",""fax"":"""",""geo"":{""latitude"":50.978772,""longitude"":11.031622}}","[]","[{""mainImage"":true,""type"":""image"",""title"":""Erfurt-Kraemerbruecke-11.jpg"",""description"":""Kr\u00e4merbr\u00fccke in Erfurt"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134362\/Preview-1280x0\/image"",""copyrightYear"":2019,""license"":{""type"":""https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de"",""author"":""https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Kraemerbruecke.jpg"",""description"":""Kr\u00e4merbr\u00fccke in Erfurt"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134288\/Preview-1280x0\/image"",""copyrightYear"":2019,""license"":{""type"":""https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de"",""author"":""https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Kraemerbruecke-11.jpg"",""description"":""Kr\u00e4merbr\u00fccke in Erfurt"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134362\/Preview-1280x0\/image"",""copyrightYear"":2019,""license"":{""type"":""https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de"",""author"":""https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Kraemerbruecke-13.jpg"",""description"":""Ansicht der Kr\u00e4merbr\u00fccke, Erfurt"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/652340\/Preview-1280x0\/image"",""copyrightYear"":2019,""license"":{""type"":""https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de"",""author"":""https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion""}}]","[]",,,"ZeroSanitation","Playground,SeatingPossibilitiesRestArea,SouvenirShop,PlayCornerOrPlayArea",,"ZeroInformationArchitecturalStyle","BicycleLockersEnumMem",,"ZeroDigitalOffer","TakingPicturesPermitted","true","true","true","German,English,French","250:MTR"
,7,10,1,6,6,"\NULL","https://thuecat.org/resources/215230952334-yyno","Merchants' Bridge",1,1,"{""street"":""Benediktsplatz 1"",""zip"":""99084"",""city"":""Erfurt"",""email"":""service@erfurt-tourismus.de"",""phone"":""+49 361 66 400"",""fax"":"""",""geo"":{""latitude"":50.978772,""longitude"":11.031622}}","[]","[{""mainImage"":true,""type"":""image"",""title"":""Erfurt-Kraemerbruecke-11.jpg"",""description"":""Kr\u00e4merbr\u00fccke in Erfurt"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134362\/Preview-1280x0\/image"",""copyrightYear"":2019,""license"":{""type"":""https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de"",""author"":""https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Kraemerbruecke.jpg"",""description"":""Kr\u00e4merbr\u00fccke in Erfurt"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134288\/Preview-1280x0\/image"",""copyrightYear"":2019,""license"":{""type"":""https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de"",""author"":""https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Kraemerbruecke-11.jpg"",""description"":""Kr\u00e4merbr\u00fccke in Erfurt"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134362\/Preview-1280x0\/image"",""copyrightYear"":2019,""license"":{""type"":""https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de"",""author"":""https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Kraemerbruecke-13.jpg"",""description"":""Ansicht der Kr\u00e4merbr\u00fccke, Erfurt"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/652340\/Preview-1280x0\/image"",""copyrightYear"":2019,""license"":{""type"":""https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de"",""author"":""https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion""}}]","[]",,,"ZeroSanitation","Playground,SeatingPossibilitiesRestArea,SouvenirShop,PlayCornerOrPlayArea",,"ZeroInformationArchitecturalStyle","BicycleLockersEnumMem",,"ZeroDigitalOffer","TakingPicturesPermitted","true","true","true","German,English,French","250:MTR"
,8,10,2,6,6,"\NULL","https://thuecat.org/resources/215230952334-yyno","Pont de l'épicier",1,1,"{""street"":""Benediktsplatz 1"",""zip"":""99084"",""city"":""Erfurt"",""email"":""service@erfurt-tourismus.de"",""phone"":""+49 361 66 400"",""fax"":"""",""geo"":{""latitude"":50.978772,""longitude"":11.031622}}","[]","[{""mainImage"":true,""type"":""image"",""title"":""Erfurt-Kraemerbruecke-11.jpg"",""description"":""Kr\u00e4merbr\u00fccke in Erfurt"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134362\/Preview-1280x0\/image"",""copyrightYear"":2019,""license"":{""type"":""https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de"",""author"":""https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Kraemerbruecke.jpg"",""description"":""Kr\u00e4merbr\u00fccke in Erfurt"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134288\/Preview-1280x0\/image"",""copyrightYear"":2019,""license"":{""type"":""https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de"",""author"":""https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Kraemerbruecke-11.jpg"",""description"":""Kr\u00e4merbr\u00fccke in Erfurt"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134362\/Preview-1280x0\/image"",""copyrightYear"":2019,""license"":{""type"":""https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de"",""author"":""https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion""}},{""mainImage"":false,""type"":""image"",""title"":""Erfurt-Kraemerbruecke-13.jpg"",""description"":""Ansicht der Kr\u00e4merbr\u00fccke, Erfurt"",""url"":""https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/652340\/Preview-1280x0\/image"",""copyrightYear"":2019,""license"":{""type"":""https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de"",""author"":""https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion""}}]","[]",,,"ZeroSanitation","Playground,SeatingPossibilitiesRestArea,SouvenirShop,PlayCornerOrPlayArea",,"ZeroInformationArchitecturalStyle","BicycleLockersEnumMem",,"ZeroDigitalOffer","TakingPicturesPermitted","true","true","true","German,English,French","250:MTR"
1 tx_thuecat_tourist_attraction
2 uid pid sys_language_uid l18n_parent l10n_source l10n_state remote_id title managed_by town address offers media opening_hours slogan start_of_construction sanitation other_service museum_service architectural_style traffic_infrastructure payment_accepted digital_offer photography pets_allowed is_accessible_for_free public_access available_languages distance_to_public_transport
3 1 10 0 0 0 \NULL https://thuecat.org/resources/835224016581-dara Dom St. Marien 1 1 {"street":"Domstufen 1","zip":"99084","city":"Erfurt","email":"dominformation@domberg-erfurt.de","phone":"+49 361 6461265","fax":"","geo":{"latitude":50.975955358589545,"longitude":11.023667024961856}} [] [{"mainImage":true,"type":"image","title":"Erfurt-Dom und Severikirche-beleuchtet.jpg","description":"","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5159216\/Preview-1280x0\/image","copyrightYear":2016,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":""}},{"mainImage":false,"type":"image","title":"Erfurt-Dom-und-Severikirche.jpg","description":"Sicht auf Dom St. Marien, St. Severikirche sowie die davor liegenden Klostergeb\u00e4ude und einem Ausschnitt des Biergartens umgeben von einem d\u00e4mmerungsverf\u00e4rten Himmel","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5159186\/Preview-1280x0\/image","copyrightYear":2020,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":""}},{"mainImage":false,"type":"image","title":"Erfurt-Dom und Severikirche-beleuchtet.jpg","description":"","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5159216\/Preview-1280x0\/image","copyrightYear":2016,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":""}}] [{"opens":"09:30:00","closes":"18:00:00","from":{"date":"2021-05-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2021-10-31 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Saturday","Friday","Thursday","Tuesday","Monday","Wednesday"]},{"opens":"13:00:00","closes":"18:00:00","from":{"date":"2021-05-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2021-10-31 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Sunday"]},{"opens":"09:30:00","closes":"17:00:00","from":{"date":"2021-11-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2022-04-30 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Saturday","Friday","Thursday","Tuesday","Monday","Wednesday"]},{"opens":"13:00:00","closes":"17:00:00","from":{"date":"2021-11-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2022-04-30 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Sunday"]}] Toilets,DisabledToilets SeatingPossibilitiesRestArea,SouvenirShop GothicArt BicycleLockersEnumMem,BusParkCoachParkEnumMem AugmentedReality Fotogenehmigung für innen false true true German,English 350:MTR
4 2 10 1 1 1 \NULL https://thuecat.org/resources/835224016581-dara Cathedral of St. Mary 1 1 {"street":"Domstufen 1","zip":"99084","city":"Erfurt","email":"dominformation@domberg-erfurt.de","phone":"+49 361 6461265","fax":"","geo":{"latitude":50.975955358589545,"longitude":11.023667024961856}} [] [{"mainImage":true,"type":"image","title":"Erfurt-Dom und Severikirche-beleuchtet.jpg","description":"","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5159216\/Preview-1280x0\/image","copyrightYear":2016,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":""}},{"mainImage":false,"type":"image","title":"Erfurt-Dom-und-Severikirche.jpg","description":"Sicht auf Dom St. Marien, St. Severikirche sowie die davor liegenden Klostergeb\u00e4ude und einem Ausschnitt des Biergartens umgeben von einem d\u00e4mmerungsverf\u00e4rten Himmel","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5159186\/Preview-1280x0\/image","copyrightYear":2020,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":""}},{"mainImage":false,"type":"image","title":"Erfurt-Dom und Severikirche-beleuchtet.jpg","description":"","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5159216\/Preview-1280x0\/image","copyrightYear":2016,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":""}}] [{"opens":"09:30:00","closes":"18:00:00","from":{"date":"2021-05-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2021-10-31 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Saturday","Friday","Thursday","Tuesday","Monday","Wednesday"]},{"opens":"13:00:00","closes":"18:00:00","from":{"date":"2021-05-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2021-10-31 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Sunday"]},{"opens":"09:30:00","closes":"17:00:00","from":{"date":"2021-11-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2022-04-30 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Saturday","Friday","Thursday","Tuesday","Monday","Wednesday"]},{"opens":"13:00:00","closes":"17:00:00","from":{"date":"2021-11-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2022-04-30 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Sunday"]}] Toilets,DisabledToilets SeatingPossibilitiesRestArea,SouvenirShop GothicArt BicycleLockersEnumMem,BusParkCoachParkEnumMem AugmentedReality false true true German,English 350:MTR
5 3 10 0 0 0 \NULL https://thuecat.org/resources/165868194223-zmqf Alte Synagoge 1 1 {"street":"Waagegasse 8","zip":"99084","city":"Erfurt","email":"altesynagoge@erfurt.de","phone":"+49 361 6551520","fax":"+49 361 6551669","geo":{"latitude":50.978765,"longitude":11.029133}} [{"title":"F\u00fchrungen","description":"Immer samstags, um 11:15 Uhr findet eine \u00f6ffentliche F\u00fchrung durch das Museum statt. Dauer etwa 90 Minuten","prices":[{"title":"Erwachsene","description":"","price":8,"currency":"EUR","rule":"PerPerson"},{"title":"Erm\u00e4\u00dfigt","description":"als erm\u00e4\u00dfigt gelten schulpflichtige Kinder, Auszubildende, Studierende, Rentner\/-innen, Menschen mit Behinderungen, Inhaber Sozialausweis der Landeshauptstadt Erfurt","price":5,"currency":"EUR","rule":"PerPerson"}]},{"title":"Eintritt","description":"Schulklassen und Kitagruppen im Rahmen des Unterrichts: Eintritt frei\nAn jedem ersten Dienstag im Monat: Eintritt frei","prices":[{"title":"Erm\u00e4\u00dfigt","description":"als erm\u00e4\u00dfigt gelten schulpflichtige Kinder, Auszubildende, Studierende, Rentner\/-innen, Menschen mit Behinderungen, Inhaber Sozialausweis der Landeshauptstadt Erfurt","price":5,"currency":"EUR","rule":"PerPerson"},{"title":"Familienkarte","description":"","price":17,"currency":"EUR","rule":"PerGroup"},{"title":"ErfurtCard","description":"","price":14.9,"currency":"EUR","rule":"PerPackage"},{"title":"Erwachsene","description":"","price":8,"currency":"EUR","rule":"PerPerson"}]}] [{"mainImage":true,"type":"image","title":"Erfurt-Alte Synagoge","description":"Frontaler Blick auf die Hausfront\/Hausfassade im Innenhof mit Zugang \u00fcber die Waagegasse","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5099196\/Preview-1280x0\/image","copyrightYear":2009,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":"F:\\Bilddatenbank\\Museen und Ausstellungen\\Alte Synagoge"}},{"mainImage":false,"type":"image","title":"Erfurt-Alte Synagoge","description":"Frontaler Blick auf die Hausfront\/Hausfassade im Innenhof mit Zugang \u00fcber die Waagegasse","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5099196\/Preview-1280x0\/image","copyrightYear":2009,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":"F:\\Bilddatenbank\\Museen und Ausstellungen\\Alte Synagoge"}}] [{"opens":"10:00:00","closes":"18:00:00","from":{"date":"2021-03-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2021-12-31 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Saturday","Sunday","Friday","Thursday","Tuesday","Wednesday"]}] Highlight 11. Jh. Toilets,DisabledToilets,NappyChangingArea,FamilyAndChildFriendly SeatingPossibilitiesRestArea,LockBoxes,SouvenirShop,BaggageStorage MuseumShop GothicArt ZeroSpecialTrafficInfrastructure CashPayment,EC AudioGuide,VideoGuide ZeroPhotography Tiere sind im Gebäude nicht gestattet, ausgenommen sind Blinden- und Blindenbegleithunde. false true German,English,French 200:MTR
6 4 10 1 3 3 \NULL https://thuecat.org/resources/165868194223-zmqf Old Synagogue 1 1 {"street":"Waagegasse 8","zip":"99084","city":"Erfurt","email":"altesynagoge@erfurt.de","phone":"+49 361 6551520","fax":"+49 361 6551669","geo":{"latitude":50.978765,"longitude":11.029133}} [{"title":"F\u00fchrungen","description":"Immer samstags, um 11:15 Uhr findet eine \u00f6ffentliche F\u00fchrung durch das Museum statt. Dauer etwa 90 Minuten","prices":[{"title":"Erwachsene","description":"","price":8,"currency":"EUR","rule":"PerPerson"},{"title":"Erm\u00e4\u00dfigt","description":"als erm\u00e4\u00dfigt gelten schulpflichtige Kinder, Auszubildende, Studierende, Rentner\/-innen, Menschen mit Behinderungen, Inhaber Sozialausweis der Landeshauptstadt Erfurt","price":5,"currency":"EUR","rule":"PerPerson"}]},{"title":"Eintritt","description":"Schulklassen und Kitagruppen im Rahmen des Unterrichts: Eintritt frei\nAn jedem ersten Dienstag im Monat: Eintritt frei","prices":[{"title":"Erm\u00e4\u00dfigt","description":"als erm\u00e4\u00dfigt gelten schulpflichtige Kinder, Auszubildende, Studierende, Rentner\/-innen, Menschen mit Behinderungen, Inhaber Sozialausweis der Landeshauptstadt Erfurt","price":5,"currency":"EUR","rule":"PerPerson"},{"title":"Familienkarte","description":"","price":17,"currency":"EUR","rule":"PerGroup"},{"title":"ErfurtCard","description":"","price":14.9,"currency":"EUR","rule":"PerPackage"},{"title":"Erwachsene","description":"","price":8,"currency":"EUR","rule":"PerPerson"}]}] [{"mainImage":true,"type":"image","title":"Erfurt-Alte Synagoge","description":"Frontaler Blick auf die Hausfront\/Hausfassade im Innenhof mit Zugang \u00fcber die Waagegasse","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5099196\/Preview-1280x0\/image","copyrightYear":2009,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":"F:\\Bilddatenbank\\Museen und Ausstellungen\\Alte Synagoge"}},{"mainImage":false,"type":"image","title":"Erfurt-Alte Synagoge","description":"Frontaler Blick auf die Hausfront\/Hausfassade im Innenhof mit Zugang \u00fcber die Waagegasse","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5099196\/Preview-1280x0\/image","copyrightYear":2009,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":"F:\\Bilddatenbank\\Museen und Ausstellungen\\Alte Synagoge"}}] [{"opens":"10:00:00","closes":"18:00:00","from":{"date":"2021-03-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2021-12-31 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Saturday","Sunday","Friday","Thursday","Tuesday","Wednesday"]}] Highlight 11th century Toilets,DisabledToilets,NappyChangingArea,FamilyAndChildFriendly SeatingPossibilitiesRestArea,LockBoxes,SouvenirShop,BaggageStorage MuseumShop GothicArt ZeroSpecialTrafficInfrastructure CashPayment,EC AudioGuide,VideoGuide ZeroPhotography false true German,English,French 200:MTR
7 5 10 2 3 3 \NULL https://thuecat.org/resources/165868194223-zmqf La vieille synagogue 1 1 {"street":"Waagegasse 8","zip":"99084","city":"Erfurt","email":"altesynagoge@erfurt.de","phone":"+49 361 6551520","fax":"+49 361 6551669","geo":{"latitude":50.978765,"longitude":11.029133}} [{"title":"F\u00fchrungen","description":"Immer samstags, um 11:15 Uhr findet eine \u00f6ffentliche F\u00fchrung durch das Museum statt. Dauer etwa 90 Minuten","prices":[{"title":"Erwachsene","description":"","price":8,"currency":"EUR","rule":"PerPerson"},{"title":"Erm\u00e4\u00dfigt","description":"als erm\u00e4\u00dfigt gelten schulpflichtige Kinder, Auszubildende, Studierende, Rentner\/-innen, Menschen mit Behinderungen, Inhaber Sozialausweis der Landeshauptstadt Erfurt","price":5,"currency":"EUR","rule":"PerPerson"}]},{"title":"Eintritt","description":"Schulklassen und Kitagruppen im Rahmen des Unterrichts: Eintritt frei\nAn jedem ersten Dienstag im Monat: Eintritt frei","prices":[{"title":"Erm\u00e4\u00dfigt","description":"als erm\u00e4\u00dfigt gelten schulpflichtige Kinder, Auszubildende, Studierende, Rentner\/-innen, Menschen mit Behinderungen, Inhaber Sozialausweis der Landeshauptstadt Erfurt","price":5,"currency":"EUR","rule":"PerPerson"},{"title":"Familienkarte","description":"","price":17,"currency":"EUR","rule":"PerGroup"},{"title":"ErfurtCard","description":"","price":14.9,"currency":"EUR","rule":"PerPackage"},{"title":"Erwachsene","description":"","price":8,"currency":"EUR","rule":"PerPerson"}]}] [{"mainImage":true,"type":"image","title":"Erfurt-Alte Synagoge","description":"Frontaler Blick auf die Hausfront\/Hausfassade im Innenhof mit Zugang \u00fcber die Waagegasse","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5099196\/Preview-1280x0\/image","copyrightYear":2009,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":"F:\\Bilddatenbank\\Museen und Ausstellungen\\Alte Synagoge"}},{"mainImage":false,"type":"image","title":"Erfurt-Alte Synagoge","description":"Frontaler Blick auf die Hausfront\/Hausfassade im Innenhof mit Zugang \u00fcber die Waagegasse","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/5099196\/Preview-1280x0\/image","copyrightYear":2009,"license":{"type":"https:\/\/creativecommons.org\/licenses\/by\/4.0\/","author":"F:\\Bilddatenbank\\Museen und Ausstellungen\\Alte Synagoge"}}] [{"opens":"10:00:00","closes":"18:00:00","from":{"date":"2021-03-01 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"through":{"date":"2021-12-31 00:00:00.000000","timezone_type":3,"timezone":"UTC"},"daysOfWeek":["Saturday","Sunday","Friday","Thursday","Tuesday","Wednesday"]}] Highlight Toilets,DisabledToilets,NappyChangingArea,FamilyAndChildFriendly SeatingPossibilitiesRestArea,LockBoxes,SouvenirShop,BaggageStorage MuseumShop GothicArt ZeroSpecialTrafficInfrastructure CashPayment,EC AudioGuide,VideoGuide ZeroPhotography false true German,English,French 200:MTR
8 6 10 0 0 0 \NULL https://thuecat.org/resources/215230952334-yyno Krämerbrücke 1 1 {"street":"Benediktsplatz 1","zip":"99084","city":"Erfurt","email":"service@erfurt-tourismus.de","phone":"+49 361 66 400","fax":"","geo":{"latitude":50.978772,"longitude":11.031622}} [] [{"mainImage":true,"type":"image","title":"Erfurt-Kraemerbruecke-11.jpg","description":"Kr\u00e4merbr\u00fccke in Erfurt","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134362\/Preview-1280x0\/image","copyrightYear":2019,"license":{"type":"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de","author":"https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion"}},{"mainImage":false,"type":"image","title":"Erfurt-Kraemerbruecke.jpg","description":"Kr\u00e4merbr\u00fccke in Erfurt","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134288\/Preview-1280x0\/image","copyrightYear":2019,"license":{"type":"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de","author":"https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion"}},{"mainImage":false,"type":"image","title":"Erfurt-Kraemerbruecke-11.jpg","description":"Kr\u00e4merbr\u00fccke in Erfurt","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134362\/Preview-1280x0\/image","copyrightYear":2019,"license":{"type":"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de","author":"https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion"}},{"mainImage":false,"type":"image","title":"Erfurt-Kraemerbruecke-13.jpg","description":"Ansicht der Kr\u00e4merbr\u00fccke, Erfurt","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/652340\/Preview-1280x0\/image","copyrightYear":2019,"license":{"type":"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de","author":"https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion"}}] [] ZeroSanitation Playground,SeatingPossibilitiesRestArea,SouvenirShop,PlayCornerOrPlayArea ZeroInformationArchitecturalStyle BicycleLockersEnumMem ZeroDigitalOffer TakingPicturesPermitted true true true German,English,French 250:MTR
9 7 10 1 6 6 \NULL https://thuecat.org/resources/215230952334-yyno Merchants' Bridge 1 1 {"street":"Benediktsplatz 1","zip":"99084","city":"Erfurt","email":"service@erfurt-tourismus.de","phone":"+49 361 66 400","fax":"","geo":{"latitude":50.978772,"longitude":11.031622}} [] [{"mainImage":true,"type":"image","title":"Erfurt-Kraemerbruecke-11.jpg","description":"Kr\u00e4merbr\u00fccke in Erfurt","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134362\/Preview-1280x0\/image","copyrightYear":2019,"license":{"type":"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de","author":"https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion"}},{"mainImage":false,"type":"image","title":"Erfurt-Kraemerbruecke.jpg","description":"Kr\u00e4merbr\u00fccke in Erfurt","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134288\/Preview-1280x0\/image","copyrightYear":2019,"license":{"type":"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de","author":"https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion"}},{"mainImage":false,"type":"image","title":"Erfurt-Kraemerbruecke-11.jpg","description":"Kr\u00e4merbr\u00fccke in Erfurt","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134362\/Preview-1280x0\/image","copyrightYear":2019,"license":{"type":"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de","author":"https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion"}},{"mainImage":false,"type":"image","title":"Erfurt-Kraemerbruecke-13.jpg","description":"Ansicht der Kr\u00e4merbr\u00fccke, Erfurt","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/652340\/Preview-1280x0\/image","copyrightYear":2019,"license":{"type":"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de","author":"https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion"}}] [] ZeroSanitation Playground,SeatingPossibilitiesRestArea,SouvenirShop,PlayCornerOrPlayArea ZeroInformationArchitecturalStyle BicycleLockersEnumMem ZeroDigitalOffer TakingPicturesPermitted true true true German,English,French 250:MTR
10 8 10 2 6 6 \NULL https://thuecat.org/resources/215230952334-yyno Pont de l'épicier 1 1 {"street":"Benediktsplatz 1","zip":"99084","city":"Erfurt","email":"service@erfurt-tourismus.de","phone":"+49 361 66 400","fax":"","geo":{"latitude":50.978772,"longitude":11.031622}} [] [{"mainImage":true,"type":"image","title":"Erfurt-Kraemerbruecke-11.jpg","description":"Kr\u00e4merbr\u00fccke in Erfurt","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134362\/Preview-1280x0\/image","copyrightYear":2019,"license":{"type":"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de","author":"https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion"}},{"mainImage":false,"type":"image","title":"Erfurt-Kraemerbruecke.jpg","description":"Kr\u00e4merbr\u00fccke in Erfurt","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134288\/Preview-1280x0\/image","copyrightYear":2019,"license":{"type":"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de","author":"https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion"}},{"mainImage":false,"type":"image","title":"Erfurt-Kraemerbruecke-11.jpg","description":"Kr\u00e4merbr\u00fccke in Erfurt","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/134362\/Preview-1280x0\/image","copyrightYear":2019,"license":{"type":"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de","author":"https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion"}},{"mainImage":false,"type":"image","title":"Erfurt-Kraemerbruecke-13.jpg","description":"Ansicht der Kr\u00e4merbr\u00fccke, Erfurt","url":"https:\/\/cms.thuecat.org\/o\/adaptive-media\/image\/652340\/Preview-1280x0\/image","copyrightYear":2019,"license":{"type":"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/deed.de","author":"https:\/\/home.ttgnet.de\/ttg\/projekte\/10006\/90136\/Projektdokumente\/Vergabe%20Rahmenvertrag%20Fotoproduktion"}}] [] ZeroSanitation Playground,SeatingPossibilitiesRestArea,SouvenirShop,PlayCornerOrPlayArea ZeroInformationArchitecturalStyle BicycleLockersEnumMem ZeroDigitalOffer TakingPicturesPermitted true true true German,English,French 250:MTR

View file

@ -0,0 +1,9 @@
"tx_thuecat_tourist_information",,,,,,,
,"uid","pid","remote_id","title","description","managed_by","town"
,1,10,"https://thuecat.org/resources/333039283321-xxwg","Erfurt Tourist Information","Direkt an der Krämerbrücke liegt die Erfurter Tourist Information. Nach einer Modernisierung im Frühjahr 2017 erstrahlt diese in neuem Glanz und ist auch technisch auf dem neuesten Stand. Hier erhalten Sie Stadtpläne, Broschüren zu Erfurt und originelle Souvenirs. Zudem bietet die Tourist Information vielfältige Stadtführungen und Rundfahrten mit Straßenbahn oder Bus sowie kompetente Beratung zu Hotels, Pensionen und Privatunterkünften.",1,1
"tx_thuecat_town",,,,,,,
,"uid","pid","remote_id","title","description","managed_by",
,1,10,"https://thuecat.org/resources/043064193523-jcyt","Erfurt","Krämerbrücke, Dom, Alte Synagoge die Thüringer Landeshauptstadt Erfurt hat viele Kulturschätze. Und ein wunderbar junges, studentisches Flair.Eine gute Mischung für alle, die beim Schlendern und Bummeln gerne Städte entdecken: Denn in Erfurt findet man einen wunderbaren mittelalterlichen Stadtkern mit vielen netten Läden, Cafès und Restaurants. Urlauber wie Einheimische bummeln durch die Gassen der Altstadt, aus allen Ecken wispern Geschichte und alte Geschichten. Stolze historische Bügerhäuser bilden eine der schönsten Altstädte Europas, mittendrin das neugotische Rathaus aus den 1870er-Jahren am Fischmarkt, die spitztürmige St. Severikirche und der mächtige Dom, 1117 erstmals urkundlich erwähnt auf seiner schier endlosen, kaskadenförmigen Freitreppe chillen Jung und Alt gern in der Abendsonne. Ehe sie weiter ziehen zum Tagesausklang in eine der coolen Kneipen und Bars (Tipp: Oma Lilo oder Cafè Hilgenfeld), in die Wein-Destille am benachbarten Petersberg oder in eins der lässigen Restaurants (Tipp: Mathilda oder Ballenberger), wo zum freundlichen Miteinander eine frische und moderne Küche serviert wird.In Erfurt pulsiert das Leben, lassen Sie sich einfach treiben. Von Ihrer Neugierde ...",1,
"tx_thuecat_organisation",,,,,,,
,"uid","pid","remote_id","title",,,
,1,10,"https://thuecat.org/resources/018132452787-ngbe","Erfurt Tourismus und Marketing GmbH",,,
1 tx_thuecat_tourist_information
2 uid pid remote_id title description managed_by town
3 1 10 https://thuecat.org/resources/333039283321-xxwg Erfurt Tourist Information Direkt an der Krämerbrücke liegt die Erfurter Tourist Information. Nach einer Modernisierung im Frühjahr 2017 erstrahlt diese in neuem Glanz und ist auch technisch auf dem neuesten Stand. Hier erhalten Sie Stadtpläne, Broschüren zu Erfurt und originelle Souvenirs. Zudem bietet die Tourist Information vielfältige Stadtführungen und Rundfahrten mit Straßenbahn oder Bus sowie kompetente Beratung zu Hotels, Pensionen und Privatunterkünften. 1 1
4 tx_thuecat_town
5 uid pid remote_id title description managed_by
6 1 10 https://thuecat.org/resources/043064193523-jcyt Erfurt Krämerbrücke, Dom, Alte Synagoge – die Thüringer Landeshauptstadt Erfurt hat viele Kulturschätze. Und ein wunderbar junges, studentisches Flair.Eine gute Mischung für alle, die beim Schlendern und Bummeln gerne Städte entdecken: Denn in Erfurt findet man einen wunderbaren mittelalterlichen Stadtkern – mit vielen netten Läden, Cafès und Restaurants. Urlauber wie Einheimische bummeln durch die Gassen der Altstadt, aus allen Ecken wispern Geschichte und alte Geschichten. Stolze historische Bügerhäuser bilden eine der schönsten Altstädte Europas, mittendrin das neugotische Rathaus aus den 1870er-Jahren am Fischmarkt, die spitztürmige St. Severikirche und der mächtige Dom, 1117 erstmals urkundlich erwähnt – auf seiner schier endlosen, kaskadenförmigen Freitreppe chillen Jung und Alt gern in der Abendsonne. Ehe sie weiter ziehen zum Tagesausklang in eine der coolen Kneipen und Bars (Tipp: Oma Lilo oder Cafè Hilgenfeld), in die Wein-Destille am benachbarten Petersberg oder in eins der lässigen Restaurants (Tipp: Mathilda oder Ballenberger), wo zum freundlichen Miteinander eine frische und moderne Küche serviert wird.In Erfurt pulsiert das Leben, lassen Sie sich einfach treiben. Von Ihrer Neugierde ... 1
7 tx_thuecat_organisation
8 uid pid remote_id title
9 1 10 https://thuecat.org/resources/018132452787-ngbe Erfurt Tourismus und Marketing GmbH

View file

@ -73,31 +73,4 @@
</T3FlexForms>
]]></configuration>
</tx_thuecat_import_configuration>
<tx_thuecat_town>
<uid>1</uid>
<pid>10</pid>
<tstamp>1613401129</tstamp>
<crdate>1613401129</crdate>
<cruser_id>1</cruser_id>
<disable>0</disable>
<remote_id>https://thuecat.org/resources/043064193523-jcyt</remote_id>
<managed_by>1</managed_by>
<tourist_information>0</tourist_information>
<title>Erfurt</title>
</tx_thuecat_town>
<tx_thuecat_organisation>
<uid>1</uid>
<pid>10</pid>
<tstamp>1613400969</tstamp>
<crdate>1613400969</crdate>
<cruser_id>1</cruser_id>
<disable>0</disable>
<remote_id>https://thuecat.org/resources/018132452787-ngbe</remote_id>
<title>Erfurt Tourismus und Marketing GmbH</title>
<description>Die Erfurt Tourismus &amp; Marketing GmbH (ETMG) wurde 1997 als offizielle Organisation zur Tourismusförderung in der Landeshauptstadt Erfurt gegründet und nahm am 01.0 1.1998 die Geschäftstätigkeit auf.</description>
<manages_towns>0</manages_towns>
<manages_tourist_information>0</manages_tourist_information>
</tx_thuecat_organisation>
</dataset>

View file

@ -1,3 +0,0 @@
"tx_thuecat_tourist_information",,,,,,,
,"uid","pid","remote_id","title","description","managed_by","town"
,1,10,"https://thuecat.org/resources/333039283321-xxwg","Erfurt Tourist Information","Direkt an der Krämerbrücke liegt die Erfurter Tourist Information. Nach einer Modernisierung im Frühjahr 2017 erstrahlt diese in neuem Glanz und ist auch technisch auf dem neuesten Stand. Hier erhalten Sie Stadtpläne, Broschüren zu Erfurt und originelle Souvenirs. Zudem bietet die Tourist Information vielfältige Stadtführungen und Rundfahrten mit Straßenbahn oder Bus sowie kompetente Beratung zu Hotels, Pensionen und Privatunterkünften. ",1,1
1 tx_thuecat_tourist_information
2 uid pid remote_id title description managed_by town
3 1 10 https://thuecat.org/resources/333039283321-xxwg Erfurt Tourist Information Direkt an der Krämerbrücke liegt die Erfurter Tourist Information. Nach einer Modernisierung im Frühjahr 2017 erstrahlt diese in neuem Glanz und ist auch technisch auf dem neuesten Stand. Hier erhalten Sie Stadtpläne, Broschüren zu Erfurt und originelle Souvenirs. Zudem bietet die Tourist Information vielfältige Stadtführungen und Rundfahrten mit Straßenbahn oder Bus sowie kompetente Beratung zu Hotels, Pensionen und Privatunterkünften. 1 1

View file

@ -1,3 +1,6 @@
tx_thuecat_town
"tx_thuecat_town",,,,,,
,"uid","pid","remote_id","title","description","managed_by"
,1,10,"https://thuecat.org/resources/043064193523-jcyt","Erfurt","Krämerbrücke, Dom, Alte Synagoge die Thüringer Landeshauptstadt Erfurt hat viele Kulturschätze. Und ein wunderbar junges, studentisches Flair.Eine gute Mischung für alle, die beim Schlendern und Bummeln gerne Städte entdecken: Denn in Erfurt findet man einen wunderbaren mittelalterlichen Stadtkern mit vielen netten Läden, Cafès und Restaurants. Urlauber wie Einheimische bummeln durch die Gassen der Altstadt, aus allen Ecken wispern Geschichte und alte Geschichten. Stolze historische Bügerhäuser bilden eine der schönsten Altstädte Europas, mittendrin das neugotische Rathaus aus den 1870er-Jahren am Fischmarkt, die spitztürmige St. Severikirche und der mächtige Dom, 1117 erstmals urkundlich erwähnt auf seiner schier endlosen, kaskadenförmigen Freitreppe chillen Jung und Alt gern in der Abendsonne. Ehe sie weiter ziehen zum Tagesausklang in eine der coolen Kneipen und Bars (Tipp: Oma Lilo oder Cafè Hilgenfeld), in die Wein-Destille am benachbarten Petersberg oder in eins der lässigen Restaurants (Tipp: Mathilda oder Ballenberger), wo zum freundlichen Miteinander eine frische und moderne Küche serviert wird.In Erfurt pulsiert das Leben, lassen Sie sich einfach treiben. Von Ihrer Neugierde ...",
,1,10,"https://thuecat.org/resources/043064193523-jcyt","Erfurt","Krämerbrücke, Dom, Alte Synagoge die Thüringer Landeshauptstadt Erfurt hat viele Kulturschätze. Und ein wunderbar junges, studentisches Flair.Eine gute Mischung für alle, die beim Schlendern und Bummeln gerne Städte entdecken: Denn in Erfurt findet man einen wunderbaren mittelalterlichen Stadtkern mit vielen netten Läden, Cafès und Restaurants. Urlauber wie Einheimische bummeln durch die Gassen der Altstadt, aus allen Ecken wispern Geschichte und alte Geschichten. Stolze historische Bügerhäuser bilden eine der schönsten Altstädte Europas, mittendrin das neugotische Rathaus aus den 1870er-Jahren am Fischmarkt, die spitztürmige St. Severikirche und der mächtige Dom, 1117 erstmals urkundlich erwähnt auf seiner schier endlosen, kaskadenförmigen Freitreppe chillen Jung und Alt gern in der Abendsonne. Ehe sie weiter ziehen zum Tagesausklang in eine der coolen Kneipen und Bars (Tipp: Oma Lilo oder Cafè Hilgenfeld), in die Wein-Destille am benachbarten Petersberg oder in eins der lässigen Restaurants (Tipp: Mathilda oder Ballenberger), wo zum freundlichen Miteinander eine frische und moderne Küche serviert wird.In Erfurt pulsiert das Leben, lassen Sie sich einfach treiben. Von Ihrer Neugierde ...",1
"tx_thuecat_organisation",,,,,,
,"uid","pid","remote_id","title",,
,1,10,"https://thuecat.org/resources/018132452787-ngbe","Erfurt Tourismus und Marketing GmbH",,

Can't render this file because it has a wrong number of fields in line 2.

View file

@ -1,3 +1,6 @@
tx_thuecat_town
"tx_thuecat_town",,,,,,
,"uid","pid","remote_id","title","description","managed_by"
,1,10,"https://thuecat.org/resources/043064193523-jcyt","Erfurt","Krämerbrücke, Dom, Alte Synagoge die Thüringer Landeshauptstadt Erfurt hat viele Kulturschätze. Und ein wunderbar junges, studentisches Flair.Eine gute Mischung für alle, die beim Schlendern und Bummeln gerne Städte entdecken: Denn in Erfurt findet man einen wunderbaren mittelalterlichen Stadtkern mit vielen netten Läden, Cafès und Restaurants. Urlauber wie Einheimische bummeln durch die Gassen der Altstadt, aus allen Ecken wispern Geschichte und alte Geschichten. Stolze historische Bügerhäuser bilden eine der schönsten Altstädte Europas, mittendrin das neugotische Rathaus aus den 1870er-Jahren am Fischmarkt, die spitztürmige St. Severikirche und der mächtige Dom, 1117 erstmals urkundlich erwähnt auf seiner schier endlosen, kaskadenförmigen Freitreppe chillen Jung und Alt gern in der Abendsonne. Ehe sie weiter ziehen zum Tagesausklang in eine der coolen Kneipen und Bars (Tipp: Oma Lilo oder Cafè Hilgenfeld), in die Wein-Destille am benachbarten Petersberg oder in eins der lässigen Restaurants (Tipp: Mathilda oder Ballenberger), wo zum freundlichen Miteinander eine frische und moderne Küche serviert wird.In Erfurt pulsiert das Leben, lassen Sie sich einfach treiben. Von Ihrer Neugierde ...",1
"tx_thuecat_organisation",,,,,,
,"uid","pid","remote_id","title",,
,1,10,"https://thuecat.org/resources/018132452787-ngbe","Erfurt Tourismus und Marketing GmbH",,

Can't render this file because it has a wrong number of fields in line 2.

View file

@ -77,14 +77,11 @@
<tx_thuecat_organisation>
<uid>1</uid>
<pid>10</pid>
<tstamp>1613400969</tstamp>
<crdate>1613400969</crdate>
<tstamp>1613400587</tstamp>
<crdate>1613400558</crdate>
<cruser_id>1</cruser_id>
<disable>0</disable>
<remote_id>https://thuecat.org/resources/018132452787-ngbe</remote_id>
<title>Erfurt Tourismus und Marketing GmbH</title>
<description>Die Erfurt Tourismus &amp; Marketing GmbH (ETMG) wurde 1997 als offizielle Organisation zur Tourismusförderung in der Landeshauptstadt Erfurt gegründet und nahm am 01.0 1.1998 die Geschäftstätigkeit auf.</description>
<manages_towns>0</manages_towns>
<manages_tourist_information>0</manages_tourist_information>
<title>Old title</title>
</tx_thuecat_organisation>
</dataset>

View file

@ -183,6 +183,18 @@ class FrontendTest extends FunctionalTestCase
self::assertStringNotContainsString('Deutsch', (string)$result->getBody());
self::assertStringNotContainsString('Englisch', (string)$result->getBody());
self::assertStringNotContainsString('Französisch', (string)$result->getBody());
self::assertStringContainsString('Parkhäuser in der Nähe', (string)$result->getBody());
self::assertStringContainsString('Parkhaus Domplatz', (string)$result->getBody());
self::assertStringContainsString('Bechtheimer Str. 1', (string)$result->getBody());
self::assertStringContainsString('99084 Erfurt', (string)$result->getBody());
self::assertStringContainsString('info@stadtwerke-erfurt.de', (string)$result->getBody());
self::assertStringContainsString('+49 361 5640', (string)$result->getBody());
self::assertStringContainsString('Q-Park Anger 1 Parkhaus', (string)$result->getBody());
self::assertStringContainsString('Anger 1', (string)$result->getBody());
self::assertStringContainsString('99084 Erfurt', (string)$result->getBody());
self::assertStringContainsString('servicecenter@q-park.de', (string)$result->getBody());
self::assertStringContainsString('+49 218 18190290', (string)$result->getBody());
}
/**

View file

@ -148,21 +148,6 @@ class ImportTest extends TestCase
$extbaseBootstrap = $this->getContainer()->get(Bootstrap::class);
$extbaseBootstrap->handleBackendRequest($serverRequest->reveal());
self::assertCount(
1,
$this->getAllRecords('tx_thuecat_organisation'),
'Did not create expected number of organisations.'
);
self::assertCount(
1,
$this->getAllRecords('tx_thuecat_import_log'),
'Did not create expected number of import logs.'
);
self::assertCount(
1,
$this->getAllRecords('tx_thuecat_import_log_entry'),
'Did not create expected number of import log entries.'
);
$this->assertCSVDataSet('EXT:thuecat/Tests/Functional/Fixtures/Import/ImportsFreshOrganization.csv');
}
@ -210,9 +195,6 @@ class ImportTest extends TestCase
$extbaseBootstrap = $this->getContainer()->get(Bootstrap::class);
$extbaseBootstrap->handleBackendRequest($serverRequest->reveal());
$towns = $this->getAllRecords('tx_thuecat_town');
self::assertCount(1, $towns);
$this->assertCSVDataSet('EXT:thuecat/Tests/Functional/Fixtures/Import/ImportsTown.csv');
}
@ -228,9 +210,6 @@ class ImportTest extends TestCase
$extbaseBootstrap = $this->getContainer()->get(Bootstrap::class);
$extbaseBootstrap->handleBackendRequest($serverRequest->reveal());
$towns = $this->getAllRecords('tx_thuecat_town');
self::assertCount(1, $towns);
$this->assertCSVDataSet('EXT:thuecat/Tests/Functional/Fixtures/Import/ImportsTownWithRelation.csv');
}
@ -246,10 +225,7 @@ class ImportTest extends TestCase
$extbaseBootstrap = $this->getContainer()->get(Bootstrap::class);
$extbaseBootstrap->handleBackendRequest($serverRequest->reveal());
$touristAttractions = $this->getAllRecords('tx_thuecat_tourist_attraction');
self::assertCount(8, $touristAttractions);
$this->assertCSVDataSet('EXT:thuecat/Tests/Functional/Fixtures/Import/ImportsTouristAttractionsWithRelationsResult.csv');
$this->assertCSVDataSet('EXT:thuecat/Tests/Functional/Fixtures/Import/ImportsTouristAttractionsWithRelations.csv');
}
/**
@ -264,10 +240,7 @@ class ImportTest extends TestCase
$extbaseBootstrap = $this->getContainer()->get(Bootstrap::class);
$extbaseBootstrap->handleBackendRequest($serverRequest->reveal());
$touristInformation = $this->getAllRecords('tx_thuecat_tourist_information');
self::assertCount(1, $touristInformation);
$this->assertCSVDataSet('EXT:thuecat/Tests/Functional/Fixtures/Import/ImportsTouristInformationWithRelationResult.csv');
$this->assertCSVDataSet('EXT:thuecat/Tests/Functional/Fixtures/Import/ImportsTouristInformationWithRelation.csv');
}
/**
@ -282,10 +255,23 @@ class ImportTest extends TestCase
$extbaseBootstrap = $this->getContainer()->get(Bootstrap::class);
$extbaseBootstrap->handleBackendRequest($serverRequest->reveal());
$touristAttractions = $this->getAllRecords('tx_thuecat_tourist_attraction');
self::assertCount(8, $touristAttractions);
$this->assertCSVDataSet('EXT:thuecat/Tests/Functional/Fixtures/Import/ImportsSyncScope.csv');
}
$this->assertCSVDataSet('EXT:thuecat/Tests/Functional/Fixtures/Import/ImportsSyncScopeResult.csv');
/**
* @test
* @testdox Referencing the same thing multiple times only adds it once.
*/
public function importWithMultipleReferencesToSameObject(): void
{
$this->importDataSet(__DIR__ . '/Fixtures/Import/ImportWithMultipleReferencesToSameObject.xml');
$serverRequest = $this->getServerRequest();
$extbaseBootstrap = $this->getContainer()->get(Bootstrap::class);
$extbaseBootstrap->handleBackendRequest($serverRequest->reveal());
$this->assertCSVDataSet('EXT:thuecat/Tests/Functional/Fixtures/Import/ImportWithMultipleReferencesToSameObject.csv');
}
/**

View file

@ -0,0 +1,217 @@
<?php
declare(strict_types=1);
/*
* Copyright (C) 2021 Daniel Siepmann <coding@daniel-siepmann.de>
*
* 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.
*/
namespace WerkraumMedia\ThueCat\Tests\Unit\Domain\Import;
use Prophecy\PhpUnit\ProphecyTrait;
use WerkraumMedia\ThueCat\Domain\Import\Import;
use PHPUnit\Framework\TestCase;
use WerkraumMedia\ThueCat\Domain\Model\Backend\ImportConfiguration;
use WerkraumMedia\ThueCat\Domain\Model\Backend\ImportLog;
use WerkraumMedia\ThueCat\Domain\Model\Backend\ImportLogEntry;
/**
* @covers \WerkraumMedia\ThueCat\Domain\Import\Import
*/
class ImportTest extends TestCase
{
use ProphecyTrait;
/**
* @test
*/
public function canBeCreated(): void
{
$subject = new Import();
self::assertInstanceOf(
Import::class,
$subject
);
}
/**
* @test
*/
public function canStart(): void
{
$configuration = $this->prophesize(ImportConfiguration::class);
$subject = new Import();
$subject->start($configuration->reveal());
self::assertSame(
$configuration->reveal(),
$subject->getConfiguration()
);
self::assertInstanceOf(
ImportLog::class,
$subject->getLog()
);
}
/**
* @test
*/
public function canEndAfterStart(): void
{
$configuration = $this->prophesize(ImportConfiguration::class);
$subject = new Import();
$subject->start($configuration->reveal());
$subject->end();
self::assertSame(
$configuration->reveal(),
$subject->getConfiguration()
);
self::assertInstanceOf(
ImportLog::class,
$subject->getLog()
);
}
/**
* @test
*/
public function isDoneAfterStartAndEnd(): void
{
$configuration = $this->prophesize(ImportConfiguration::class);
$subject = new Import();
$subject->start($configuration->reveal());
$subject->end();
self::assertTrue($subject->done());
}
/**
* @test
*/
public function isNotDoneAfterJustStartWithoutEnd(): void
{
$configuration = $this->prophesize(ImportConfiguration::class);
$subject = new Import();
$subject->start($configuration->reveal());
self::assertFalse($subject->done());
}
/**
* @test
*/
public function nestedStartReturnsExpectedConfiguration(): void
{
$configuration1 = $this->prophesize(ImportConfiguration::class);
$subject = new Import();
$subject->start($configuration1->reveal());
$configuration2 = $this->prophesize(ImportConfiguration::class);
$subject->start($configuration2->reveal());
self::assertSame(
$configuration2->reveal(),
$subject->getConfiguration()
);
}
/**
* @test
*/
public function nestedStartReturnsExpectedLog(): void
{
$configuration1 = $this->prophesize(ImportConfiguration::class);
$subject = new Import();
$subject->start($configuration1->reveal());
$log1 = $subject->getLog();
self::assertInstanceOf(
ImportLog::class,
$log1
);
$configuration2 = $this->prophesize(ImportConfiguration::class);
$subject->start($configuration2->reveal());
$log2 = $subject->getLog();
self::assertInstanceOf(
ImportLog::class,
$log2
);
self::assertNotSame(
$log1,
$log2
);
}
/**
* @test
*/
public function nestedImportMergesLog(): void
{
$configuration1 = $this->prophesize(ImportConfiguration::class);
$subject = new Import();
$subject->start($configuration1->reveal());
$log1 = $subject->getLog();
$configuration2 = $this->prophesize(ImportConfiguration::class);
$subject->start($configuration2->reveal());
$importLogEntry = $this->prophesize(ImportLogEntry::class);
$subject->getLog()->addEntry($importLogEntry->reveal());
$subject->end();
self::assertSame(
$log1,
$subject->getLog()
);
self::assertSame(
[
$importLogEntry->reveal()
],
$log1->getEntries()->toArray()
);
}
/**
* @test
*/
public function nestedImportReturnsHandledForRemoteId(): void
{
$configuration1 = $this->prophesize(ImportConfiguration::class);
$subject = new Import();
$subject->start($configuration1->reveal());
$configuration2 = $this->prophesize(ImportConfiguration::class);
$subject->start($configuration2->reveal());
$importLogEntry = $this->prophesize(ImportLogEntry::class);
$importLogEntry->getRemoteId()->willReturn('https://example.com/remote-id');
$subject->getLog()->addEntry($importLogEntry->reveal());
$subject->end();
$configuration3 = $this->prophesize(ImportConfiguration::class);
$subject->start($configuration3->reveal());
self::assertTrue(
$subject->handledRemoteId('https://example.com/remote-id')
);
}
}

View file

@ -50,6 +50,7 @@ CREATE TABLE tx_thuecat_tourist_attraction (
remote_id varchar(255) DEFAULT '' NOT NULL,
managed_by int(11) unsigned DEFAULT '0' NOT NULL,
town int(11) unsigned DEFAULT '0' NOT NULL,
parking_facility_near_by varchar(255) DEFAULT '' NOT NULL,
title varchar(255) DEFAULT '' NOT NULL,
description text DEFAULT '' NOT NULL,
opening_hours text DEFAULT '' NOT NULL,
@ -72,3 +73,20 @@ CREATE TABLE tx_thuecat_tourist_attraction (
available_languages text DEFAULT '' NOT NULL,
distance_to_public_transport text DEFAULT '' NOT NULL,
);
CREATE TABLE tx_thuecat_parking_facility (
remote_id varchar(255) DEFAULT '' NOT NULL,
managed_by int(11) unsigned DEFAULT '0' NOT NULL,
town int(11) unsigned DEFAULT '0' NOT NULL,
title varchar(255) DEFAULT '' NOT NULL,
description text DEFAULT '' NOT NULL,
opening_hours text DEFAULT '' NOT NULL,
address text DEFAULT '' NOT NULL,
media text DEFAULT '' NOT NULL,
offers text DEFAULT '' NOT NULL,
sanitation text DEFAULT '' NOT NULL,
other_service text DEFAULT '' NOT NULL,
traffic_infrastructure text DEFAULT '' NOT NULL,
payment_accepted text DEFAULT '' NOT NULL,
distance_to_public_transport text DEFAULT '' NOT NULL,
);

View file

@ -1,7 +1,12 @@
parameters:
ignoreErrors:
-
message: "#^Parameter \\#1 \\$function of function call_user_func expects callable\\(\\)\\: mixed, array\\(string\\|null, 'getSupportedTypes'\\) given\\.$#"
message: "#^Parameter \\#1 \\$function of function call_user_func expects callable\\(\\)\\: mixed, array\\(string, 'getPriority'\\) given\\.$#"
count: 1
path: Classes/DependencyInjection/EntityPass.php
-
message: "#^Parameter \\#1 \\$function of function call_user_func expects callable\\(\\)\\: mixed, array\\(string, 'getSupportedTypes'\\) given\\.$#"
count: 1
path: Classes/DependencyInjection/EntityPass.php
@ -15,6 +20,16 @@ parameters:
count: 1
path: Classes/Domain/Model/Backend/ImportLog.php
-
message: "#^Property WerkraumMedia\\\\ThueCat\\\\Domain\\\\Model\\\\Frontend\\\\Place\\:\\:\\$parkingFacilityNearBy \\(iterable\\<WerkraumMedia\\\\ThueCat\\\\Domain\\\\Model\\\\Frontend\\\\ParkingFacility\\>&TYPO3\\\\CMS\\\\Extbase\\\\Persistence\\\\ObjectStorage\\) does not accept TYPO3\\\\CMS\\\\Extbase\\\\Persistence\\\\ObjectStorage\\.$#"
count: 1
path: Classes/Domain/Model/Frontend/Place.php
-
message: "#^Method WerkraumMedia\\\\ThueCat\\\\Domain\\\\Repository\\\\Backend\\\\ParkingFacilityRepository\\:\\:findByEntity\\(\\) should return TYPO3\\\\CMS\\\\Extbase\\\\Persistence\\\\QueryResultInterface\\|null but returns array\\|TYPO3\\\\CMS\\\\Extbase\\\\Persistence\\\\QueryResultInterface\\.$#"
count: 1
path: Classes/Domain/Repository/Backend/ParkingFacilityRepository.php
-
message: "#^Cannot call method getFirst\\(\\) on array\\|TYPO3\\\\CMS\\\\Extbase\\\\Persistence\\\\QueryResultInterface\\.$#"
count: 1
@ -35,3 +50,8 @@ parameters:
count: 1
path: Classes/Frontend/DataProcessing/ResolveEntities.php
-
message: "#^Cannot call method format\\(\\) on DateTimeImmutable\\|null\\.$#"
count: 4
path: Tests/Functional/Import/EntityMapping/PlaceInfosTest.php