mirror of
https://github.com/werkraum-media/thuecat.git
synced 2024-12-04 19:16:13 +01:00
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:
parent
5859c14525
commit
cc216429a5
79 changed files with 2389 additions and 958 deletions
|
@ -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']),
|
||||
]
|
||||
);
|
||||
|
|
|
@ -38,4 +38,9 @@ interface MapsToType
|
|||
* @return string[]
|
||||
*/
|
||||
public static function getSupportedTypes(): array;
|
||||
|
||||
/**
|
||||
* Priority if multiple entities match
|
||||
*/
|
||||
public static function getPriority(): int;
|
||||
}
|
||||
|
|
|
@ -105,4 +105,9 @@ class MediaObject extends Minimum implements MapsToType
|
|||
'schema:MediaObject',
|
||||
];
|
||||
}
|
||||
|
||||
public static function getPriority(): int
|
||||
{
|
||||
return 10;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
34
Classes/Domain/Import/Entity/ParkingFacility.php
Normal file
34
Classes/Domain/Import/Entity/ParkingFacility.php
Normal 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',
|
||||
];
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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'];
|
||||
}
|
||||
}
|
||||
|
|
43
Classes/Domain/Import/EntityMapper/PropertyValues.php
Normal file
43
Classes/Domain/Import/EntityMapper/PropertyValues.php
Normal 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
|
||||
);
|
||||
}
|
||||
}
|
115
Classes/Domain/Import/Import.php
Normal file
115
Classes/Domain/Import/Import.php
Normal 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;
|
||||
}
|
||||
}
|
54
Classes/Domain/Import/ImportConfiguration.php
Normal file
54
Classes/Domain/Import/ImportConfiguration.php
Normal 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;
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
373
Classes/Domain/Import/Typo3Converter/GeneralConverter.php
Normal file
373
Classes/Domain/Import/Typo3Converter/GeneralConverter.php
Normal 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;
|
||||
}
|
||||
}
|
|
@ -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()));
|
||||
|
|
|
@ -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(),
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
|
@ -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];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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(),
|
||||
];
|
||||
}
|
||||
}
|
|
@ -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,
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
|
@ -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,
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
28
Classes/Domain/Model/Backend/ParkingFacility.php
Normal file
28
Classes/Domain/Model/Backend/ParkingFacility.php
Normal 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
|
||||
{
|
||||
}
|
59
Classes/Domain/Model/Frontend/Base.php
Normal file
59
Classes/Domain/Model/Frontend/Base.php
Normal 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;
|
||||
}
|
||||
}
|
28
Classes/Domain/Model/Frontend/ParkingFacility.php
Normal file
28
Classes/Domain/Model/Frontend/ParkingFacility.php
Normal 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
|
||||
{
|
||||
}
|
122
Classes/Domain/Model/Frontend/Place.php
Normal file
122
Classes/Domain/Model/Frontend/Place.php
Normal 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] ?? '',
|
||||
];
|
||||
}
|
||||
}
|
|
@ -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] ?? '',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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',
|
||||
],
|
||||
];
|
||||
|
|
207
Configuration/TCA/tx_thuecat_parking_facility.php
Normal file
207
Configuration/TCA/tx_thuecat_parking_facility.php
Normal 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');
|
|
@ -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',
|
||||
],
|
||||
],
|
||||
];
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
1
Resources/Public/Icons/tx_thuecat_parking_facility.svg
Normal file
1
Resources/Public/Icons/tx_thuecat_parking_facility.svg
Normal 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 |
|
@ -1,4 +1,4 @@
|
|||
base: '/'
|
||||
base: /
|
||||
languages:
|
||||
-
|
||||
title: Deutsch
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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"}}]}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -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"}]}]}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -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
|
|
|
@ -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>
|
Can't render this file because it has a wrong number of fields in line 2.
|
|
@ -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 & 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>
|
||||
|
|
|
@ -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 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
|
||||
,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 Romanesque 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 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",
|
||||
,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 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"
|
||||
"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",,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
|
@ -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 & 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>
|
||||
|
|
|
@ -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"
|
|
|
@ -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",,,
|
|
|
@ -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 & 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>
|
||||
|
|
|
@ -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,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.
|
|
@ -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.
|
|
@ -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 & 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>
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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');
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
217
Tests/Unit/Domain/Import/ImportTest.php
Normal file
217
Tests/Unit/Domain/Import/ImportTest.php
Normal 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')
|
||||
);
|
||||
}
|
||||
}
|
|
@ -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,
|
||||
);
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in a new issue