Merge branch 'master' into develop
This commit is contained in:
Generated
+53
-49
@@ -465,26 +465,29 @@
|
||||
},
|
||||
{
|
||||
"name": "doctrine/deprecations",
|
||||
"version": "1.1.4",
|
||||
"version": "1.1.5",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/doctrine/deprecations.git",
|
||||
"reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9"
|
||||
"reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/doctrine/deprecations/zipball/31610dbb31faa98e6b5447b62340826f54fbc4e9",
|
||||
"reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9",
|
||||
"url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38",
|
||||
"reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.1 || ^8.0"
|
||||
},
|
||||
"conflict": {
|
||||
"phpunit/phpunit": "<=7.5 || >=13"
|
||||
},
|
||||
"require-dev": {
|
||||
"doctrine/coding-standard": "^9 || ^12",
|
||||
"phpstan/phpstan": "1.4.10 || 2.0.3",
|
||||
"doctrine/coding-standard": "^9 || ^12 || ^13",
|
||||
"phpstan/phpstan": "1.4.10 || 2.1.11",
|
||||
"phpstan/phpstan-phpunit": "^1.0 || ^2",
|
||||
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
|
||||
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12",
|
||||
"psr/log": "^1 || ^2 || ^3"
|
||||
},
|
||||
"suggest": {
|
||||
@@ -504,9 +507,9 @@
|
||||
"homepage": "https://www.doctrine-project.org/",
|
||||
"support": {
|
||||
"issues": "https://github.com/doctrine/deprecations/issues",
|
||||
"source": "https://github.com/doctrine/deprecations/tree/1.1.4"
|
||||
"source": "https://github.com/doctrine/deprecations/tree/1.1.5"
|
||||
},
|
||||
"time": "2024-12-07T21:18:45+00:00"
|
||||
"time": "2025-04-07T20:06:18+00:00"
|
||||
},
|
||||
{
|
||||
"name": "doctrine/event-manager",
|
||||
@@ -2161,16 +2164,16 @@
|
||||
},
|
||||
{
|
||||
"name": "phpdocumentor/reflection-docblock",
|
||||
"version": "5.6.1",
|
||||
"version": "5.6.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
|
||||
"reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8"
|
||||
"reference": "92dde6a5919e34835c506ac8c523ef095a95ed62"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8",
|
||||
"reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8",
|
||||
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/92dde6a5919e34835c506ac8c523ef095a95ed62",
|
||||
"reference": "92dde6a5919e34835c506ac8c523ef095a95ed62",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -2219,9 +2222,9 @@
|
||||
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
|
||||
"support": {
|
||||
"issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
|
||||
"source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.1"
|
||||
"source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.2"
|
||||
},
|
||||
"time": "2024-12-07T09:39:29+00:00"
|
||||
"time": "2025-04-13T19:20:35+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpdocumentor/type-resolver",
|
||||
@@ -4487,7 +4490,7 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-ctype",
|
||||
"version": "v1.31.0",
|
||||
"version": "v1.32.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-ctype.git",
|
||||
@@ -4546,7 +4549,7 @@
|
||||
"portable"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0"
|
||||
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.32.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -4566,7 +4569,7 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-intl-grapheme",
|
||||
"version": "v1.31.0",
|
||||
"version": "v1.32.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
|
||||
@@ -4624,7 +4627,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0"
|
||||
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -4644,16 +4647,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-intl-icu",
|
||||
"version": "v1.31.0",
|
||||
"version": "v1.32.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-intl-icu.git",
|
||||
"reference": "d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78"
|
||||
"reference": "763d2a91fea5681509ca01acbc1c5e450d127811"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78",
|
||||
"reference": "d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/763d2a91fea5681509ca01acbc1c5e450d127811",
|
||||
"reference": "763d2a91fea5681509ca01acbc1c5e450d127811",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -4708,7 +4711,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.31.0"
|
||||
"source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.32.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -4724,20 +4727,20 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-09-09T11:45:10+00:00"
|
||||
"time": "2024-12-21T18:38:29+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-intl-idn",
|
||||
"version": "v1.31.0",
|
||||
"version": "v1.32.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-intl-idn.git",
|
||||
"reference": "c36586dcf89a12315939e00ec9b4474adcb1d773"
|
||||
"reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773",
|
||||
"reference": "c36586dcf89a12315939e00ec9b4474adcb1d773",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3",
|
||||
"reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -4791,7 +4794,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0"
|
||||
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.32.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -4807,11 +4810,11 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-09-09T11:45:10+00:00"
|
||||
"time": "2024-09-10T14:38:51+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-intl-normalizer",
|
||||
"version": "v1.31.0",
|
||||
"version": "v1.32.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
|
||||
@@ -4872,7 +4875,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0"
|
||||
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -4892,19 +4895,20 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-mbstring",
|
||||
"version": "v1.31.0",
|
||||
"version": "v1.32.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-mbstring.git",
|
||||
"reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341"
|
||||
"reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341",
|
||||
"reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493",
|
||||
"reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-iconv": "*",
|
||||
"php": ">=7.2"
|
||||
},
|
||||
"provide": {
|
||||
@@ -4952,7 +4956,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0"
|
||||
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -4968,7 +4972,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-09-09T11:45:10+00:00"
|
||||
"time": "2024-12-23T08:48:59+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-php72",
|
||||
@@ -5037,7 +5041,7 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-php73",
|
||||
"version": "v1.31.0",
|
||||
"version": "v1.32.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-php73.git",
|
||||
@@ -5093,7 +5097,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0"
|
||||
"source": "https://github.com/symfony/polyfill-php73/tree/v1.32.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -5113,16 +5117,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-php80",
|
||||
"version": "v1.31.0",
|
||||
"version": "v1.32.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-php80.git",
|
||||
"reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8"
|
||||
"reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
|
||||
"reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
|
||||
"reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -5173,7 +5177,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0"
|
||||
"source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -5189,11 +5193,11 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-09-09T11:45:10+00:00"
|
||||
"time": "2025-01-02T08:10:11+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-php81",
|
||||
"version": "v1.31.0",
|
||||
"version": "v1.32.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-php81.git",
|
||||
@@ -5249,7 +5253,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0"
|
||||
"source": "https://github.com/symfony/polyfill-php81/tree/v1.32.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
|
||||
@@ -52,10 +52,10 @@ class GroupsPriceController extends ActionController
|
||||
$this->view->assign('hotel', $hotel);
|
||||
$this->view->assign('runningCostsEUR', $this->settings['runningCostsEUR']);
|
||||
$this->view->assign('runningCostsCHF', $this->settings['runningCostsCHF']);
|
||||
$this->view->assign('undersubscriptionEUR', $this->settings['undersubscriptionEUR']);
|
||||
$this->view->assign('undersubscriptionCHF', $this->settings['undersubscriptionCHF']);
|
||||
$this->view->assign('undersubscriptionExtEUR', $this->settings['undersubscriptionExtEUR']);
|
||||
$this->view->assign('undersubscriptionExtCHF', $this->settings['undersubscriptionExtCHF']);
|
||||
$this->view->assign('undersubscription30EUR', $this->settings['undersubscription30EUR']);
|
||||
$this->view->assign('undersubscription30CHF', $this->settings['undersubscription30CHF']);
|
||||
$this->view->assign('undersubscription40EUR', $this->settings['undersubscription40EUR']);
|
||||
$this->view->assign('undersubscription40CHF', $this->settings['undersubscription40CHF']);
|
||||
$this->view->assign('countryCode', $hotel->getCountry()->getCode());
|
||||
$this->view->assign('configs', json_encode(array_values($configs), JSON_HEX_APOS));
|
||||
$this->view->assign('boards', json_encode($hotel->getGroupsPriceBoards()->toArray(), JSON_HEX_APOS));
|
||||
|
||||
@@ -5,7 +5,6 @@ namespace EP\EpProducts\Controller;
|
||||
use EP\EpProducts\Domain\Model\Date;
|
||||
use EP\EpProducts\Domain\Model\Travelinfo;
|
||||
use EP\EpProducts\Domain\Repository\DateRepository;
|
||||
use EP\EpProducts\Domain\Repository\ProductRepository;
|
||||
use EP\EpProducts\Domain\Repository\TravelinfoRepository;
|
||||
use TYPO3\CMS\Core\Http\ImmediateResponseException;
|
||||
use TYPO3\CMS\Core\Utility\GeneralUtility;
|
||||
@@ -24,19 +23,12 @@ class TravelinfoController extends ActionController
|
||||
*/
|
||||
private $travelinfoRepository;
|
||||
|
||||
/**
|
||||
* @var ProductRepository
|
||||
*/
|
||||
private $productRepository;
|
||||
|
||||
public function __construct(
|
||||
DateRepository $dateRepository,
|
||||
TravelinfoRepository $travelinfoRepository,
|
||||
ProductRepository $productRepository
|
||||
TravelinfoRepository $travelinfoRepository
|
||||
) {
|
||||
$this->dateRepository = $dateRepository;
|
||||
$this->travelinfoRepository = $travelinfoRepository;
|
||||
$this->productRepository = $productRepository;
|
||||
}
|
||||
|
||||
public function travelCodeAction(string $travelCode)
|
||||
|
||||
@@ -97,6 +97,11 @@ class GroupsPriceInquiry
|
||||
*/
|
||||
protected $pax;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $children;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
@@ -297,6 +302,22 @@ class GroupsPriceInquiry
|
||||
$this->pax = $pax;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getChildren()
|
||||
{
|
||||
return $this->children;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $pax
|
||||
*/
|
||||
public function setChildren($children)
|
||||
{
|
||||
$this->children = $children;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
|
||||
@@ -191,7 +191,7 @@ class ProductRepository extends AbstractRepository
|
||||
;
|
||||
}
|
||||
|
||||
public function getPricetable(Product $product, Hotel $hotel, array $filterSettings, Date $date = null, bool $sortByRoom = true): array
|
||||
public function getPricetable(Product $product, Hotel $hotel, array $filterSettings, Date $date = null): array
|
||||
{
|
||||
$qb = $this->getDbConnection()->createQueryBuilder();
|
||||
|
||||
@@ -207,18 +207,11 @@ class ProductRepository extends AbstractRepository
|
||||
)
|
||||
->from('tx_epproducts_domain_model_date', 'date')
|
||||
->innerJoin('date', 'tx_epproducts_domain_model_room', 'room', 'date.uid = room.date')
|
||||
->orderBy('room.available', 'DESC')
|
||||
->orderBy('room.pax', 'ASC')
|
||||
->addOrderBy('room.price', 'ASC')
|
||||
->addOrderBy('room.available', 'DESC')
|
||||
;
|
||||
|
||||
if (true === $sortByRoom) {
|
||||
$qb->addOrderBy('room.name', 'ASC');
|
||||
} else {
|
||||
$qb
|
||||
->addOrderBy('room.pax', 'ASC')
|
||||
->addOrderBy('room.price', 'ASC')
|
||||
;
|
||||
}
|
||||
|
||||
$qb
|
||||
->where('date.date_start >= NOW()')
|
||||
->andWhere($qb->expr()->eq(
|
||||
|
||||
@@ -109,7 +109,6 @@ class DateService implements SingletonInterface
|
||||
$date = $resolvedOptions['date'];
|
||||
$template = $resolvedOptions['template'];
|
||||
$paCode = $resolvedOptions['paCode'];
|
||||
$sortByRoom = $resolvedOptions['sortByRoom'];
|
||||
|
||||
if ($filterSettings === null) {
|
||||
$filterSettings = $this->filterService->getNormalizedFilterSettings();
|
||||
@@ -118,7 +117,7 @@ class DateService implements SingletonInterface
|
||||
$nonBookableDateUids = GeneralUtility::trimExplode(',', $product->getNonBookableDates(), true);
|
||||
|
||||
return $this->preprocessPriceTable([
|
||||
'priceTableData' => $this->productRepository->getPricetable($product, $hotel, $filterSettings, $date, $sortByRoom),
|
||||
'priceTableData' => $this->productRepository->getPricetable($product, $hotel, $filterSettings, $date),
|
||||
'template' => $template,
|
||||
'paCode' => $paCode,
|
||||
'isDayTrip' => $product->isDaytrip(),
|
||||
@@ -188,7 +187,11 @@ class DateService implements SingletonInterface
|
||||
$resolver->setDefault('isDayTrip', false);
|
||||
$resolver->setDefault('showBookingButton', true);
|
||||
$resolvedOptions = $resolver->resolve($options);
|
||||
$priceTable = [];
|
||||
|
||||
$priceTable = [
|
||||
'available' => [],
|
||||
'unavailable' => [],
|
||||
];
|
||||
|
||||
$priceTableData = $resolvedOptions['priceTableData'];
|
||||
$template = $resolvedOptions['template'];
|
||||
@@ -210,7 +213,10 @@ class DateService implements SingletonInterface
|
||||
'isDayTrip' => $isDayTrip,
|
||||
]);
|
||||
$optionalServices = $this->preprocessOptionalServices(unserialize($row['roomOptionalServices'], ['allowed_classes' => false]));
|
||||
$priceTable[] = [
|
||||
|
||||
$key = $row['roomAvailable'] && $row['roomPrice'] ? 'available' : 'unavailable';
|
||||
|
||||
$priceTable[$key][] = [
|
||||
'dateStart' => $dateStart->format('d.m.Y'),
|
||||
'dateEnd' => $dateEnd->format('d.m.Y'),
|
||||
'season' => $row['season'],
|
||||
|
||||
@@ -69,7 +69,7 @@ class SearchResultService implements SingletonInterface
|
||||
'destinationUid' => null,
|
||||
'destinationType' => null,
|
||||
'nights' => null,
|
||||
'pax' => 1,
|
||||
'pax' => 0,
|
||||
'pageUid' => null,
|
||||
]);
|
||||
|
||||
|
||||
+8
-8
@@ -32,7 +32,7 @@
|
||||
</config>
|
||||
</TCEforms>
|
||||
</settings.runningCostsCHF>
|
||||
<settings.undersubscriptionEUR>
|
||||
<settings.undersubscription30EUR>
|
||||
<TCEforms>
|
||||
<exclude>0</exclude>
|
||||
<label>Unterbelegung 30-39 Personen EUR</label>
|
||||
@@ -42,8 +42,8 @@
|
||||
<eval>double2,required</eval>
|
||||
</config>
|
||||
</TCEforms>
|
||||
</settings.undersubscriptionEUR>
|
||||
<settings.undersubscriptionCHF>
|
||||
</settings.undersubscription30EUR>
|
||||
<settings.undersubscription30CHF>
|
||||
<TCEforms>
|
||||
<exclude>0</exclude>
|
||||
<label>Unterbelegung 30-39 Personen CHF</label>
|
||||
@@ -53,8 +53,8 @@
|
||||
<eval>double2,required</eval>
|
||||
</config>
|
||||
</TCEforms>
|
||||
</settings.undersubscriptionCHF>
|
||||
<settings.undersubscriptionExtEUR>
|
||||
</settings.undersubscription30CHF>
|
||||
<settings.undersubscription40EUR>
|
||||
<TCEforms>
|
||||
<exclude>0</exclude>
|
||||
<label>Unterbelegung 40-49 Personen EUR</label>
|
||||
@@ -64,8 +64,8 @@
|
||||
<eval>double2,required</eval>
|
||||
</config>
|
||||
</TCEforms>
|
||||
</settings.undersubscriptionExtEUR>
|
||||
<settings.undersubscriptionExtCHF>
|
||||
</settings.undersubscription40EUR>
|
||||
<settings.undersubscription40CHF>
|
||||
<TCEforms>
|
||||
<exclude>0</exclude>
|
||||
<label>Unterbelegung 40-49 Personen CHF</label>
|
||||
@@ -75,7 +75,7 @@
|
||||
<eval>double2,required</eval>
|
||||
</config>
|
||||
</TCEforms>
|
||||
</settings.undersubscriptionExtCHF>
|
||||
</settings.undersubscription40CHF>
|
||||
</el>
|
||||
</ROOT>
|
||||
</sDEF>
|
||||
|
||||
@@ -29,6 +29,7 @@ class IconViewHelper extends AbstractTagBasedViewHelper
|
||||
|
||||
$content = sprintf('<use href="%s#icon-%s"></use>', $imageUrl, $this->arguments['icon']);
|
||||
$this->tag->setContent($content);
|
||||
$this->tag->addAttributes(['aria-hidden' => 'true']);
|
||||
|
||||
return $this->tag->render();
|
||||
}
|
||||
|
||||
@@ -41,6 +41,8 @@ class LazyLoadImageViewHelper extends ImageViewHelper
|
||||
$classItems[] = 'lazyload';
|
||||
$classes = implode(' ', array_unique($classItems));
|
||||
$this->tag->addAttribute('class', $classes);
|
||||
// ensure a11y compliance
|
||||
$this->tag->removeAttribute('title');
|
||||
|
||||
return $this->tag->render();
|
||||
}
|
||||
|
||||
@@ -38,7 +38,6 @@ plugin.tx_eptheme {
|
||||
defaultDetailPageUid = {$plugin.tx_epproducts.settings.defaultDetailPageUid}
|
||||
coronaUpdatesPageUid = {$plugin.tx_eptheme.settings.coronaUpdatesPageUid}
|
||||
logoImage = {$plugin.tx_eptheme.settings.logoImage}
|
||||
defaultTitle < sitetitle
|
||||
forceActiveTopnavUid = {$plugin.tx_eptheme.settings.forceActiveTopnavUid}
|
||||
eventDateDayFrom = {$plugin.tx_eptheme.settings.eventDateDayFrom}
|
||||
eventDateDayTo = {$plugin.tx_eptheme.settings.eventDateDayTo}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
||||
<!-- Symbols -->
|
||||
<symbol id="icon-menu" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"/></symbol>
|
||||
<symbol id="icon-chevron-down" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/></symbol>
|
||||
|
||||
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
+97
-48
@@ -16,20 +16,37 @@
|
||||
Einzelne Nächte sind nur auf Anfrage buchbar
|
||||
</p>
|
||||
</div>
|
||||
<div class="mb-8"
|
||||
<div class="mb-8 grid sm:grid-cols-2 gap-8"
|
||||
v-show="!submitted">
|
||||
<label class="mb-2 font-bold">
|
||||
Personenzahl
|
||||
</label>
|
||||
<input type="number"
|
||||
class="form-field"
|
||||
v-model.number="selectedPax"
|
||||
@change="onPaxUpdated()"
|
||||
v-show="nightsCount > 0"/>
|
||||
<p class="text-sm italic"
|
||||
v-show="nightsCount === 0">
|
||||
Bitte zuerst einen Zeitraum wählen
|
||||
</p>
|
||||
<div>
|
||||
<label class="mb-2 font-bold">
|
||||
Personenzahl
|
||||
</label>
|
||||
<input type="number"
|
||||
class="form-field"
|
||||
min="30"
|
||||
v-model.number="selectedPax"
|
||||
@change="onPaxUpdated()"
|
||||
v-show="nightsCount > 0"/>
|
||||
<p class="text-sm italic"
|
||||
v-show="nightsCount === 0">
|
||||
Bitte zuerst einen Zeitraum wählen
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<label class="mb-2 font-bold">
|
||||
davon Kinder 0-3 Jahre
|
||||
</label>
|
||||
<input type="number"
|
||||
class="form-field"
|
||||
min="0"
|
||||
v-model.number="childrenCount"
|
||||
@change="onPaxUpdated()"
|
||||
v-show="nightsCount > 0"/>
|
||||
<p class="text-sm italic">
|
||||
Kinder werden nur bei Strom- und Abfallgebühren berücksichtigt
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-8"
|
||||
v-show="options.length > 0 && !submitted">
|
||||
@@ -68,10 +85,18 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-8">
|
||||
<div class="pb-2" v-if="submitted">
|
||||
<p class="text-lg font-bold pb-2">
|
||||
Vielen Dank für Deine {{ mode === 'booking' ? 'Buchung' : 'Anfrage' }}.
|
||||
</p>
|
||||
<p>
|
||||
Für folgendes habt ihr euch entschieden:
|
||||
</p>
|
||||
</div>
|
||||
<div class="p-2 uppercase bg-ep-primary-dark text-white w-full">
|
||||
Preise
|
||||
</div>
|
||||
<div class="bg-zinc-100 p-2">
|
||||
<div class="bg-zinc-100 p-2 mb-2">
|
||||
<table class="w-full" v-show="nightsCount > 0">
|
||||
<tbody>
|
||||
<tr class="odd:bg-zinc-100">
|
||||
@@ -95,7 +120,7 @@
|
||||
<tr class="odd:bg-zinc-100"
|
||||
v-for="selectedOption in selectedOptions">
|
||||
<th class="text-left py-2">{{ selectedOption.title }}</th>
|
||||
<td>{{ formatCurrency(selectedOption.price) }}</td>
|
||||
<td>{{ formatCurrency(calculateOptionPrice(selectedOption)) }}</td>
|
||||
</tr>
|
||||
<tr class="odd:bg-zinc-100"
|
||||
v-if="priceBoard.EUR > 0 || priceBoard.CHF > 0">
|
||||
@@ -114,8 +139,10 @@
|
||||
</tr>
|
||||
<tr class="odd:bg-zinc-100">
|
||||
<th class="text-left py-2">Gesamtpreis</th>
|
||||
<td><strong>{{ formatCurrency(priceTotal) }}</strong>
|
||||
<br><small>zzgl. vor Ort zu entrichtender Ortstaxe</small>
|
||||
<td>
|
||||
<strong>{{ formatCurrency(priceTotal) }}</strong>
|
||||
<br>
|
||||
<small>zzgl. vor Ort zu entrichtender Ortstaxe</small>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
@@ -125,6 +152,15 @@
|
||||
Bitte zuerst einen Zeitraum wählen
|
||||
</p>
|
||||
</div>
|
||||
<div v-if="mode === 'booking' && submitted">
|
||||
Bitte beachtet, dass die Buchung bei uns eingegangen, aber <strong>noch nicht bestätigt</strong> ist.
|
||||
Wir behalten uns vor, die Buchungen auf Verfügbarkeit und Länge des gewünschten Aufenthalts zu prüfen.
|
||||
Erst wenn wir euch die Buchung per Mail bestätigt haben, wird sie bindend.
|
||||
</div>
|
||||
<div v-if="mode === 'inquiry' && submitted">
|
||||
Die Anfrage ist bei uns eingegangen und wird schnellstmöglich bearbeitet. Wir melden uns telefonisch
|
||||
oder per Mail bei euch.
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-8"
|
||||
v-show="nightsCount > 0 && !submitted">
|
||||
@@ -235,9 +271,6 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="py-8 text-xl text-center font-bold" v-show="submitted">
|
||||
Vielen Dank für Deine {{ mode === 'booking' ? 'Buchung' : 'Anfrage' }}. Wir werden diese schnellstmöglich bearbeiten.
|
||||
</div>
|
||||
<div>
|
||||
<img :src="logoAt" alt="" v-if="countryCode === 'AT'" class="block w-full h-auto max-w-24">
|
||||
<img :src="logoCh" alt="" v-if="countryCode === 'CH'" class="block w-full h-auto max-w-24">
|
||||
@@ -292,19 +325,19 @@ export default {
|
||||
type: Number,
|
||||
default: 2.9,
|
||||
},
|
||||
undersubscriptionEur: {
|
||||
undersubscription30Eur: {
|
||||
type: Number,
|
||||
default: 5.0,
|
||||
},
|
||||
undersubscriptionChf: {
|
||||
undersubscription30Chf: {
|
||||
type: Number,
|
||||
default: 5.0,
|
||||
},
|
||||
undersubscriptionExtEur: {
|
||||
undersubscription40Eur: {
|
||||
type: Number,
|
||||
default: 2.5,
|
||||
},
|
||||
undersubscriptionExtChf: {
|
||||
undersubscription40Chf: {
|
||||
type: Number,
|
||||
default: 2.5,
|
||||
},
|
||||
@@ -348,6 +381,7 @@ export default {
|
||||
selectedTo: null,
|
||||
selectedRange: [],
|
||||
selectedPax: 30,
|
||||
childrenCount: 0,
|
||||
selectedOptions: [],
|
||||
selectedBoard: null,
|
||||
name: null,
|
||||
@@ -380,6 +414,28 @@ export default {
|
||||
|
||||
return price
|
||||
},
|
||||
calculateOptionPrice(option) {
|
||||
let price = {
|
||||
EUR: 0,
|
||||
CHF: 0,
|
||||
};
|
||||
let optionPriceEUR = option.price.EUR
|
||||
let optionPriceCHF = option.price.CHF
|
||||
if (1 === option.type) {
|
||||
price.EUR = optionPriceEUR;
|
||||
price.CHF = optionPriceCHF;
|
||||
} else if (2 === option.type) {
|
||||
price.EUR = optionPriceEUR * this.paxCount;
|
||||
price.CHF = optionPriceCHF * this.paxCount;
|
||||
} else if (3 === option.type) {
|
||||
price.EUR = optionPriceEUR * this.nightsCount;
|
||||
price.CHF = optionPriceCHF * this.nightsCount;
|
||||
} else if (4 === option.type) {
|
||||
price.EUR = optionPriceEUR * this.nightsCount * this.paxCount;
|
||||
price.CHF = optionPriceCHF * this.nightsCount * this.paxCount;
|
||||
}
|
||||
return price;
|
||||
},
|
||||
formatOptionPriceType(option) {
|
||||
if (2 === option.type) {
|
||||
return ` (${this.formatCurrency(option.price)} pro Person)`
|
||||
@@ -438,6 +494,7 @@ export default {
|
||||
'tx_epproducts_ajax[groupsPriceInquiry][dateFrom]': this.selectedFrom.format('DD.MM.YYYY'),
|
||||
'tx_epproducts_ajax[groupsPriceInquiry][dateTo]': this.selectedTo.format('DD.MM.YYYY'),
|
||||
'tx_epproducts_ajax[groupsPriceInquiry][pax]': this.selectedPax,
|
||||
'tx_epproducts_ajax[groupsPriceInquiry][children]': this.childrenCount,
|
||||
'tx_epproducts_ajax[groupsPriceInquiry][summary][paxBase]': this.formatCurrency(this.pricePax.base),
|
||||
'tx_epproducts_ajax[groupsPriceInquiry][summary][paxAdditional]': this.formatCurrency(this.pricePax.additional),
|
||||
'tx_epproducts_ajax[groupsPriceInquiry][summary][undersubscription]': this.formatCurrency(this.pricePax.undersubscription),
|
||||
@@ -474,6 +531,10 @@ export default {
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
paxCount() {
|
||||
// subtract number of children from pax for price calculation, but minimum 30 pax
|
||||
return Math.max(this.selectedPax - this.childrenCount, 30)
|
||||
},
|
||||
nightsCount() {
|
||||
return this.selectedRange.length;
|
||||
},
|
||||
@@ -506,7 +567,7 @@ export default {
|
||||
base.EUR += config.price.EUR
|
||||
base.CHF += config.price.CHF
|
||||
let included = config.personsIncluded
|
||||
let additionalPax = this.selectedPax - included
|
||||
let additionalPax = this.paxCount - included
|
||||
if (this.selectedPax > included) {
|
||||
additional.EUR += additionalPax * config.priceAdditionalPerson.EUR
|
||||
additional.CHF += additionalPax * config.priceAdditionalPerson.CHF
|
||||
@@ -514,12 +575,12 @@ export default {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this.selectedBoard && this.selectedPax < 40) {
|
||||
undersubscription.EUR = this.selectedPax * this.undersubscriptionEur * this.selectedRange.length
|
||||
undersubscription.CHF = this.selectedPax * this.undersubscriptionChf * this.selectedRange.length
|
||||
} else if (this.selectedBoard && this.selectedPax < 50) {
|
||||
undersubscription.EUR = this.selectedPax * this.undersubscriptionExtEur * this.selectedRange.length
|
||||
undersubscription.CHF = this.selectedPax * this.undersubscriptionExtChf * this.selectedRange.length
|
||||
if (this.selectedBoard && this.paxCount < 40) {
|
||||
undersubscription.EUR = this.paxCount * this.undersubscription30Eur * this.selectedRange.length
|
||||
undersubscription.CHF = this.paxCount * this.undersubscription30Chf * this.selectedRange.length
|
||||
} else if (this.selectedBoard && this.paxCount < 50) {
|
||||
undersubscription.EUR = this.paxCount * this.undersubscription40Eur * this.selectedRange.length
|
||||
undersubscription.CHF = this.paxCount * this.undersubscription40Chf * this.selectedRange.length
|
||||
}
|
||||
|
||||
return {base, additional, undersubscription}
|
||||
@@ -530,21 +591,9 @@ export default {
|
||||
CHF: 0,
|
||||
};
|
||||
for (let option of this.selectedOptions) {
|
||||
let optionPriceEUR = option.price.EUR
|
||||
let optionPriceCHF = option.price.CHF
|
||||
if (1 === option.type) {
|
||||
price.EUR += optionPriceEUR;
|
||||
price.CHF += optionPriceCHF;
|
||||
} else if (2 === option.type) {
|
||||
price.EUR += optionPriceEUR * this.selectedPax;
|
||||
price.CHF += optionPriceCHF * this.selectedPax;
|
||||
} else if (3 === option.type) {
|
||||
price.EUR += optionPriceEUR * this.nightsCount;
|
||||
price.CHF += optionPriceCHF * this.nightsCount;
|
||||
} else if (4 === option.type) {
|
||||
price.EUR += optionPriceEUR * this.nightsCount * this.selectedPax;
|
||||
price.CHF += optionPriceCHF * this.nightsCount * this.selectedPax;
|
||||
}
|
||||
let optionPrice = this.calculateOptionPrice(option)
|
||||
price.EUR += optionPrice.EUR;
|
||||
price.CHF += optionPrice.CHF;
|
||||
}
|
||||
return price;
|
||||
},
|
||||
@@ -554,8 +603,8 @@ export default {
|
||||
CHF: 0,
|
||||
}
|
||||
if (this.selectedBoard) {
|
||||
price.EUR = this.selectedBoard.price.EUR * this.nightsCount * this.selectedPax;
|
||||
price.CHF = this.selectedBoard.price.CHF * this.nightsCount * this.selectedPax;
|
||||
price.EUR = this.selectedBoard.price.EUR * this.nightsCount * this.paxCount;
|
||||
price.CHF = this.selectedBoard.price.CHF * this.nightsCount * this.paxCount;
|
||||
}
|
||||
return price
|
||||
},
|
||||
|
||||
@@ -25,7 +25,7 @@ h4,
|
||||
}
|
||||
|
||||
.subline {
|
||||
@apply block text-xs md:text-sm font-normal leading-6 opacity-60;
|
||||
@apply block text-sm md:text-base font-normal leading-6;
|
||||
}
|
||||
|
||||
// Lists
|
||||
|
||||
@@ -121,6 +121,11 @@ renderables:
|
||||
type: Textarea
|
||||
identifier: message
|
||||
label: 'Deine Kontaktanfrage'
|
||||
-
|
||||
defaultValue: ''
|
||||
type: Text
|
||||
identifier: bookingNumber
|
||||
label: 'Buchungsnummer (falls vorhanden)'
|
||||
-
|
||||
type: LinkedCheckbox
|
||||
identifier: privacypolicyaccepted
|
||||
|
||||
@@ -4,14 +4,20 @@
|
||||
|
||||
<f:cObject typoscriptObjectPath="lib.searchBarCollapsed"/>
|
||||
<f:alias map="{searchbarCollapsed: 1}">
|
||||
<f:render partial="Topnav" arguments="{_all}"/>
|
||||
<f:render partial="Mainnav" section="Main" arguments="{_all}"/>
|
||||
</f:alias>
|
||||
<f:render section="Content"/>
|
||||
<f:render section="Teasers"/>
|
||||
<f:render partial="Footer" arguments="{_all}"/>
|
||||
<f:render partial="ContactBar" arguments="{_all}"/>
|
||||
<f:render partial="Topnav" arguments="{_all}"/>
|
||||
<f:render partial="Mobilenav" section="Main" arguments="{_all}"/>
|
||||
<f:render partial="Search/MobileSearch" arguments="{_all}"/>
|
||||
<main>
|
||||
<f:render section="Content"/>
|
||||
<f:render section="Teasers"/>
|
||||
</main>
|
||||
<footer>
|
||||
<f:render partial="Footer" arguments="{_all}"/>
|
||||
</footer>
|
||||
<aside>
|
||||
<f:render partial="ContactBar" arguments="{_all}"/>
|
||||
<f:render partial="Mobilenav" section="Main" arguments="{_all}"/>
|
||||
<f:render partial="Search/MobileSearch" arguments="{_all}"/>
|
||||
</aside>
|
||||
<f:render partial="Config" arguments="{_all}" />
|
||||
</html>
|
||||
|
||||
@@ -2,22 +2,30 @@
|
||||
xmlns="http://www.w3.org/1999/xhtml"
|
||||
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
|
||||
|
||||
<f:render partial="Mainnav" section="Main" arguments="{_all}"/>
|
||||
<f:render partial="HeaderSlider" arguments="{_all}"/>
|
||||
<f:if condition="{data.tx_eptheme_hide_searchbar} || {settings.hideSearchbar}">
|
||||
<f:else>
|
||||
<f:cObject typoscriptObjectPath="lib.searchBar"/>
|
||||
</f:else>
|
||||
</f:if>
|
||||
<f:render section="Content"/>
|
||||
<f:render partial="Footer" arguments="{_all}"/>
|
||||
<f:render partial="ContactBar" arguments="{_all}"/>
|
||||
<f:render partial="Topnav" arguments="{_all}"/>
|
||||
<f:render partial="Mobilenav" section="Main" arguments="{_all}"/>
|
||||
<f:if condition="{data.tx_eptheme_hide_searchbar} || {settings.hideSearchbar}">
|
||||
<f:else>
|
||||
<f:render partial="Search/MobileSearch" arguments="{_all}"/>
|
||||
</f:else>
|
||||
</f:if>
|
||||
<f:render partial="Mainnav" section="Main" arguments="{_all}"/>
|
||||
<header>
|
||||
<f:render partial="HeaderSlider" arguments="{_all}"/>
|
||||
</header>
|
||||
<main>
|
||||
<f:if condition="{data.tx_eptheme_hide_searchbar} || {settings.hideSearchbar}">
|
||||
<f:else>
|
||||
<f:cObject typoscriptObjectPath="lib.searchBar"/>
|
||||
</f:else>
|
||||
</f:if>
|
||||
<f:render section="Content"/>
|
||||
</main>
|
||||
<footer>
|
||||
<f:render partial="Footer" arguments="{_all}"/>
|
||||
</footer>
|
||||
<aside>
|
||||
<f:render partial="ContactBar" arguments="{_all}"/>
|
||||
<f:render partial="Mobilenav" section="Main" arguments="{_all}"/>
|
||||
<f:if condition="{data.tx_eptheme_hide_searchbar} || {settings.hideSearchbar}">
|
||||
<f:else>
|
||||
<f:render partial="Search/MobileSearch" arguments="{_all}"/>
|
||||
</f:else>
|
||||
</f:if>
|
||||
</aside>
|
||||
<f:render partial="Config" arguments="{_all}" />
|
||||
</html>
|
||||
|
||||
@@ -3,12 +3,20 @@
|
||||
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
|
||||
|
||||
<f:render partial="Mainnav" section="Main" arguments="{_all}"/>
|
||||
<f:render partial="EventHero" arguments="{_all}"/>
|
||||
<f:render partial="EventDisturber" arguments="{headline: settings.eventDisturberHeadline, listItems: settings.eventDisturberListitems, buttonLabel: settings.eventDisturberButtonLabel, buttonLink: settings.eventDisturberButtonLink}"/>
|
||||
<f:render section="Content"/>
|
||||
<f:render partial="Footer" arguments="{_all}"/>
|
||||
<f:render partial="ContactBar" arguments="{_all}"/>
|
||||
<f:render partial="Topnav" arguments="{_all}"/>
|
||||
<f:render partial="Mobilenav" section="Main" arguments="{_all}"/>
|
||||
<header>
|
||||
<f:render partial="EventHero" arguments="{_all}"/>
|
||||
<f:render partial="EventDisturber" arguments="{headline: settings.eventDisturberHeadline, listItems: settings.eventDisturberListitems, buttonLabel: settings.eventDisturberButtonLabel, buttonLink: settings.eventDisturberButtonLink}"/>
|
||||
</header>
|
||||
<main>
|
||||
<f:render section="Content"/>
|
||||
</main>
|
||||
<footer>
|
||||
<f:render partial="Footer" arguments="{_all}"/>
|
||||
</footer>
|
||||
<aside>
|
||||
<f:render partial="ContactBar" arguments="{_all}"/>
|
||||
<f:render partial="Topnav" arguments="{_all}"/>
|
||||
<f:render partial="Mobilenav" section="Main" arguments="{_all}"/>
|
||||
</aside>
|
||||
<f:render partial="Config" arguments="{_all}" />
|
||||
</html>
|
||||
|
||||
@@ -3,16 +3,22 @@
|
||||
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
|
||||
|
||||
<f:render partial="Mainnav" section="Main" arguments="{_all}"/>
|
||||
<f:render partial="HeaderSliderSmall" arguments="{_all}"/>
|
||||
<f:if condition="{data.tx_eptheme_hide_searchbar} || {settings.hideSearchbar}">
|
||||
<f:else>
|
||||
<f:cObject typoscriptObjectPath="lib.searchBar"/>
|
||||
</f:else>
|
||||
</f:if>
|
||||
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
|
||||
<f:render section="Content"/>
|
||||
<f:render section="Teasers"/>
|
||||
<f:render partial="Footer" arguments="{_all}"/>
|
||||
<header>
|
||||
<f:render partial="HeaderSliderSmall" arguments="{_all}"/>
|
||||
<f:if condition="{data.tx_eptheme_hide_searchbar} || {settings.hideSearchbar}">
|
||||
<f:else>
|
||||
<f:cObject typoscriptObjectPath="lib.searchBar"/>
|
||||
</f:else>
|
||||
</f:if>
|
||||
</header>
|
||||
<main>
|
||||
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
|
||||
<f:render section="Content"/>
|
||||
<f:render section="Teasers"/>
|
||||
</main>
|
||||
<footer>
|
||||
<f:render partial="Footer" arguments="{_all}"/>
|
||||
</footer>
|
||||
<f:render partial="ContactBar" arguments="{_all}"/>
|
||||
<f:render partial="Topnav" arguments="{_all}"/>
|
||||
<f:render partial="Mobilenav" section="Main" arguments="{_all}"/>
|
||||
|
||||
+23
-17
@@ -3,24 +3,30 @@
|
||||
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
|
||||
|
||||
<f:render partial="Mainnav" section="Main" arguments="{_all}"/>
|
||||
<f:render partial="HeaderSliderSmall" arguments="{_all}"/>
|
||||
<f:if condition="{data.tx_eptheme_hide_searchbar}">
|
||||
<f:else>
|
||||
<f:cObject typoscriptObjectPath="lib.searchBar"/>
|
||||
</f:else>
|
||||
</f:if>
|
||||
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
|
||||
<f:render section="Header" optional="true"/>
|
||||
<div class="container grid grid-cols-3 gap-8">
|
||||
<div class="col-span-3 lg:col-span-1 order-last lg:order-none">
|
||||
<f:render section="Sidebar"/>
|
||||
<header>
|
||||
<f:render partial="HeaderSliderSmall" arguments="{_all}"/>
|
||||
<f:if condition="{data.tx_eptheme_hide_searchbar}">
|
||||
<f:else>
|
||||
<f:cObject typoscriptObjectPath="lib.searchBar"/>
|
||||
</f:else>
|
||||
</f:if>
|
||||
</header>
|
||||
<main>
|
||||
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
|
||||
<f:render section="Header" optional="true"/>
|
||||
<div class="container grid grid-cols-3 gap-8">
|
||||
<div class="col-span-3 lg:col-span-1 order-last lg:order-none">
|
||||
<f:render section="Sidebar"/>
|
||||
</div>
|
||||
<div class="col-span-3 lg:col-span-2">
|
||||
<f:render section="Content"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-span-3 lg:col-span-2">
|
||||
<f:render section="Content"/>
|
||||
</div>
|
||||
</div>
|
||||
<f:render section="Teasers"/>
|
||||
<f:render partial="Footer" arguments="{_all}"/>
|
||||
<f:render section="Teasers"/>
|
||||
</main>
|
||||
<footer>
|
||||
<f:render partial="Footer" arguments="{_all}"/>
|
||||
</footer>
|
||||
<f:render partial="ContactBar" arguments="{_all}"/>
|
||||
<f:render partial="Topnav" arguments="{_all}"/>
|
||||
<f:render partial="Mobilenav" section="Main" arguments="{_all}"/>
|
||||
|
||||
+18
-12
@@ -3,19 +3,25 @@
|
||||
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
|
||||
|
||||
<f:render partial="Mainnav" section="Main" arguments="{_all}"/>
|
||||
<f:render partial="HeaderSliderSmall" arguments="{_all}"/>
|
||||
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
|
||||
<f:render section="Header" optional="true"/>
|
||||
<div class="container grid grid-cols-3 gap-8">
|
||||
<div class="col-span-3 lg:col-span-1 order-last lg:order-none">
|
||||
<f:render section="Sidebar"/>
|
||||
<header>
|
||||
<f:render partial="HeaderSliderSmall" arguments="{_all}"/>
|
||||
</header>
|
||||
<main>
|
||||
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
|
||||
<f:render section="Header" optional="true"/>
|
||||
<div class="container grid grid-cols-3 gap-8">
|
||||
<div class="col-span-3 lg:col-span-1 order-last lg:order-none">
|
||||
<f:render section="Sidebar"/>
|
||||
</div>
|
||||
<div class="col-span-3 lg:col-span-2">
|
||||
<f:render section="Content"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-span-3 lg:col-span-2">
|
||||
<f:render section="Content"/>
|
||||
</div>
|
||||
</div>
|
||||
<f:render section="Teasers"/>
|
||||
<f:render partial="Footer" arguments="{_all}"/>
|
||||
<f:render section="Teasers"/>
|
||||
</main>
|
||||
<footer>
|
||||
<f:render partial="Footer" arguments="{_all}"/>
|
||||
</footer>
|
||||
<f:render partial="ContactBar" arguments="{_all}"/>
|
||||
<f:render partial="Topnav" arguments="{_all}"/>
|
||||
<f:render partial="Mobilenav" section="Main" arguments="{_all}"/>
|
||||
|
||||
+23
-17
@@ -3,24 +3,30 @@
|
||||
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
|
||||
|
||||
<f:render partial="Mainnav" section="Main" arguments="{_all}"/>
|
||||
<f:render partial="HeaderSliderSmall" arguments="{_all}"/>
|
||||
<f:if condition="{data.tx_eptheme_hide_searchbar}">
|
||||
<f:else>
|
||||
<f:cObject typoscriptObjectPath="lib.searchBar"/>
|
||||
</f:else>
|
||||
</f:if>
|
||||
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
|
||||
<f:render section="Header" optional="true"/>
|
||||
<div class="container grid grid-cols-3 gap-8">
|
||||
<div class="col-span-3 lg:col-span-2">
|
||||
<f:render section="Content"/>
|
||||
<header>
|
||||
<f:render partial="HeaderSliderSmall" arguments="{_all}"/>
|
||||
<f:if condition="{data.tx_eptheme_hide_searchbar}">
|
||||
<f:else>
|
||||
<f:cObject typoscriptObjectPath="lib.searchBar"/>
|
||||
</f:else>
|
||||
</f:if>
|
||||
</header>
|
||||
<main>
|
||||
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
|
||||
<f:render section="Header" optional="true"/>
|
||||
<div class="container grid grid-cols-3 gap-8">
|
||||
<div class="col-span-3 lg:col-span-2">
|
||||
<f:render section="Content"/>
|
||||
</div>
|
||||
<div class="col-span-3 lg:col-span-1">
|
||||
<f:render section="Sidebar"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-span-3 lg:col-span-1">
|
||||
<f:render section="Sidebar"/>
|
||||
</div>
|
||||
</div>
|
||||
<f:render section="Teasers"/>
|
||||
<f:render partial="Footer" arguments="{_all}"/>
|
||||
<f:render section="Teasers"/>
|
||||
</main>
|
||||
<footer>
|
||||
<f:render partial="Footer" arguments="{_all}"/>
|
||||
</footer>
|
||||
<f:render partial="ContactBar" arguments="{_all}"/>
|
||||
<f:render partial="Topnav" arguments="{_all}"/>
|
||||
<f:render partial="Mobilenav" section="Main" arguments="{_all}"/>
|
||||
|
||||
+18
-12
@@ -3,19 +3,25 @@
|
||||
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
|
||||
|
||||
<f:render partial="Mainnav" section="Main" arguments="{_all}"/>
|
||||
<f:render partial="HeaderSliderSmall" arguments="{_all}"/>
|
||||
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
|
||||
<f:render section="Header" optional="true"/>
|
||||
<div class="container grid grid-cols-3 gap-8">
|
||||
<div class="col-span-3 lg:col-span-2">
|
||||
<f:render section="Content"/>
|
||||
<header>
|
||||
<f:render partial="HeaderSliderSmall" arguments="{_all}"/>
|
||||
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
|
||||
</header>
|
||||
<main>
|
||||
<f:render section="Header" optional="true"/>
|
||||
<div class="container grid grid-cols-3 gap-8">
|
||||
<div class="col-span-3 lg:col-span-2">
|
||||
<f:render section="Content"/>
|
||||
</div>
|
||||
<div class="col-span-3 lg:col-span-1">
|
||||
<f:render section="Sidebar"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-span-3 lg:col-span-1">
|
||||
<f:render section="Sidebar"/>
|
||||
</div>
|
||||
</div>
|
||||
<f:render section="Teasers"/>
|
||||
<f:render partial="Footer" arguments="{_all}"/>
|
||||
<f:render section="Teasers"/>
|
||||
</main>
|
||||
<footer>
|
||||
<f:render partial="Footer" arguments="{_all}"/>
|
||||
</footer>
|
||||
<f:render partial="ContactBar" arguments="{_all}"/>
|
||||
<f:render partial="Topnav" arguments="{_all}"/>
|
||||
<f:render partial="Mobilenav" section="Main" arguments="{_all}"/>
|
||||
|
||||
@@ -3,13 +3,13 @@
|
||||
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers"
|
||||
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
|
||||
|
||||
<div class="container bg-white flex items-center justify-between">
|
||||
<header class="container bg-white flex items-center justify-between">
|
||||
<f:link.typolink parameter="{f:if(condition: settings.logoLink, then: settings.logoLink, else: settings.defaultHomeUid)}"
|
||||
class="block lg:pb-4"
|
||||
title="{settings.defaultTitle}">
|
||||
<f:image src="{settings.logoImage}"
|
||||
title="zur Startseite">
|
||||
<f:image src="Logo"
|
||||
class="block w-auto {ep:themeClasses(classes: '{ep: \'h-10 lg:h-12\', sbw: \'h-14 lg:h-24\', snz: \'h-14 lg:h-24\', suz: \'h-14 lg:h-24\', uch: \'h-12 lg:h-20\', ser: \'h-10 lg:h-12\'}', key: settings.themekey)}"
|
||||
alt="{settings.defaultTitle}"/>
|
||||
alt="Logo"/>
|
||||
</f:link.typolink>
|
||||
<f:link.typolink parameter="{settings.myEpPageUid}"
|
||||
title="My E&P"
|
||||
@@ -17,8 +17,12 @@
|
||||
<div class="text-xl lg:text-2xl font-light leading-none">Login</div>
|
||||
<div class="text-lg lg:text-xl font-medium leading-none">My E&P</div>
|
||||
</f:link.typolink>
|
||||
</div>
|
||||
<f:render section="Content"/>
|
||||
<f:render partial="Footer" arguments="{_all}"/>
|
||||
</header>
|
||||
<main>
|
||||
<f:render section="Content"/>
|
||||
</main>
|
||||
<footer>
|
||||
<f:render partial="Footer" arguments="{_all}"/>
|
||||
</footer>
|
||||
<f:render partial="Config" arguments="{_all}" />
|
||||
</html>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
|
||||
|
||||
<f:section name="Teaser">
|
||||
<a href="{f:uri.typolink(parameter: city.detailPage)}" class="flex flex-col" title="{city.name}">
|
||||
<a href="{f:uri.typolink(parameter: city.detailPage)}" class="flex flex-col">
|
||||
<div class="relative">
|
||||
{ep:icon(icon: 'flag-{city.country.code -> f:format.case(mode: \'lower\')}', class: 'w-8 h-6 absolute top-0 left-0')}
|
||||
<f:alias map="{teaserImage: city.teaserImage, defaultImage: city.images.0}">
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
<f:section name="Teaser">
|
||||
<f:if condition="{concept}">
|
||||
<a href="{f:uri.typolink(parameter: concept.detailPage)}" title="{concept.name}" class="flex flex-col">
|
||||
<div class="relative flex flex-col">
|
||||
<div class="relative">
|
||||
<f:alias map="{teaserImage: concept.teaserImage, defaultImage: concept.headerImage}">
|
||||
<f:if condition="{teaserImage}">
|
||||
@@ -33,17 +33,19 @@
|
||||
</f:else>
|
||||
</f:if>
|
||||
</f:alias>
|
||||
<div class="absolute top-0 left-0 inset-0 bg-concept-{concept.code}/70">
|
||||
<div class="flex h-full w-full p-4 items-end headline--3 text-white">
|
||||
<div class="absolute z-10 inset-0 bg-concept-{concept.code}/70">
|
||||
<f:link.typolink parameter="{concept.detailPage}"
|
||||
class="flex h-full w-full p-4 items-end headline--3 text-white">
|
||||
{concept.name}
|
||||
</div>
|
||||
<span class="absolute inset-0"></span>
|
||||
</f:link.typolink>
|
||||
</div>
|
||||
</div>
|
||||
<div class="p-4 flex-1">
|
||||
{concept.teaser -> f:format.crop(maxCharacters: settings.teaserTextMaxChars) -> f:format.html()}
|
||||
</div>
|
||||
<div class="bg-concept-{concept.code} h-1 w-20"></div>
|
||||
</a>
|
||||
</div>
|
||||
</f:if>
|
||||
</f:section>
|
||||
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
<div class="contact-bar">
|
||||
<a href="{f:uri.typolink(parameter: settings.watchlistPageUid)}"
|
||||
class="contact-bar__item"
|
||||
title="Merkliste"
|
||||
data-controller="watchlist-label"
|
||||
data-action="watchlist-toggle:toggle@window->watchlist-label#update"
|
||||
rel="nofollow">
|
||||
@@ -17,7 +16,6 @@
|
||||
</a>
|
||||
<a href="tel:{settings.phoneNumberLink}"
|
||||
class="contact-bar__item"
|
||||
title="Telefonische Beratung"
|
||||
rel="nofollow">
|
||||
{ep:icon(icon: 'phone', class: 'contact-bar__icon')}
|
||||
<div class="hidden md:block">
|
||||
@@ -25,8 +23,7 @@
|
||||
</div>
|
||||
</a>
|
||||
<f:link.email email="{settings.contactFormToEmail}"
|
||||
class="contact-bar__item"
|
||||
title="E-Mail">
|
||||
class="contact-bar__item">
|
||||
{ep:icon(icon: 'email', class: 'contact-bar__icon')}
|
||||
<div class="contact-bar__label">
|
||||
{settings.contactFormToEmail}
|
||||
@@ -35,7 +32,6 @@
|
||||
<f:if condition="{settings.whatsApp}">
|
||||
<a href="{settings.whatsAppNumberLink}"
|
||||
class="contact-bar__item"
|
||||
title="Whatsapp"
|
||||
target="_blank"
|
||||
rel="nofollow">
|
||||
{ep:icon(icon: 'whatsapp', class: 'contact-bar__icon')}
|
||||
@@ -83,7 +79,7 @@
|
||||
</a>
|
||||
</f:if>
|
||||
<f:if condition="{settings.englishPageUid}">
|
||||
<f:link.typolink parameter="{settings.englishPageUid}" title="English" class="contact-bar__item">
|
||||
<f:link.typolink parameter="{settings.englishPageUid}" class="contact-bar__item">
|
||||
{ep:icon(icon: 'flag-gb', class: 'contact-bar__icon')}
|
||||
<div class="contact-bar__label">
|
||||
English
|
||||
@@ -91,7 +87,7 @@
|
||||
</f:link.typolink>
|
||||
</f:if>
|
||||
<f:if condition="{settings.germanPageUid}">
|
||||
<f:link.typolink parameter="{settings.germanPageUid}" title="English" class="contact-bar__item">
|
||||
<f:link.typolink parameter="{settings.germanPageUid}" class="contact-bar__item">
|
||||
{ep:icon(icon: 'flag-de', class: 'contact-bar__icon')}
|
||||
<div class="contact-bar__label">
|
||||
Deutsch
|
||||
|
||||
@@ -18,8 +18,7 @@
|
||||
class="block w-full h-auto rounded-full"
|
||||
width="400"
|
||||
height="400c"
|
||||
alt="{image.alternative}"
|
||||
title="{image.title}" />
|
||||
alt="{image.alternative}" />
|
||||
</f:if>
|
||||
<a href="tel:{settings.phoneNumber -> v:format.pregReplace(pattern: '/[\-\s]/', replacement: '')}"
|
||||
rel="nofollow"
|
||||
|
||||
@@ -12,7 +12,9 @@
|
||||
<div>{data.text -> f:format.html()}</div>
|
||||
<div>
|
||||
{data.flexForm.buttons -> v:iterator.first() -> v:variable.set(name: 'button')}
|
||||
<a href="{f:uri.typolink(parameter: button.container.link)}" class="btn btn-info" title="{button.container.label -> f:format.raw()}">{button.container.label -> f:format.raw()}</a>
|
||||
<a href="{f:uri.typolink(parameter: button.container.link)}" class="btn btn-info">
|
||||
{button.container.label -> f:format.raw()}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<f:render partial="Disrupter/Outlines"
|
||||
|
||||
@@ -13,16 +13,16 @@
|
||||
loaderimg="EXT:ep_theme/Resources/Public/images/lazy.png"
|
||||
class="block w-full h-auto rounded-full"
|
||||
width="400"
|
||||
alt="{image.alternative}"
|
||||
title="{image.title}" />
|
||||
alt="{image.alternative}" />
|
||||
</f:if>
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-md-6 ">
|
||||
<div>{data.text -> f:format.html()}</div>
|
||||
</div>
|
||||
<a href="{f:uri.typolink(parameter: button.container.link)}" class="btn btn-info"
|
||||
title="{button.container.label -> f:format.raw()}">{button.container.label -> f:format.raw()}</a>
|
||||
<a href="{f:uri.typolink(parameter: button.container.link)}" class="btn btn-info">
|
||||
{button.container.label -> f:format.raw()}
|
||||
</a>
|
||||
</div>
|
||||
</f:alias>
|
||||
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
class="block w-full h-auto rounded-full"
|
||||
width="400"
|
||||
height="400c"
|
||||
alt="{image.alternative}"
|
||||
title="{image.title}" />
|
||||
alt="{image.alternative}" />
|
||||
</f:if>
|
||||
</div>
|
||||
<div class="px-16 md:px-4 md:w-5/6 md:pl-8 text-center text-white md:text-left" data-rte-content>
|
||||
|
||||
@@ -19,8 +19,7 @@
|
||||
class="block w-full h-auto rounded-full"
|
||||
width="400"
|
||||
height="400c"
|
||||
alt="{teaserImage.alternative}"
|
||||
title="{teaserImage.title}" />
|
||||
alt="{teaserImage.alternative}" />
|
||||
</f:if>
|
||||
<a href="tel:{settings.phoneNumber -> v:format.pregReplace(pattern: '/[\-\s]/', replacement: '')}"
|
||||
rel="nofollow"
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<div>{data.bodytext -> f:format.html()}</div>
|
||||
<div>
|
||||
{data.flexForm.buttons -> v:iterator.first() -> v:variable.set(name: 'button')}
|
||||
<a href="{f:uri.typolink(parameter: button.container.link)}" class="btn btn-info" title="{button.container.label -> f:format.raw()}">{button.container.label -> f:format.raw()}</a>
|
||||
<a href="{f:uri.typolink(parameter: button.container.link)}" class="btn btn-info">{button.container.label -> f:format.raw()}</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -13,16 +13,16 @@
|
||||
loaderimg="EXT:ep_theme/Resources/Public/images/lazy.png"
|
||||
class="block w-full h-auto rounded-full"
|
||||
width="400"
|
||||
alt="{teaserImage.alternative}"
|
||||
title="{teaserImage.title}" />
|
||||
alt="{teaserImage.alternative}" />
|
||||
</f:if>
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-md-6 ">
|
||||
<div>{data.bodytext -> f:format.html()}</div>
|
||||
</div>
|
||||
<a href="{f:uri.typolink(parameter: button.container.link)}" class="btn btn-info"
|
||||
title="{button.container.label -> f:format.raw()}">{button.container.label -> f:format.raw()}</a>
|
||||
<a href="{f:uri.typolink(parameter: button.container.link)}" class="btn btn-info">
|
||||
{button.container.label -> f:format.raw()}
|
||||
</a>
|
||||
</div>
|
||||
</f:alias>
|
||||
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
class="block w-full h-auto rounded-full"
|
||||
width="400"
|
||||
height="400c"
|
||||
alt="{teaserImage.alternative}"
|
||||
title="{teaserImage.title}" />
|
||||
alt="{teaserImage.alternative}" />
|
||||
</f:if>
|
||||
</div>
|
||||
<div class="px-16 md:px-4 md:w-5/6 md:pl-8 text-center text-white md:text-left" data-rte-content>
|
||||
|
||||
@@ -22,8 +22,7 @@
|
||||
</div>
|
||||
<div class="w-full lg:w-1/3 lg:px-4">
|
||||
<a class="button bg-button w-full"
|
||||
href="{f:uri.typolink(parameter: buttonLink)}"
|
||||
title="{buttonLabel -> f:format.raw()}">
|
||||
href="{f:uri.typolink(parameter: buttonLink)}">
|
||||
{buttonLabel -> f:format.raw()}
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
<f:if condition="{filter}">
|
||||
<div class="mb-4 pr-2 w-80 border-b border-r border-white flex items-center justify-between">
|
||||
<input type="text"
|
||||
aria-label="Suchbegriff"
|
||||
data-action="faq#filter"
|
||||
class="bg-transparent border-0 uppercase ring-0 focus:ring-0 placeholder-white text-white"
|
||||
placeholder="Suchbegriff">
|
||||
@@ -44,8 +45,8 @@
|
||||
<f:if condition="{settings.infoPageUid}">
|
||||
<div class="flex items-center justify-end space-x-2 text-sm text-white">
|
||||
{ep:icon(icon: 'info-circle', class: 'w-4 h-4')}
|
||||
<a href="{f:uri.typolink(parameter: settings.infoPageUid)}">
|
||||
Weitere Reiseinfos findet ihr <span class="underline">hier</span>
|
||||
<a href="{f:uri.typolink(parameter: settings.infoPageUid)}" class="underline">
|
||||
Weitere Reiseinfos findet ihr hier
|
||||
</a>
|
||||
</div>
|
||||
</f:if>
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
<f:for each="{menuheader.children}" as="submenuitem">
|
||||
<li>
|
||||
<f:link.typolink parameter="{submenuitem.link}"
|
||||
title="{submenuitem.linktext}"
|
||||
class="inline-block py-2 text-lg leading-none text-white">
|
||||
{submenuitem.title}
|
||||
</f:link.typolink>
|
||||
@@ -48,7 +47,6 @@
|
||||
</span>
|
||||
<a class="text-white whitespace-nowrap"
|
||||
href="tel:{settings.phoneNumberLink}"
|
||||
title="Service Telefon anrufen"
|
||||
rel="nofollow">
|
||||
{settings.phoneNumber}
|
||||
</a>
|
||||
@@ -73,7 +71,6 @@
|
||||
</span>
|
||||
<a class="text-white whitespace-nowrap"
|
||||
href="{settings.whatsAppNumberLink}"
|
||||
title="WhatsApp"
|
||||
target="_blank"
|
||||
rel="nofollow">
|
||||
{settings.whatsApp}
|
||||
@@ -100,22 +97,19 @@
|
||||
<ul class="p-0 m-0">
|
||||
<li>
|
||||
<f:link.typolink parameter="{settings.legalNoticePageUid}"
|
||||
class="text-white"
|
||||
title="Impressum">
|
||||
class="text-white">
|
||||
Impressum
|
||||
</f:link.typolink>
|
||||
</li>
|
||||
<li>
|
||||
<f:link.typolink parameter="{settings.termsAndConditionsPageUid}"
|
||||
class="text-white"
|
||||
title="AGB">
|
||||
class="text-white">
|
||||
AGB
|
||||
</f:link.typolink>
|
||||
</li>
|
||||
<li>
|
||||
<f:link.typolink parameter="{settings.dataProtectionPageUid}"
|
||||
class="text-white"
|
||||
title="Datenschutz">
|
||||
class="text-white">
|
||||
Datenschutz
|
||||
</f:link.typolink>
|
||||
</li>
|
||||
@@ -160,8 +154,7 @@
|
||||
<ep:lazyLoadImage src="EXT:ep_theme/Resources/Public/images/pow_de.png"
|
||||
loaderimg="EXT:ep_theme/Resources/Public/images/lazy.png"
|
||||
class="block w-full h-auto"
|
||||
alt="Protect our Winters"
|
||||
title="Protect our Winters" />
|
||||
alt="Protect our Winters" />
|
||||
</a>
|
||||
<a class="block bg-white p-2 w-24 md:w-16 xl:w-24 rounded"
|
||||
href="https://www.unglobalcompact.org/"
|
||||
@@ -172,8 +165,7 @@
|
||||
loaderimg="EXT:ep_theme/Resources/Public/images/lazy.png"
|
||||
class="block w-full h-auto"
|
||||
width="100"
|
||||
alt="Global Compact"
|
||||
title="Global Compact" />
|
||||
alt="Global Compact" />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<picture class="w-full h-full">
|
||||
<source srcset="{f:uri.image(image: image, width: '1370')}" media="(min-width: 768px)">
|
||||
<source srcset="{f:uri.image(image: image, height: '640', cropVariant: 'mobile')}" media="(max-width: 767px)">
|
||||
<f:image image="{image}" cropVariant="mobile" height="640" class="w-full h-auto" alt="{image.alternative}"/>
|
||||
<img src="{f:uri.image(image: image, cropVariant: 'mobile', height: '640')}" class="w-full h-auto" alt="{image.alternative}">
|
||||
</picture>
|
||||
</div>
|
||||
</f:if>
|
||||
@@ -34,6 +34,7 @@
|
||||
</f:if>
|
||||
<f:if condition="{slide.button}">
|
||||
<f:link.typolink parameter="{slide.page_uid}"
|
||||
additionalAttributes="{'tabindex': '-1'}"
|
||||
class="button bg-button inline-block">
|
||||
{slide.button}
|
||||
</f:link.typolink>
|
||||
@@ -44,17 +45,18 @@
|
||||
<f:if condition="{slide.skipass} || {badge}">
|
||||
<div class="herounit__badge-wrapper">
|
||||
<f:if condition="{slide.skipass}">
|
||||
<f:link.typolink parameter="{settings.skipassPageUid}" title="Skipass inklusive">
|
||||
<f:link.typolink parameter="{settings.skipassPageUid}"
|
||||
additionalAttributes="{'tabindex': '-1'}">
|
||||
<div class="herounit__badge herounit__badge--skipass">
|
||||
<p class="uppercase text-4xl font-bold leading-7 mb-2">Ski-<br>Pass</p>
|
||||
<p class="uppercase">inklusive</p>
|
||||
<div class="uppercase text-4xl font-bold leading-7 mb-2">Ski-<br>Pass</div>
|
||||
<div class="uppercase">inklusive</div>
|
||||
</div>
|
||||
</f:link.typolink>
|
||||
</f:if>
|
||||
<f:if condition="{badge}">
|
||||
<f:alias map="{badgeData: badge.0.data}">
|
||||
<f:link.typolink parameter="{badgeData.link}"
|
||||
title="{badgeData.title}">
|
||||
additionalAttributes="{'tabindex': '-1'}">
|
||||
<div class="herounit__badge herounit__badge--custom">
|
||||
<svg viewBox="0 0 200 200"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<f:alias map="{image: slide.image.0}">
|
||||
<f:if condition="{image}">
|
||||
<picture>
|
||||
<source srcset="{f:uri.image(image: image, width: '1370')}" media="(min-width: 768px)">
|
||||
<source srcset="{f:uri.image(image: image, width: '1440')}" media="(min-width: 768px)">
|
||||
<source srcset="{f:uri.image(image: image, height: '320', cropVariant: 'mobile')}" media="(max-width: 767px)">
|
||||
<f:image class="block w-full h-full object-cover"
|
||||
image="{image}"
|
||||
@@ -38,7 +38,7 @@
|
||||
<f:if condition="{slide.skipass} || {badge}">
|
||||
<div class="herounit__badge-wrapper">
|
||||
<f:if condition="{settings.showSkipassBadge}">
|
||||
<f:link.typolink parameter="{settings.skipassPageUid}" title="Skipass inklusive">
|
||||
<f:link.typolink parameter="{settings.skipassPageUid}">
|
||||
<div class="herounit__badge herounit__badge--skipass">
|
||||
<p class="uppercase text-4xl font-bold leading-7 mb-2">Ski-<br>Pass</p>
|
||||
<p class="uppercase">inklusive</p>
|
||||
@@ -47,8 +47,7 @@
|
||||
</f:if>
|
||||
<f:if condition="{badge}">
|
||||
<f:alias map="{badgeData: badge.0.data}">
|
||||
<f:link.typolink parameter="{badgeData.link}"
|
||||
title="{badgeData.title}">
|
||||
<f:link.typolink parameter="{badgeData.link}">
|
||||
<div class="hidden md:block absolute top-0 right-0 mt-12 mr-8 w-40 rotate-6">
|
||||
<svg viewBox="0 0 200 200"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
|
||||
|
||||
<f:section name="Teaser">
|
||||
<a href="{f:uri.typolink(parameter: hotel.detailPage)}" title="{hotel.name}" class="flex flex-col">
|
||||
<a href="{f:uri.typolink(parameter: hotel.detailPage)}" class="flex flex-col">
|
||||
<div class="relative">
|
||||
{ep:icon(icon: 'flag-{hotel.country.code -> f:format.case(mode: \'lower\')}', class: 'w-8 h-6 absolute top-0 left-0')}
|
||||
<f:if condition="{hotel.images.original.0}">
|
||||
|
||||
@@ -13,14 +13,14 @@
|
||||
</div>
|
||||
<f:alias map="{image: images.0}">
|
||||
<a href="{f:uri.image(image: image, cropVariant: 'zoom', maxWidth: '2560')}"
|
||||
title="{image.title}"
|
||||
data-action="lightbox#open">
|
||||
<ep:lazyLoadImage image="{image}"
|
||||
loaderimg="EXT:ep_theme/Resources/Public/images/lazy.png"
|
||||
class="block w-full h-auto"
|
||||
width="770"
|
||||
height="430c+100"
|
||||
alt="{image.alternative}"
|
||||
title="{image.title}" />
|
||||
alt="{image.alternative}"/>
|
||||
</a>
|
||||
</f:alias>
|
||||
<f:if condition="{thumbnails}">
|
||||
@@ -33,14 +33,14 @@
|
||||
data-lightbox-target="thumb"
|
||||
data-lightbox-index="{iteration.cycle}"
|
||||
data-lightbox-caption="{image.originalResource.description}"
|
||||
title="{image.title}"
|
||||
class="block">
|
||||
<ep:lazyLoadImage image="{image}"
|
||||
loaderimg="EXT:ep_theme/Resources/Public/images/lazy.png"
|
||||
class="block w-full h-auto"
|
||||
width="150"
|
||||
height="85c+100"
|
||||
alt="{image.alternative}"
|
||||
title="{image.title}" />
|
||||
alt="{image.alternative}"/>
|
||||
</a>
|
||||
</f:if>
|
||||
</f:for>
|
||||
@@ -53,8 +53,9 @@
|
||||
<a href="{f:uri.image(image: image, cropVariant: 'zoom', maxWidth: '2560')}"
|
||||
data-lightbox-target="thumb"
|
||||
data-lightbox-index="{iteration.cycle}"
|
||||
data-lightbox-caption="{image.originalResource.description}"
|
||||
title="{image.originalResource.title}">{iteration.index}</a>
|
||||
data-lightbox-caption="{image.originalResource.description}">
|
||||
{iteration.index}
|
||||
</a>
|
||||
</f:if>
|
||||
</f:for>
|
||||
</div>
|
||||
|
||||
@@ -14,8 +14,7 @@
|
||||
class="block w-full h-auto"
|
||||
width="770"
|
||||
height="430c+100"
|
||||
alt="{journey.image.alternative}"
|
||||
title="{journey.image.title}" />
|
||||
alt="{journey.image.alternative}" />
|
||||
</f:if>
|
||||
<f:if condition="{journey.byBus}">
|
||||
<h3>
|
||||
|
||||
@@ -8,10 +8,10 @@
|
||||
<div class="flex items-center hover-hover:lg:items-end justify-between px-4 py-2 lg:px-0 lg:pt-4 lg:pb-0">
|
||||
<f:link.typolink parameter="{f:if(condition: settings.logoLink, then: settings.logoLink, else: settings.defaultHomeUid)}"
|
||||
class="block lg:pb-4"
|
||||
title="{settings.defaultTitle}">
|
||||
title="zur Startseite">
|
||||
<f:image src="{settings.logoImage}"
|
||||
class="block w-auto {ep:themeClasses(classes: '{ep: \'h-10 lg:h-12\', sbw: \'h-14 lg:h-24\', snz: \'h-14 lg:h-24\', suz: \'h-14 lg:h-24\', uch: \'h-12 lg:h-20\', ser: \'h-10 lg:h-12\'}', key: settings.themekey)}"
|
||||
alt="{settings.defaultTitle}"/>
|
||||
alt="Bildmarke"/>
|
||||
</f:link.typolink>
|
||||
<div class="hidden hover-hover:lg:block">
|
||||
<f:render section="FirstLevel" arguments="{_all}"/>
|
||||
@@ -43,15 +43,15 @@
|
||||
</f:section>
|
||||
|
||||
<f:section name="FirstLevel">
|
||||
<nav role="menu">
|
||||
<ul class="m-0 p-0 list-none flex items-center justify-end space-x-4">
|
||||
<nav role="navigation" aria-label="Hauptnavigation">
|
||||
<ul class="m-0 p-0 list-none flex items-center justify-end space-x-4" role="menubar">
|
||||
<f:for each="{mainnav}" as="topitem">
|
||||
<li class="group pb-4">
|
||||
<li class="group pb-4" role="none">
|
||||
<f:if condition="{topitem.children}">
|
||||
<f:then>
|
||||
<a href="{f:uri.typolink(parameter: topitem.data.uid)}"
|
||||
class="text-zinc-800 uppercase lg:text-lg font-bold flex items-center"
|
||||
title="{topitem.title}">
|
||||
role="menuitem"
|
||||
class="text-zinc-800 uppercase lg:text-lg font-bold flex items-center">
|
||||
<span>{topitem.title}</span>
|
||||
{ep:icon(icon: 'chevron-down', class: 'ml-1 w-4 h-4 group-hover:rotate-180')}
|
||||
</a>
|
||||
@@ -59,8 +59,8 @@
|
||||
</f:then>
|
||||
<f:else>
|
||||
<a href="{topitem.link}"{f:if(condition: '{topitem.doktype} == 3', then: ' target="_blank"')}
|
||||
class="block text-zinc-800 uppercase lg:text-lg font-bold"
|
||||
title="{topitem.title}">
|
||||
role="menuitem"
|
||||
class="block text-zinc-800 uppercase lg:text-lg font-bold">
|
||||
{topitem.title}
|
||||
</a>
|
||||
</f:else>
|
||||
@@ -69,7 +69,7 @@
|
||||
</f:for>
|
||||
<f:if condition="{data.tx_eptheme_hide_searchbar} || {settings.hideSearchbar}">
|
||||
<f:else>
|
||||
<li class="pb-4">
|
||||
<li class="pb-4" role="none">
|
||||
<f:if condition="{searchbarCollapsed}">
|
||||
<f:then>
|
||||
<button type="button"
|
||||
@@ -80,7 +80,7 @@
|
||||
</button>
|
||||
</f:then>
|
||||
<f:else>
|
||||
<f:link.typolink parameter="{settings.defaultSearchPageUid}">
|
||||
<f:link.typolink parameter="{settings.defaultSearchPageUid}" title="zur Suche" additionalAttributes="{'role': 'menuitem'}">
|
||||
{ep:icon(icon: 'search', class: 'w-6 h-6')}
|
||||
</f:link.typolink>
|
||||
</f:else>
|
||||
@@ -96,11 +96,11 @@
|
||||
<div class="absolute top-100 left-0 inset-x-0 pt-4 invisible opacity-0 group-hover:visible group-hover:opacity-100 transition-opacity duration-300 ease-in-out">
|
||||
<div class="bg-white grid grid-cols-3 lg:grid-cols-4 gap-8 p-4 shadow-lg rounded">
|
||||
<f:for each="{topitem.children}" as="subitem">
|
||||
<ul class="m-0 p-0 list-none">
|
||||
<li>
|
||||
<ul class="m-0 p-0 list-none" role="menu">
|
||||
<li role="none">
|
||||
<f:if condition="{subitem.doktype} == 3">
|
||||
<f:then>
|
||||
<a href="{subitem.link}" target="_blank" title="{subitem.title}">
|
||||
<a href="{subitem.link}" target="_blank" role="menuitem">
|
||||
<f:if condition="{subitem.data.tx_eptheme_context_country_code}">
|
||||
{ep:icon(icon: 'flag-{subitem.data.tx_eptheme_context_country_code -> f:format.case(mode: \'lower\')}', class: 'w-8 h-6')}
|
||||
</f:if>
|
||||
@@ -111,8 +111,8 @@
|
||||
</f:then>
|
||||
<f:else>
|
||||
<a href="{f:uri.typolink(parameter: subitem.data.uid)}"
|
||||
class="flex items-center space-x-2 underlined"
|
||||
title="{subitem.title}">
|
||||
role="menuitem"
|
||||
class="flex items-center space-x-2 underlined">
|
||||
<f:if condition="{subitem.data.tx_eptheme_context_country_code}">
|
||||
{ep:icon(icon: 'flag-{subitem.data.tx_eptheme_context_country_code -> f:format.case(mode: \'lower\')}', class: 'w-8 h-6')}
|
||||
</f:if>
|
||||
@@ -134,20 +134,20 @@
|
||||
<f:for each="{subitem.children}" as="subsubitem">
|
||||
<f:if condition="{subsubitem.doktype} == 3">
|
||||
<f:then>
|
||||
<li>
|
||||
<li role="none">
|
||||
<a href="{subsubitem.link}"
|
||||
class="text-zinc-800 text-lg"
|
||||
target="_blank"
|
||||
title="{subsubitem.title}">
|
||||
role="menuitem">
|
||||
{subsubitem.title}
|
||||
</a>
|
||||
</li>
|
||||
</f:then>
|
||||
<f:else>
|
||||
<li>
|
||||
<li role="none">
|
||||
<a href="{f:uri.typolink(parameter: subsubitem.data.uid)}"
|
||||
class="text-zinc-800 text-lg"
|
||||
title="{subsubitem.title}">
|
||||
role="menuitem">
|
||||
{subsubitem.title}
|
||||
</a>
|
||||
</li>
|
||||
|
||||
@@ -13,8 +13,8 @@
|
||||
<div class="fixed top-0 left-0 z-100 inset-x-0 px-4 py-2 hover-none:lg:py-4 flex justify-between bg-white shadow-md">
|
||||
<f:link.typolink parameter="{f:if(condition: settings.logoLink, then: settings.logoLink, else: settings.defaultHomeUid)}"
|
||||
class="block hover-hover:lg:pb-4"
|
||||
title="{settings.defaultTitle}">
|
||||
<f:image class="block h-10 lg:h-12 w-auto" src="{settings.logoImage}" alt="{settings.defaultTitle}"/>
|
||||
title="zur Startseite">
|
||||
<f:image class="block h-10 lg:h-12 w-auto" src="{settings.logoImage}" alt="Bildmarke"/>
|
||||
</f:link.typolink>
|
||||
<div class="flex hover-hover:lg:hidden items-center space-x-4">
|
||||
<f:if condition="{data.tx_eptheme_hide_searchbar}">
|
||||
@@ -53,7 +53,6 @@
|
||||
<div class="grid grid-cols-4 gap-x-2">
|
||||
<a href="tel:{settings.phoneNumber -> v:format.pregReplace(pattern: '/[\-\s]/', replacement: '')}"
|
||||
class="button bg-button flex items-center space-x-2"
|
||||
title="Anrufen"
|
||||
rel="nofollow">
|
||||
{ep:icon(icon: 'phone', class: 'w-6 h-6 text-white')}
|
||||
<span class="hidden sm:block">
|
||||
@@ -62,7 +61,6 @@
|
||||
</a>
|
||||
<a href="https://api.whatsapp.com/send?phone={settings.whatsAppNumberLink}"
|
||||
class="button bg-button flex items-center space-x-2"
|
||||
title="WhatsApp"
|
||||
rel="nofollow"
|
||||
target="_blank">
|
||||
{ep:icon(icon: 'whatsapp', class: 'w-6 h-6 text-white')}
|
||||
@@ -72,8 +70,7 @@
|
||||
</a>
|
||||
<f:if condition="{settings.faqPageUid}">
|
||||
<a href="{f:uri.typolink(parameter: settings.faqPageUid)}"
|
||||
class="button bg-button flex items-center space-x-2"
|
||||
title="FAQ">
|
||||
class="button bg-button flex items-center space-x-2">
|
||||
{ep:icon(icon: 'faq', class: 'w-6 h-6 text-white')}
|
||||
<span class="hidden sm:block">
|
||||
FAQ
|
||||
@@ -82,8 +79,7 @@
|
||||
</f:if>
|
||||
<f:if condition="{settings.myEpPageUid}">
|
||||
<f:link.typolink parameter="{settings.myEpPageUid}"
|
||||
class="button bg-button flex items-center space-x-2"
|
||||
title="My E&P">
|
||||
class="button bg-button flex items-center space-x-2">
|
||||
{ep:icon(icon: 'user', class: 'w-6 h-6 text-white')}
|
||||
<span class="hidden sm:block">
|
||||
My E&P
|
||||
@@ -105,8 +101,7 @@
|
||||
data-collapse-collapsed-value="{f:if(condition: navitem.active, then: 'false', else: 'true')}">
|
||||
<div class="flex items-center justify-between px-4 py-2 text-white {f:if(condition: navitem.data.tx_eptheme_navitemclass, then: navitem.data.tx_eptheme_navitemclass, else: 'bg-ep-primary')}">
|
||||
<a href="{navitem.link}"
|
||||
class="uppercase text-xl flex-1"
|
||||
title="{navitem.title}">
|
||||
class="uppercase text-xl flex-1">
|
||||
{navitem.title}
|
||||
</a>
|
||||
<button type="button"
|
||||
@@ -124,8 +119,7 @@
|
||||
<f:else>
|
||||
<li>
|
||||
<a href="{navitem.link}"
|
||||
class="block px-4 py-2 text-white uppercase text-xl {f:if(condition: navitem.data.tx_eptheme_navitemclass, then: navitem.data.tx_eptheme_navitemclass, else: 'bg-ep-primary')}"
|
||||
title="{navitem.title}">
|
||||
class="block px-4 py-2 text-white uppercase text-xl {f:if(condition: navitem.data.tx_eptheme_navitemclass, then: navitem.data.tx_eptheme_navitemclass, else: 'bg-ep-primary')}">
|
||||
{navitem.title}
|
||||
</a>
|
||||
</li>
|
||||
@@ -145,8 +139,7 @@
|
||||
data-collapse-collapsed-value="{f:if(condition: subitem.active, then: 'false', else: 'true')}">
|
||||
<div class="flex items-center justify-between">
|
||||
<a href="{subitem.link}"
|
||||
class="flex-1"
|
||||
title="{subitem.title}">
|
||||
class="flex-1">
|
||||
{subitem.title}
|
||||
</a>
|
||||
<button type="button"
|
||||
@@ -163,9 +156,7 @@
|
||||
</f:then>
|
||||
<f:else>
|
||||
<li class="py-2">
|
||||
<a href="{subitem.link}"
|
||||
class=""
|
||||
title="{subitem.title}">
|
||||
<a href="{subitem.link}">
|
||||
{subitem.title}
|
||||
</a>
|
||||
</li>
|
||||
|
||||
+5
-5
@@ -9,7 +9,7 @@
|
||||
<f:link.typolink parameter="{images.0.originalResource.link}">
|
||||
<img src="{f:uri.image(image: images.0, width: '770', height: '430c+100')}"
|
||||
class="block w-full h-auto mb-4"
|
||||
alt="{images.0.alternative}" title="{images.0.title}">
|
||||
alt="{images.0.alternative}">
|
||||
</f:link.typolink>
|
||||
</f:then>
|
||||
<f:else>
|
||||
@@ -21,10 +21,10 @@
|
||||
<f:for each="{images}" as="image" iteration="iteration">
|
||||
<li class="splide__slide">
|
||||
<f:link.typolink parameter="{image.originalResource.link}"
|
||||
class="relative bg-cover bg-center">
|
||||
class="relative bg-cover bg-center" title="{image.title}">
|
||||
<img src="{f:uri.image(image: image, width: '770', height: '430c+100')}"
|
||||
class="block w-full h-auto"
|
||||
alt="{image.alternative}" title="{image.title}">
|
||||
alt="{image.alternative}">
|
||||
</f:link.typolink>
|
||||
</li>
|
||||
</f:for>
|
||||
@@ -34,9 +34,9 @@
|
||||
<div class="hidden md:grid md:grid-cols-5 md:gap-2 md:pt-4 md:pb-8">
|
||||
<f:for each="{images}" as="image" iteration="iteration">
|
||||
<f:if condition="{iteration.cycle} <= 5">
|
||||
<a href="#" class="block" data-slide="{iteration.index}">
|
||||
<a href="#" class="block" data-slide="{iteration.index}" title="{image.title}">
|
||||
<img src="{f:uri.image(image: image, width: '150', height: '85c+100')}"
|
||||
class="block w-full h-auto" alt="{image.alternative}" title="{image.title}">
|
||||
class="block w-full h-auto" alt="{image.alternative}">
|
||||
</a>
|
||||
</f:if>
|
||||
</f:for>
|
||||
|
||||
@@ -12,8 +12,7 @@
|
||||
<f:alias map="{mediaElement: '{newsItem.mediaPreviews.0}'}">
|
||||
<img class="block w-full h-auto lazyload"
|
||||
data-src="{f:uri.image(image: mediaElement, width: '640', height: '360c+50')}"
|
||||
alt="{mediaElement.originalResource.alternative}"
|
||||
title="{mediaElement.originalResource.title}">
|
||||
alt="{mediaElement.originalResource.alternative}">
|
||||
</f:alias>
|
||||
</f:if>
|
||||
</f:then>
|
||||
@@ -22,8 +21,7 @@
|
||||
<f:alias map="{mediaElement: '{newsItem.media.0}'}">
|
||||
<img class="block w-full h-auto lazyload"
|
||||
data-src="{f:uri.image(image: mediaElement, width: '640', height: '360c+50')}"
|
||||
alt="{mediaElement.originalResource.alternative}"
|
||||
title="{mediaElement.originalResource.title}">
|
||||
alt="{mediaElement.originalResource.alternative}">
|
||||
</f:alias>
|
||||
</f:if>
|
||||
</f:else>
|
||||
@@ -31,7 +29,7 @@
|
||||
</n:link>
|
||||
<div class="md:flex-1">
|
||||
<h3 class="blog-entry__headline">
|
||||
<n:link newsItem="{newsItem}" settings="{settings}" title="{newsItem.title}">
|
||||
<n:link newsItem="{newsItem}" settings="{settings}">
|
||||
{newsItem.title}
|
||||
</n:link>
|
||||
</h3>
|
||||
@@ -40,7 +38,7 @@
|
||||
<time datetime="{f:format.date(date:newsItem.datetime, format:'Y-m-d')}"><f:format.date format="{f:translate(key:'dateFormat')}">{newsItem.datetime}</f:format.date></time>
|
||||
<f:if condition="{newsItem.tags}"> in
|
||||
<f:for each="{newsItem.tags}" as="tag" iteration="iteration">
|
||||
<f:link.page title="{tag.title}" pageUid="{settings.tagListPageUid}" additionalParams="{tx_news_pi1:{overwriteDemand:{tags: tag}}}">
|
||||
<f:link.page pageUid="{settings.tagListPageUid}" additionalParams="{tx_news_pi1:{overwriteDemand:{tags: tag}}}">
|
||||
{tag.title}
|
||||
</f:link.page>
|
||||
{f:if(condition: iteration.isLast, else: ', ')}
|
||||
@@ -59,7 +57,7 @@
|
||||
</f:if>
|
||||
</div>
|
||||
</n:removeMediaTags>
|
||||
<n:link newsItem="{newsItem}" settings="{settings}" class="button bg-button button--small" title="{newsItem.title}">
|
||||
<n:link newsItem="{newsItem}" settings="{settings}" class="button bg-button button--small">
|
||||
<f:translate key="more-link"/>
|
||||
</n:link>
|
||||
</div>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<li><strong>Wir informieren dich,</strong> wenn deine Reise buchbar ist - Trage dich in unsere
|
||||
<f:link.typolink parameter="{settings.travelAlertPageUid}">Reisealert-Liste</f:link.typolink> ein!</li>
|
||||
<li>Du kannst diese aber ggf. auch <strong>vorreservieren</strong>, oder wir helfen dir, eine andere Unterkunft
|
||||
zu finden. Ruf uns an unter <a href="tel:{settings.phoneNumber -> v:format.pregReplace(pattern: '/[\-\s]/', replacement: '')}" title="Service Telefon anrufen" rel="nofollow">{settings.phoneNumber}</a>
|
||||
zu finden. Ruf uns an unter <a href="tel:{settings.phoneNumber -> v:format.pregReplace(pattern: '/[\-\s]/', replacement: '')}" rel="nofollow">{settings.phoneNumber}</a>
|
||||
oder schreibe an <f:link.email email="[email protected]"/>.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers"
|
||||
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers">
|
||||
|
||||
<f:if condition="{pricetable -> f:count()} == 0">
|
||||
<f:if condition="{pricetable.available -> f:count()} == 0">
|
||||
<f:then>
|
||||
<div class="alert alert-info" data-rte-content>
|
||||
{nonBookableInfo.text -> f:format.html()}
|
||||
@@ -32,7 +32,7 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<f:for each="{pricetable}" as="row" iteration="iteration">
|
||||
<f:for each="{pricetable.available}" as="row" iteration="iteration">
|
||||
<tr class="even:bg-zinc-50">
|
||||
<td class="px-2 py-1 border border-zinc-200 whitespace-nowrap">
|
||||
{row.roomName}
|
||||
@@ -88,8 +88,7 @@
|
||||
data-pricetable-type-param="options"
|
||||
data-pricetable-uid-param="{row.roomUid}"
|
||||
data-cooltipz-dir="top"
|
||||
aria-label="Alle Zusatzleistungen anzeigen"
|
||||
role="tooltip">
|
||||
aria-label="Alle Zusatzleistungen anzeigen">
|
||||
{ep:icon(icon: 'plus-circle', class: 'w-4 h-4 md:w-5 md:h-5')}
|
||||
</button>
|
||||
</f:if>
|
||||
@@ -137,7 +136,7 @@
|
||||
</button>
|
||||
</div>
|
||||
<div class="h-128 p-4 overflow-y-scroll bg-white rounded-b">
|
||||
<f:for each="{pricetable}" as="row">
|
||||
<f:for each="{pricetable.available}" as="row">
|
||||
<div class="hidden"
|
||||
data-modal-target="content"
|
||||
data-uid="{row.roomUid}">
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
</f:if>
|
||||
<div class="herounit h-80 lg:h-96 mb-8">
|
||||
<picture>
|
||||
<source srcset="{f:uri.image(image: image, width: '1370c', height: '380c')}" media="(min-width: 768px)">
|
||||
<source srcset="{f:uri.image(image: image, width: '1440c', height: '380c')}" media="(min-width: 768px)">
|
||||
<source srcset="{f:uri.image(image: image, height: '320c')}" media="(max-width: 767px)">
|
||||
<f:image class="block w-full h-full object-cover"
|
||||
image="{image}"
|
||||
@@ -68,7 +68,6 @@
|
||||
<f:if condition="{settings.showSkipassBadge} && {product.skipassIncluded}">
|
||||
<div class="herounit__badge-wrapper">
|
||||
<f:link.typolink parameter="{settings.skipassPageUid}"
|
||||
title="Skipass inklusive"
|
||||
class="herounit__badge herounit__badge--skipass">
|
||||
<p class="uppercase text-4xl font-bold leading-7 mb-2">
|
||||
Ski-<br>Pass
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
hx-target="body"
|
||||
hx-swap="beforeend"
|
||||
</f:if>
|
||||
title="{region.name} {product.name} Details und Buchen">
|
||||
>
|
||||
<f:if condition="{productImage}">
|
||||
<f:then>
|
||||
<ep:lazyLoadImage image="{productImage}"
|
||||
@@ -57,8 +57,7 @@
|
||||
data-watchlist-toggle-target="ariaLabel"
|
||||
data-action="watchlist-toggle#toggle"
|
||||
data-cooltipz-dir="top-right"
|
||||
aria-label="auf die Merkliste setzen"
|
||||
role="tooltip">
|
||||
aria-label="auf die Merkliste setzen">
|
||||
<svg class="product-teaser__watchlist-icon" data-watchlist-toggle-target="icon" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z"></path></svg>
|
||||
</button>
|
||||
</div>
|
||||
@@ -84,7 +83,6 @@
|
||||
hx-target="body"
|
||||
hx-swap="beforeend"
|
||||
</f:if>
|
||||
title="{region.name} {product.name} Details und Buchen"
|
||||
class="flex-1 flex flex-col space-y-1 px-2 py-4 md:p-4">
|
||||
<div class="product-teaser__label-name">
|
||||
{product.name}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
<f:if condition="{product.ratingVotesCount} > 0">
|
||||
<a href="{f:uri.typolink(parameter: targetPageUid)}"
|
||||
class="block bg-zinc-50 p-4 mb-4"
|
||||
title="Reisebewertungen">
|
||||
class="block bg-zinc-50 p-4 mb-4">
|
||||
<p class="font-bold mb-1">
|
||||
{label}
|
||||
</p>
|
||||
|
||||
@@ -17,8 +17,7 @@
|
||||
loaderimg="EXT:ep_theme/Resources/Public/images/lazy.png"
|
||||
class="block w-full h-auto"
|
||||
width="330"
|
||||
alt="Webcam {region.name}"
|
||||
title="Webcam {region.name}" />
|
||||
alt="Webcam {region.name}" />
|
||||
</a>
|
||||
</div>
|
||||
</f:if>
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
<f:link.typolink parameter="{region.awardLink}" title="{region.name}">
|
||||
<f:image image="{region.awardImage}"
|
||||
alt="{region.awardImage.alternative}"
|
||||
title="{region.awardImage.title}"
|
||||
maxWidth="165"
|
||||
class="block max-w-full mx-auto"
|
||||
/>
|
||||
|
||||
@@ -21,8 +21,7 @@
|
||||
loaderimg="EXT:ep_theme/Resources/Public/images/lazy.png"
|
||||
class="block w-full h-auto"
|
||||
width="330"
|
||||
alt="{regionMap.alternative}"
|
||||
title="{regionMap.title}"/>
|
||||
alt="{regionMap.alternative}"/>
|
||||
</a>
|
||||
</f:for>
|
||||
</div>
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
<div class="fixed top-0 left-0 z-100 inset-x-0 px-4 py-2 hover-none:lg:py-4 flex justify-between bg-white shadow-md">
|
||||
<a href="{f:uri.typolink(parameter: settings.defaultHomeUid)}"
|
||||
class="block hover-hover:lg:pb-4"
|
||||
title="{settings.defaultTitle}">
|
||||
<f:image class="block h-10 lg:h-12 w-auto" src="{settings.logoImage}" alt="{settings.defaultTitle}"/>
|
||||
title="zur Startseite">
|
||||
<f:image class="block h-10 lg:h-12 w-auto" src="{settings.logoImage}" alt="Bildmarke"/>
|
||||
</a>
|
||||
<button type="button"
|
||||
aria-label="Suche schließen"
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
<f:if condition="{settings.showSkipassBadge} || {badge}">
|
||||
<div class="herounit__badge-wrapper">
|
||||
<f:if condition="{settings.showSkipassBadge}">
|
||||
<f:link.typolink parameter="{settings.skipassPageUid}" title="Skipass inklusive">
|
||||
<f:link.typolink parameter="{settings.skipassPageUid}">
|
||||
<div class="herounit__badge herounit__badge--skipass">
|
||||
<p class="uppercase text-4xl font-bold leading-7 mb-2">Ski-<br>Pass</p>
|
||||
<p class="uppercase">inklusive</p>
|
||||
@@ -42,8 +42,7 @@
|
||||
</f:if>
|
||||
<f:if condition="{badge}">
|
||||
<f:alias map="{badgeData: badge.0.data}">
|
||||
<f:link.typolink parameter="{badgeData.link}"
|
||||
title="{badgeData.title}">
|
||||
<f:link.typolink parameter="{badgeData.link}">
|
||||
<div class="herounit__badge herounit__badge--custom">
|
||||
<svg viewBox="0 0 200 200"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
|
||||
@@ -26,8 +26,7 @@
|
||||
class="block w-full h-auto"
|
||||
width="500"
|
||||
height="250c-100"
|
||||
alt="{image.alternative}"
|
||||
title="{image.title}" />
|
||||
alt="{image.alternative}" />
|
||||
</picture>
|
||||
</f:then>
|
||||
<f:else>
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<source media="(max-width: 768px)" data-srcset="{f:uri.image(
|
||||
image: image, width: '320', height: '140c-100'
|
||||
)} 320w"/>
|
||||
<img class="scale lazyload" title="{image.title}" alt="{image.alternative}"
|
||||
<img class="scale lazyload" alt="{image.alternative}"
|
||||
src="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/lazy.png', width: '260', height: '160')}"
|
||||
data-src="{f:uri.image(image: image, width: '260', height: '160c-100')}"
|
||||
>
|
||||
|
||||
@@ -6,12 +6,10 @@
|
||||
<f:render partial="Header/Header" arguments="{header: data.header, subheader: data.subheader, layout: data.header_layout, link: data.header_link, default: settings.defaultHeaderType}" />
|
||||
{data.bodytext -> f:format.html()}
|
||||
<f:if condition="{files}">
|
||||
<f:link.typolink parameter="{files.0.link}">
|
||||
<f:link.typolink parameter="{files.0.link}" title="{files.0.originalResource.title}">
|
||||
<img class="img-responsive lazyload"
|
||||
data-src="{f:uri.image(image: files.0, maxWidth: '770')}"
|
||||
alt="{files.0.originalResource.alternative}"
|
||||
title="{files.0.originalResource.title}"
|
||||
>
|
||||
alt="{files.0.originalResource.alternative}">
|
||||
</f:link.typolink>
|
||||
</f:if>
|
||||
</f:section>
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
<div class="tiles__tile lg:col-span-2 lg:row-span-1"
|
||||
style="background-image:url('{f:uri.image(image: images.0)}');">
|
||||
<f:link.typolink parameter="{images.0.link}"
|
||||
title="{images.0.title -> f:format.raw()}"
|
||||
class="tiles__link">
|
||||
<span class="tiles__label">
|
||||
{images.0.title -> f:format.raw()}
|
||||
@@ -23,7 +22,6 @@
|
||||
<div class="tiles__tile lg:col-span-2 lg:row-span-1"
|
||||
style="background-image:url('{f:uri.image(image: images.1)}');">
|
||||
<f:link.typolink parameter="{images.1.link}"
|
||||
title="{images.1.title -> f:format.raw()}"
|
||||
class="tiles__link">
|
||||
<span class="tiles__label">
|
||||
{images.1.title -> f:format.raw()}
|
||||
@@ -35,7 +33,6 @@
|
||||
<div class="tiles__tile lg:col-span-12 lg:row-span-1"
|
||||
style="background-image:url('{f:uri.image(image: images.4)}');">
|
||||
<f:link.typolink parameter="{images.4.link}"
|
||||
title="{images.4.title -> f:format.raw()}"
|
||||
class="tiles__link">
|
||||
<span class="tiles__label">
|
||||
{images.4.title -> f:format.raw()}
|
||||
@@ -47,7 +44,6 @@
|
||||
<div class="tiles__tile lg:col-span-4 lg:row-span-2"
|
||||
style="background-image:url('{f:uri.image(image: images.2)}');">
|
||||
<f:link.typolink parameter="{images.2.link}"
|
||||
title="{images.2.title -> f:format.raw()}"
|
||||
class="tiles__link">
|
||||
<span class="tiles__label">
|
||||
{images.2.title -> f:format.raw()}
|
||||
@@ -59,7 +55,6 @@
|
||||
<div class="tiles__tile lg:col-span-6 lg:row-span-2"
|
||||
style="background-image:url('{f:uri.image(image: images.3)}');">
|
||||
<f:link.typolink parameter="{images.3.link}"
|
||||
title="{images.3.title -> f:format.raw()}"
|
||||
class="tiles__link">
|
||||
<span class="tiles__label">
|
||||
{images.3.title -> f:format.raw()}
|
||||
|
||||
+1
-2
@@ -30,8 +30,7 @@
|
||||
class="block w-full h-auto"
|
||||
width="400c"
|
||||
height="400"
|
||||
alt="{image.alternative}"
|
||||
title="{image.title}" />
|
||||
alt="{image.alternative}" />
|
||||
</f:link.typolink>
|
||||
</div>
|
||||
</f:section>
|
||||
|
||||
@@ -7,15 +7,15 @@
|
||||
<f:else>
|
||||
<div class="topnav">
|
||||
<div class="container">
|
||||
<nav role="navigation" class="topnav__nav">
|
||||
<nav role="navigation" aria-label="Bereichs-Navigation" class="topnav__nav">
|
||||
<div class="flex items-center border-l border-white/50">
|
||||
<f:if condition="{settings.mainSitePid}">
|
||||
<f:link.typolink parameter="{settings.mainSitePid}"
|
||||
class="topnav__item"
|
||||
title="{settings.defaultTitle}">
|
||||
title="zur Startseite">
|
||||
<f:image src="EXT:ep_theme/Resources/Public/images/logo.svg"
|
||||
class="h-5 w-auto"
|
||||
alt="{settings.defaultTitle}"/>
|
||||
alt=""/>
|
||||
</f:link.typolink>
|
||||
</f:if>
|
||||
<f:link.typolink parameter="{settings.defaultHomeUid}" class="topnav__item" title="E&P">
|
||||
@@ -26,8 +26,7 @@
|
||||
<div class="flex-1 flex items-center">
|
||||
<f:for each="{topnav}" as="menuitem">
|
||||
<a class="topnav__item flex-grow{f:if(condition: menuitem.data.tx_eptheme_navitemclass, then: ' {menuitem.data.tx_eptheme_navitemclass}')}{f:if(condition: '{menuitem.active} || {menuitem.data.uid} == {settings.forceActiveTopnavUid}', then: ' bg-ep-secondary')}"
|
||||
href="{menuitem.link}"{f:if(condition: '{menuitem.data.doktype} == 3', then: ' target="_blank"')}
|
||||
title="{menuitem.title}">
|
||||
href="{menuitem.link}"{f:if(condition: '{menuitem.data.doktype} == 3', then: ' target="_blank"')}>
|
||||
{menuitem.title}
|
||||
</a>
|
||||
</f:for>
|
||||
|
||||
+1
-2
@@ -58,8 +58,7 @@
|
||||
data-daytrip-type-param="services"
|
||||
data-daytrip-uid-param="{iteration.cycle}"
|
||||
data-cooltipz-dir="top"
|
||||
aria-label="Alle Inklusivleistungen anzeigen"
|
||||
role="tooltip">
|
||||
aria-label="Alle Inklusivleistungen anzeigen">
|
||||
<svg class="w-4 h-4">
|
||||
<use href="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/icons_sprite.svg')}#icon-info-circle"></use>
|
||||
</svg>
|
||||
|
||||
+162
-147
@@ -47,129 +47,17 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<f:for each="{prices}" as="row">
|
||||
<tr class="odd:bg-zinc-50 hover:bg-zinc-100 odd:hover:bg-zinc-100"
|
||||
data-pricetable-target="row">
|
||||
<td class="border-r border-zinc-200 px-2 py-1 md:p-2">
|
||||
<f:if condition="{row.showBookingButton} && {row.available}">
|
||||
<f:then>
|
||||
<a class="inline-block text-ep-primary-light text-xs sm:text-sm md:text-base leading-tight"
|
||||
href="{row.bookingUrl}"
|
||||
data-controller="datalayer" data-datalayer-event-value="ZurBuchung" data-datalayer-action="trigger"
|
||||
target="_blank"
|
||||
title="{row.roomName}, {hotel.name}, {dateRange} buchen">
|
||||
{row.roomName}
|
||||
</a>
|
||||
</f:then>
|
||||
<f:else>
|
||||
<span class="inline-block text-xs sm:text-sm md:text-base line-through leading-tight">
|
||||
{row.roomName}
|
||||
</span>
|
||||
<f:if condition="{row.available}">
|
||||
<f:else>
|
||||
<span class="inline-block text-xs sm:text-sm md:text-base text-sm leading-tight lg:ml-2">ausgebucht</span>
|
||||
</f:else>
|
||||
</f:if>
|
||||
</f:else>
|
||||
</f:if>
|
||||
</td>
|
||||
<f:if condition="{hasIncludedServices}">
|
||||
<td class="border-r border-zinc-200 px-2 py-1 md:p-2">
|
||||
<div class="flex items-center justify-around space-x-1">
|
||||
<div class="grid grid-cols-2">
|
||||
<f:if condition="{row.busIncluded}">
|
||||
<f:then>
|
||||
<span class="block p-1"
|
||||
data-cooltipz-dir="top"
|
||||
aria-label="Busfahrt inklusive"
|
||||
role="tooltip"
|
||||
data-pricetable-target="busIcon"
|
||||
data-bus-included="{row.busIncluded}"
|
||||
data-bus-price="{row.busPrice}">
|
||||
<svg class="w-4 h-4 md:w-5 md:h-5">
|
||||
<use href="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/icons_sprite.svg')}#icon-bus"></use>
|
||||
</svg>
|
||||
</span>
|
||||
</f:then>
|
||||
<f:else>
|
||||
<span class="block"></span>
|
||||
</f:else>
|
||||
</f:if>
|
||||
<f:if condition="{row.skipassIncluded}">
|
||||
<f:then>
|
||||
<span class="block p-1"
|
||||
data-cooltipz-dir="top"
|
||||
aria-label="{f:if(condition: row.summer, then: 'Bergbahnticket inklusive', else: 'Skipass inklusive')}"
|
||||
role="tooltip">
|
||||
<svg class="w-4 h-4 md:w-5 md:h-5">
|
||||
<use href="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/icons_sprite.svg')}#icon-tag"></use>
|
||||
</svg>
|
||||
</span>
|
||||
</f:then>
|
||||
<f:else>
|
||||
<span class="block"></span>
|
||||
</f:else>
|
||||
</f:if>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</f:if>
|
||||
<td class="border-r border-zinc-200 px-2 py-1 md:p-2 text-center">
|
||||
<f:if condition="{row.hasOptionalServices} && {row.available}">
|
||||
<button type="button"
|
||||
class="text-ep-primary-light text-sm md:text-base text-left leading-none p-1"
|
||||
data-action="pricetable#openModal"
|
||||
data-pricetable-type-param="options"
|
||||
data-pricetable-uid-param="{row.roomUid}"
|
||||
data-cooltipz-dir="top"
|
||||
aria-label="Alle Zusatzleistungen anzeigen"
|
||||
role="tooltip">
|
||||
Zusatz­leistungen
|
||||
</button>
|
||||
</f:if>
|
||||
</td>
|
||||
<td class="px-2 py-1 md:p-2 whitespace-nowrap">
|
||||
<f:if condition="{row.showBookingButton}">
|
||||
<f:then>
|
||||
<f:if condition="{row.available}">
|
||||
<f:then>
|
||||
<a class="button bg-button button--small w-full"
|
||||
data-controller="datalayer" data-datalayer-event-value="ZurBuchung" data-action="datalayer#trigger"
|
||||
href="{row.bookingUrl}"
|
||||
title="{row.roomName}, {hotel.name}, {dateRange} buchen"
|
||||
target="_blank">
|
||||
<span class="font-bold normal-case whitespace-nowrap"
|
||||
data-pricetable-target="price"
|
||||
data-room="{row.minPrice}"
|
||||
data-bus="{row.busPrice}"
|
||||
data-discount="{row.discount}">
|
||||
{row.minPrice}
|
||||
</span>
|
||||
</a>
|
||||
</f:then>
|
||||
<f:else>
|
||||
<span class="button bg-button bg-button--muted button--small block cursor-not-allowed font-bold normal-case whitespace-nowrap"
|
||||
data-cooltipz-dir="top"
|
||||
aria-label="Leider ausgebucht"
|
||||
role="tooltip"
|
||||
data-pricetable-target="price"
|
||||
data-room="{row.minPrice}"
|
||||
data-bus="{row.busPrice}"
|
||||
data-discount="{row.discount}">
|
||||
{row.minPrice} €
|
||||
</span>
|
||||
</f:else>
|
||||
</f:if>
|
||||
</f:then>
|
||||
<f:else>
|
||||
<f:link.typolink parameter="{settings.travelAlertPageUid}"
|
||||
class="button bg-button button--small">
|
||||
Reisen-Alert
|
||||
</f:link.typolink>
|
||||
</f:else>
|
||||
</f:if>
|
||||
</td>
|
||||
</tr>
|
||||
<f:comment><!--
|
||||
Render available and unavailable rooms separately to maintain order:
|
||||
1. by pax
|
||||
2. by price
|
||||
3. by availability
|
||||
--></f:comment>
|
||||
<f:for each="{prices.available}" as="row">
|
||||
<f:render section="Row" arguments="{_all}"/>
|
||||
</f:for>
|
||||
<f:for each="{prices.unavailable}" as="row">
|
||||
<f:render section="Row" arguments="{_all}"/>
|
||||
</f:for>
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -277,34 +165,161 @@
|
||||
</button>
|
||||
</div>
|
||||
<div class="h-128 p-4 overflow-y-scroll bg-white rounded-b">
|
||||
<f:for each="{prices}" as="row">
|
||||
<div class="hidden"
|
||||
data-modal-target="content"
|
||||
data-uid="{row.roomUid}">
|
||||
<f:for each="{row.optionalServices}" as="section" key="sectionCode">
|
||||
<div class="py-2 -mx-1">
|
||||
<div class="font-bold text-xl px-1">
|
||||
{section.label}
|
||||
</div>
|
||||
<f:for each="{section.services}" as="service">
|
||||
<f:if condition="{sectionCode} == 'BUS' || {service.price} != '0,00'">
|
||||
<dl class="flex items-start justify-between p-1 hover:bg-zinc-50">
|
||||
<dt class="font-normal">
|
||||
{service.label}:
|
||||
</dt>
|
||||
<dd class="whitespace-nowrap">
|
||||
{service.price} €
|
||||
</dd>
|
||||
</dl>
|
||||
</f:if>
|
||||
</f:for>
|
||||
</div>
|
||||
</f:for>
|
||||
</div>
|
||||
<f:for each="{prices.available}" as="row">
|
||||
<f:render section="OptionsModalRow" arguments="{_all}"/>
|
||||
</f:for>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</f:section>
|
||||
|
||||
<f:section name="Row">
|
||||
<tr class="odd:bg-zinc-50 hover:bg-zinc-100 odd:hover:bg-zinc-100"
|
||||
data-pricetable-target="row">
|
||||
<td class="border-r border-zinc-200 px-2 py-1 md:p-2">
|
||||
<f:if condition="{row.showBookingButton} && {row.available}">
|
||||
<f:then>
|
||||
<a class="inline-block text-ep-primary-light text-xs sm:text-sm md:text-base leading-tight"
|
||||
href="{row.bookingUrl}"
|
||||
data-controller="datalayer" data-datalayer-event-value="ZurBuchung" data-datalayer-action="trigger"
|
||||
target="_blank"
|
||||
title="{row.roomName}, {hotel.name}, {dateRange} buchen">
|
||||
{row.roomName}
|
||||
</a>
|
||||
</f:then>
|
||||
<f:else>
|
||||
<span class="inline-block text-xs sm:text-sm md:text-base line-through leading-tight">{row.roomName}</span>
|
||||
<f:if condition="{row.available}">
|
||||
<f:else>
|
||||
<span class="inline-block text-xs sm:text-sm md:text-base text-sm leading-tight lg:ml-2">ausgebucht</span>
|
||||
</f:else>
|
||||
</f:if>
|
||||
</f:else>
|
||||
</f:if>
|
||||
</td>
|
||||
<f:if condition="{hasIncludedServices}">
|
||||
<td class="border-r border-zinc-200 px-2 py-1 md:p-2">
|
||||
<div class="flex items-center justify-around space-x-1">
|
||||
<div class="grid grid-cols-2">
|
||||
<f:if condition="{row.busIncluded}">
|
||||
<f:then>
|
||||
<span class="block p-1"
|
||||
data-cooltipz-dir="top"
|
||||
aria-label="Busfahrt inklusive"
|
||||
role="tooltip"
|
||||
data-pricetable-target="busIcon"
|
||||
data-bus-included="{row.busIncluded}"
|
||||
data-bus-price="{row.busPrice}">
|
||||
<svg class="w-4 h-4 md:w-5 md:h-5">
|
||||
<use href="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/icons_sprite.svg')}#icon-bus"></use>
|
||||
</svg>
|
||||
</span>
|
||||
</f:then>
|
||||
<f:else>
|
||||
<span class="block"></span>
|
||||
</f:else>
|
||||
</f:if>
|
||||
<f:if condition="{row.skipassIncluded}">
|
||||
<f:then>
|
||||
<span class="block p-1"
|
||||
data-cooltipz-dir="top"
|
||||
aria-label="{f:if(condition: row.summer, then: 'Bergbahnticket inklusive', else: 'Skipass inklusive')}"
|
||||
role="tooltip">
|
||||
<svg class="w-4 h-4 md:w-5 md:h-5">
|
||||
<use href="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/icons_sprite.svg')}#icon-tag"></use>
|
||||
</svg>
|
||||
</span>
|
||||
</f:then>
|
||||
<f:else>
|
||||
<span class="block"></span>
|
||||
</f:else>
|
||||
</f:if>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</f:if>
|
||||
<td class="border-r border-zinc-200 px-2 py-1 md:p-2 text-center">
|
||||
<f:if condition="{row.hasOptionalServices} && {row.available}">
|
||||
<button type="button"
|
||||
class="text-ep-primary-light text-sm md:text-base text-left leading-none p-1"
|
||||
data-action="pricetable#openModal"
|
||||
data-pricetable-type-param="options"
|
||||
data-pricetable-uid-param="{row.roomUid}"
|
||||
data-cooltipz-dir="top"
|
||||
aria-label="Alle Zusatzleistungen anzeigen">
|
||||
Zusatz­leistungen
|
||||
</button>
|
||||
</f:if>
|
||||
</td>
|
||||
<td class="px-2 py-1 md:p-2 whitespace-nowrap">
|
||||
<f:if condition="{row.showBookingButton}">
|
||||
<f:then>
|
||||
<f:if condition="{row.available}">
|
||||
<f:then>
|
||||
<a class="button bg-button button--small w-full"
|
||||
data-controller="datalayer" data-datalayer-event-value="ZurBuchung" data-action="datalayer#trigger"
|
||||
href="{row.bookingUrl}"
|
||||
title="{row.roomName}, {hotel.name}, {dateRange} buchen"
|
||||
target="_blank">
|
||||
<span class="font-bold normal-case whitespace-nowrap"
|
||||
data-pricetable-target="price"
|
||||
data-room="{row.minPrice}"
|
||||
data-bus="{row.busPrice}"
|
||||
data-discount="{row.discount}">
|
||||
{row.minPrice}
|
||||
</span>
|
||||
</a>
|
||||
</f:then>
|
||||
<f:else>
|
||||
<span class="button bg-button bg-button--muted button--small block cursor-not-allowed font-bold normal-case whitespace-nowrap"
|
||||
data-cooltipz-dir="top"
|
||||
aria-label="Leider ausgebucht"
|
||||
role="tooltip"
|
||||
data-pricetable-target="price"
|
||||
data-room="{row.minPrice}"
|
||||
data-bus="{row.busPrice}"
|
||||
data-discount="{row.discount}">
|
||||
{row.minPrice} €
|
||||
</span>
|
||||
</f:else>
|
||||
</f:if>
|
||||
</f:then>
|
||||
<f:else>
|
||||
<f:link.typolink parameter="{settings.travelAlertPageUid}"
|
||||
class="button bg-button button--small">
|
||||
Reisen-Alert
|
||||
</f:link.typolink>
|
||||
</f:else>
|
||||
</f:if>
|
||||
</td>
|
||||
</tr>
|
||||
</f:section>
|
||||
|
||||
<f:Section name="OptionsModalRow">
|
||||
<div class="hidden"
|
||||
data-modal-target="content"
|
||||
data-uid="{row.roomUid}">
|
||||
<f:for each="{row.optionalServices}" as="section" key="sectionCode">
|
||||
<f:if condition="{section.services}">
|
||||
<div class="py-2 -mx-1">
|
||||
<div class="font-bold text-xl px-1">
|
||||
{section.label}
|
||||
</div>
|
||||
<f:for each="{section.services}" as="service">
|
||||
<f:if condition="{sectionCode} == 'BUS' || {sectionCode} == 'VPF' || {service.price} != '0,00'">
|
||||
<dl class="flex items-start justify-between p-1 hover:bg-zinc-50">
|
||||
<dt class="font-normal">
|
||||
{service.label}:
|
||||
</dt>
|
||||
<dd class="whitespace-nowrap">
|
||||
{service.price} €
|
||||
</dd>
|
||||
</dl>
|
||||
</f:if>
|
||||
</f:for>
|
||||
</div>
|
||||
</f:if>
|
||||
</f:for>
|
||||
</div>
|
||||
</f:Section>
|
||||
</html>
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
<button type="button"
|
||||
class="opacity-50"
|
||||
data-action="teasergrid#grid"
|
||||
aria-label="kompakte Ansicht"
|
||||
data-teasergrid-target="button">
|
||||
<svg class="w-12 h-12 text-ep-primary">
|
||||
<use href="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/icons_sprite.svg')}#icon-teaser-grid"></use>
|
||||
@@ -40,6 +41,7 @@
|
||||
</button>
|
||||
<button type="button"
|
||||
data-action="teasergrid#block"
|
||||
aria-label="vergrößerte Ansicht"
|
||||
data-teasergrid-target="button">
|
||||
<svg class="w-12 h-12 text-ep-primary">
|
||||
<use href="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/icons_sprite.svg')}#icon-teaser-single"></use>
|
||||
|
||||
@@ -54,6 +54,10 @@
|
||||
<th>Anzahl der Personen</th>
|
||||
<td>{pax -> v:or(alternative: '-')}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Anzahl Kinder 0-3 Jahre</th>
|
||||
<td>{children -> v:or(alternative: '-')}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Verpflegung</th>
|
||||
<td>
|
||||
|
||||
+1
@@ -10,6 +10,7 @@
|
||||
style="background-image: url({f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/lazy.png')})">
|
||||
<iframe class="absolute top-0 left-0 w-full h-full"
|
||||
width="640" height="360" allowfullscreen
|
||||
title="eingebettetes Video"
|
||||
data-src="{ep:uri.video(value: data.header_link, layout: data.layout)}"
|
||||
data-cookiefirst-category="advertising"></iframe>
|
||||
<div class="cookiefirst-disabled-resource">
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
options-json='{options}'
|
||||
running-costs-factor-eur="{runningCostsEUR}"
|
||||
running-costs-factor-chf="{runningCostsCHF}"
|
||||
undersubscription-eur="{undersubscriptionEUR}"
|
||||
undersubscription-chf="{undersubscriptionCHF}"
|
||||
undersubscription-ext-eur="{undersubscriptionExtEUR}"
|
||||
undersubscription-ext-chf="{undersubscriptionExtCHF}"
|
||||
undersubscription-30-eur="{undersubscription30EUR}"
|
||||
undersubscription-30-chf="{undersubscription30CHF}"
|
||||
undersubscription-40-eur="{undersubscription40EUR}"
|
||||
undersubscription-40-chf="{undersubscription40CHF}"
|
||||
country-code="{countryCode}"
|
||||
endpoint="{ep:uri.ajax(action: 'processForm', controller: 'AjaxGroupsPrice', pageUid: settings.defaultAjaxUid, arguments: '{hotel: hotel}')}"
|
||||
loader-uri="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/ajax-loader-white.gif')}"
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
data-action="click->collapse#toggle"
|
||||
class="w-full bg-transparent border-0 ring-0 focus:ring-0 text-white uppercase px-2 py-1 cursor-pointer placeholder-white"
|
||||
placeholder="Zeitraum"
|
||||
aria-label="Zeitraum"
|
||||
value="{ep:dateRange(dateFrom: searchParams.dateFrom, dateTo: searchParams.dateTo, includeLabel: 0)}"
|
||||
data-searchbar-target="dateRangeLabel"/>
|
||||
<svg class="w-6 h-6 text-white absolute right-0 top-0 mr-2 mt-1 cursor-pointer"
|
||||
@@ -57,6 +58,7 @@
|
||||
<div class="flex justify-between divide-x divide-zinc-200">
|
||||
<div class="pr-2">
|
||||
<input type="hidden"
|
||||
aria-label="Zeitraum"
|
||||
data-datepicker-target="field">
|
||||
</div>
|
||||
<div class="flex-1 flex flex-col justify-between pl-2">
|
||||
@@ -100,6 +102,7 @@
|
||||
<input type="text"
|
||||
data-action="click->collapse#toggle"
|
||||
data-searchbar-target="paxLabel"
|
||||
aria-label="Personenzahl"
|
||||
value="{searchParams.pax}"
|
||||
class="w-full bg-transparent border-0 ring-0 focus:ring-0 text-white uppercase px-2 py-1 cursor-pointer"/>
|
||||
<svg class="w-6 h-6 text-white absolute right-0 top-0 mr-2 mt-1 cursor-pointer"
|
||||
@@ -139,6 +142,7 @@
|
||||
<input type="text"
|
||||
data-action="click->collapse#toggle"
|
||||
data-searchbar-target="destinationLabel"
|
||||
aria-label="Reiseziel/Konzept"
|
||||
class="w-full bg-transparent border-0 ring-0 focus:ring-0 text-white uppercase px-2 py-1 cursor-pointer placeholder-white"
|
||||
placeholder="Reiseziel/Konzept"/>
|
||||
<svg
|
||||
@@ -161,9 +165,7 @@
|
||||
<svg class="block w-8 h-6">
|
||||
<use href="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/icons_sprite.svg')}#icon-flag-{destination.country.code -> f:format.case(mode: 'lower')}"></use>
|
||||
</svg>
|
||||
<span>
|
||||
{destination.country.label}
|
||||
</span>
|
||||
<span>{destination.country.label}</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="col-span-3 flex flex-col items-start space-y-1">
|
||||
@@ -212,6 +214,7 @@
|
||||
data-collapse-collapsed-value="true">
|
||||
<div class="relative border-r border-b border-white/50">
|
||||
<input type="text"
|
||||
aria-label="Preis"
|
||||
data-action="click->collapse#toggle"
|
||||
data-searchbar-target="priceRangeLabel"
|
||||
class="w-full bg-transparent border-0 ring-0 focus:ring-0 text-white uppercase px-2 py-1 cursor-pointer placeholder-white"
|
||||
@@ -251,7 +254,7 @@
|
||||
|
||||
</div>
|
||||
<button type="submit"
|
||||
class="hidden reduced:block reduced:ml-4">
|
||||
class="hidden reduced:block reduced:ml-4" title="Suchen">
|
||||
<svg class="w-8 h-8 text-white bg-badge-gradient">
|
||||
<use href="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/icons_sprite.svg')}#icon-chevron-right"></use>
|
||||
</svg>
|
||||
|
||||
Reference in New Issue
Block a user