feat: hotel, region, city, country and concept plugins, FAQ, team, maps and price table on TYPO3 13

Controllers, templates and FlexForms restored from a46918d, ported with
Rector/Fractor and by hand (settings and rows missing from older
records read as empty, as PHP 7.4 did). They stay list_type plugins for
now. The pages match TYPO3 10 apart from data that changed since (dates,
prices, edited texts).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
frommeandClaude Opus 5.5 committed 2026-10-24 12:27:26 +02:00
1 parent 53faeccb70
commit a042eff41d
48 files changed
+3100 -75

No files matched your search

@@ -0,0 +1,99 @@
<?php
namespace EP\EpProducts\Controller;
/***************************************************************
*
* Copyright notice
*
* (c) 2016 Björn Fromme <[email protected]>, dreipunktnull
*
* All rights reserved
*
* This script is part of the TYPO3 project. The TYPO3 project is
* free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* The GNU General Public License can be found at
* http://www.gnu.org/copyleft/gpl.html.
*
* This script is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
use Psr\Http\Message\ResponseInterface;
use EP\EpProducts\Domain\Model\City;
use EP\EpProducts\Domain\Repository\CityRepository;
use EP\EpProducts\Service\ProductDataService;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
class CityController extends ActionController
{
/**
* @var CityRepository
*/
protected $cityRepository;
/**
* @var ProductDataService
*/
private $productDataService;
/**
* @param CityRepository $cityRepository
* @param ProductDataService $productDataService
*/
public function __construct(CityRepository $cityRepository, ProductDataService $productDataService)
{
$this->cityRepository = $cityRepository;
$this->productDataService = $productDataService;
}
/**
* @param City $city
*/
public function detailAction(?City $city = null): ResponseInterface
{
if (null === $city) {
$cityUid = ($this->settings['cityUid'] ?? '');
$city = $this->cityRepository->findByIdentifier($cityUid);
}
$teasers = [];
if (null !== $city) {
$filterSettings = [
'cityUids' => [$cityUid]
];
$teasers = $this->productDataService->getTeasergroup($filterSettings);
}
$this->view->assignMultiple([
'city' => $city,
'teasers' => $teasers,
'filterSettings' => $filterSettings,
]);
return $this->htmlResponse();
}
public function teasergroupAction(): ResponseInterface
{
$regionUid = (int)($this->settings['regionUid'] ?? '');
$countryUid = (int)($this->settings['countryUid'] ?? '');
$season = ($this->settings['season'] ?? '');
$citiesPid = (int)($this->settings['citiesStoragePid'] ?? '');
$cities = $this->cityRepository->getTeasersByCountryOrRegionAndSeason($regionUid, $countryUid, $season, $citiesPid);
$data = $this->request->getAttribute('currentContentObject')->data;
$this->view->assign('data', $data);
$this->view->assign('teasers', $cities);
return $this->htmlResponse();
}
}
@@ -0,0 +1,106 @@
<?php
namespace EP\EpProducts\Controller;
/***************************************************************
*
* Copyright notice
*
* (c) 2016 Björn Fromme <[email protected]>, dreipunktnull
*
* All rights reserved
*
* This script is part of the TYPO3 project. The TYPO3 project is
* free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* The GNU General Public License can be found at
* http://www.gnu.org/copyleft/gpl.html.
*
* This script is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
use Psr\Http\Message\ResponseInterface;
use EP\EpProducts\Domain\Model\Concept;
use EP\EpProducts\Domain\Repository\ConceptRepository;
use EP\EpProducts\Service\ProductDataService;
use EP\EpTheme\Domain\Repository\PageRepository;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
class ConceptController extends ActionController
{
/**
* @var ConceptRepository
*/
protected $conceptRepository;
/**
* @var ProductDataService
*/
protected $productDataService;
/**
* @var PageRepository
*/
private $pageRepository;
/**
* @param ConceptRepository $conceptRepository
* @param ProductDataService $productDataService
* @param PageRepository $pageRepository
*/
public function __construct(ConceptRepository $conceptRepository, ProductDataService $productDataService, PageRepository $pageRepository)
{
$this->conceptRepository = $conceptRepository;
$this->productDataService = $productDataService;
$this->pageRepository = $pageRepository;
}
/**
* @param Concept $concept
*/
public function detailAction(?Concept $concept = null): ResponseInterface
{
if ($concept === null) {
$conceptUid = ($this->settings['conceptUid'] ?? '');
$concept = $this->conceptRepository->findByIdentifier($conceptUid);
}
$teaserConceptUids = GeneralUtility::trimExplode(',', ($this->settings['additionalConceptUids'] ?? ''));
if (null !== $concept) {
array_unshift($teaserConceptUids, $concept->getUid());
}
$filterSettings = ['conceptUids' => $teaserConceptUids];
$excludedConceptUids = GeneralUtility::trimExplode(',', ($this->settings['excludedConceptUids'] ?? ''), true);
$limit = ($this->settings['showMoreLink'] ?? '') ? 6 : 0;
$teasers = $this->productDataService->getTeasergroup($filterSettings, $excludedConceptUids, $limit);
$pages = $this->pageRepository->findPagesByPid((int)($this->settings['conceptsPageUid'] ?? ''));
$data = $this->request->getAttribute('currentContentObject')->data;
$this->view->assignMultiple([
'teasers' => $teasers,
'concept' => $concept,
'filterSettings' => $filterSettings,
'pages' => $pages,
'data' => $data,
]);
return $this->htmlResponse();
}
public function teasergroupAction(): ResponseInterface
{
$concepts = $this->conceptRepository->findAll();
$this->view->assign('teasers', $concepts);
return $this->htmlResponse();
}
}
@@ -0,0 +1,80 @@
<?php
namespace EP\EpProducts\Controller;
/***************************************************************
*
* Copyright notice
*
* (c) 2016 Björn Fromme <[email protected]>, dreipunktnull
*
* All rights reserved
*
* This script is part of the TYPO3 project. The TYPO3 project is
* free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* The GNU General Public License can be found at
* http://www.gnu.org/copyleft/gpl.html.
*
* This script is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
use Psr\Http\Message\ResponseInterface;
use EP\EpProducts\Domain\Model\Country;
use EP\EpProducts\Domain\Repository\CountryRepository;
use EP\EpProducts\Service\ProductDataService;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
class CountryController extends ActionController
{
/**
* @var CountryRepository
*/
protected $countryRepository;
/**
* @var ProductDataService
*/
protected $productDataService;
/**
* @param CountryRepository $countryRepository
* @param ProductDataService $productDataService
*/
public function __construct(CountryRepository $countryRepository, ProductDataService $productDataService)
{
$this->countryRepository = $countryRepository;
$this->productDataService = $productDataService;
}
/**
* @param Country $country
*/
public function detailAction(?Country $country = null): ResponseInterface
{
if ($country === null) {
$countryUid = ($this->settings['countryUid'] ?? '');
$country = $this->countryRepository->findByIdentifier($countryUid);
}
$filterSettings = [
'countryUids' => [ $countryUid ],
];
$excludedConceptUids = GeneralUtility::trimExplode(',', ($this->settings['excludedConceptUids'] ?? ''), true);
$limit = ($this->settings['showMoreLink'] ?? '') ? 6 : 0;
$teasers = $this->productDataService->getTeasergroup($filterSettings, $excludedConceptUids, $limit);
$this->view->assign('teasers', $teasers);
$this->view->assign('country', $country);
$this->view->assign('filterSettings', $filterSettings);
return $this->htmlResponse();
}
}
@@ -0,0 +1,57 @@
<?php
namespace EP\EpProducts\Controller;
/***************************************************************
*
* Copyright notice
*
* (c) 2016 Björn Fromme <[email protected]>, dreipunktnull
*
* All rights reserved
*
* This script is part of the TYPO3 project. The TYPO3 project is
* free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* The GNU General Public License can be found at
* http://www.gnu.org/copyleft/gpl.html.
*
* This script is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
use Psr\Http\Message\ResponseInterface;
use EP\EpProducts\Domain\Repository\FaqRepository;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
class FaqController extends ActionController
{
/**
* @var FaqRepository
*/
protected $faqRepository;
/**
* @param FaqRepository $faqRepository
*/
public function __construct(FaqRepository $faqRepository)
{
$this->faqRepository = $faqRepository;
}
public function detailAction(): ResponseInterface
{
$faqUids = ($this->settings['faqUids'] ?? '');
$faqs = $this->faqRepository->findByUids($faqUids);
$this->view->assign('faqs', $faqs);
return $this->htmlResponse();
}
}
@@ -0,0 +1,157 @@
<?php
namespace EP\EpProducts\Controller;
/***************************************************************
*
* Copyright notice
*
* (c) 2016 Björn Fromme <[email protected]>, dreipunktnull
*
* All rights reserved
*
* This script is part of the TYPO3 project. The TYPO3 project is
* free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* The GNU General Public License can be found at
* http://www.gnu.org/copyleft/gpl.html.
*
* This script is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
use Psr\Http\Message\ResponseInterface;
use EP\EpProducts\Domain\Model\Product;
use EP\EpProducts\Domain\Model\Hotel;
use EP\EpProducts\Domain\Repository\HotelRepository;
use EP\EpProducts\Domain\Repository\ProductRepository;
use EP\EpProducts\Service\HotelDataService;
use EP\EpProducts\Service\ProductDataService;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
class HotelController extends ActionController
{
/**
* @var HotelRepository
*/
protected $hotelRepository;
/**
* @var ProductRepository
*/
protected $productRepository;
/**
* @var HotelDataService
*/
protected $hotelDataService;
/**
* @var ProductDataService
*/
protected $productDataService;
/**
* @param HotelDataService $hotelDataService
* @param HotelRepository $hotelRepository
* @param ProductRepository $productRepository
* @param ProductDataService $productDataService
*/
public function __construct
(
HotelDataService $hotelDataService,
HotelRepository $hotelRepository,
ProductRepository $productRepository,
ProductDataService $productDataService
)
{
$this->hotelRepository = $hotelRepository;
$this->productRepository = $productRepository;
$this->hotelDataService = $hotelDataService;
$this->productDataService = $productDataService;
}
/**
* @param Hotel $hotel
*/
public function detailAction(?Hotel $hotel = null): ResponseInterface
{
if ($hotel !== null) {
$hotelUid = $hotel->getUid();
} else {
$hotelUid = ($this->settings['hotelUid'] ?? '');
/** @var Hotel $hotel */
$hotel = $this->hotelRepository->findByIdentifier($hotelUid);
}
$filterSettings = [
'hotelUid' => $hotelUid,
];
$excludedConceptUids = GeneralUtility::trimExplode(',', ($this->settings['excludedConceptUids'] ?? ''), true);
$limit = ($this->settings['hideMoreLink'] ?? '') ? 0 : 6;
$teasers = $this->productDataService->getTeasergroup($filterSettings, $excludedConceptUids, $limit);
$this->view->assign('hotel', $hotel);
$this->view->assign('teasers', $teasers);
$this->view->assign('filterSettings', $filterSettings);
return $this->htmlResponse();
}
public function detailEventAction(): ResponseInterface
{
$productUid = ($this->settings['productUid'] ?? '');
/** @var Product $product */
$product = $this->productRepository->findByIdentifier($productUid);
$hotelUid = ($this->settings['hotelUid'] ?? '');
/** @var Hotel $hotel */
$hotel = $this->hotelRepository->findByIdentifier($hotelUid);
$this->view->assignMultiple([
'product' => $product,
'hotel' => $hotel,
]);
return $this->htmlResponse();
}
public function teasergroupAction(): ResponseInterface
{
$criteria = [
'regionUid' => (int) ($this->settings['regionUid'] ?? ''),
'countryUid' => (int) ($this->settings['countryUid'] ?? ''),
'conceptUid' => (int) ($this->settings['conceptUid'] ?? ''),
'productUid' => (int) ($this->settings['productUid'] ?? ''),
'category' => (int) ($this->settings['category'] ?? ''),
'type' => (int) ($this->settings['type'] ?? ''),
];
$bookable = $this->hotelDataService->getTeasersByCriteria($criteria);
$bookableHotelUids = array_keys($bookable);
$nonBookable = $this->hotelDataService->getDateIndependentTeasersByCriteria($criteria, $bookableHotelUids);
$data = $this->request->getAttribute('currentContentObject')->data;
$this->view->assign('data', $data);
$this->view->assign('bookable', $bookable);
$this->view->assign('nonBookable', $nonBookable);
return $this->htmlResponse();
}
public function dateIndependentTeasergroupAction(): ResponseInterface
{
$criteria = [
'regionUid' => (int) ($this->settings['regionUid'] ?? ''),
'countryUid' => (int) ($this->settings['countryUid'] ?? ''),
'productUid' => (int) ($this->settings['productUid'] ?? ''),
'category' => (int) ($this->settings['category'] ?? ''),
'type' => (int) ($this->settings['type'] ?? ''),
];
$hotels = $this->hotelDataService->getDateIndependentTeasersByCriteria($criteria);
$data = $this->request->getAttribute('currentContentObject')->data;
$this->view->assign('data', $data);
$this->view->assign('teasers', $hotels);
return $this->htmlResponse();
}
}
@@ -0,0 +1,126 @@
<?php
namespace EP\EpProducts\Controller;
/***************************************************************
*
* Copyright notice
*
* (c) 2016 Björn Fromme <[email protected]>, dreipunktnull
*
* All rights reserved
*
* This script is part of the TYPO3 project. The TYPO3 project is
* free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* The GNU General Public License can be found at
* http://www.gnu.org/copyleft/gpl.html.
*
* This script is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
use Psr\Http\Message\ResponseInterface;
use EP\EpProducts\Domain\Model\Hotel;
use EP\EpProducts\Domain\Model\Product;
use EP\EpProducts\Domain\Repository\HotelRepository;
use EP\EpProducts\Domain\Repository\ProductRepository;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
class MapController extends ActionController
{
/**
* @var HotelRepository
*/
protected $hotelRepository;
/**
* @var ProductRepository
*/
protected $productRepository;
/**
* @param HotelRepository $hotelRepository
* @param ProductRepository $productRepository
*/
public function __construct(
HotelRepository $hotelRepository,
ProductRepository $productRepository
)
{
$this->hotelRepository = $hotelRepository;
$this->productRepository = $productRepository;
}
public function generalAction(): ResponseInterface
{
$markerData = [];
$selectedHotels = ($this->settings['hotelUids'] ?? '');
$hotelUids = GeneralUtility::trimExplode(',', $selectedHotels);
$hotels = $this->hotelRepository->getListByUids($hotelUids);
if ($hotels) {
foreach ($hotels as $hotel)
{
/** @var Hotel $hotel */
$markerData[] = [
'name' => $hotel->getName(),
'uri' => $this->getUriForPageUid($hotel->getDetailPage()),
'teaser' => $hotel->getTeaser(),
'lat' => $hotel->getLatitude(),
'lng' => $hotel->getLongitude(),
];
}
}
$selectedProducts = ($this->settings['productUids'] ?? '');
$productUids = GeneralUtility::trimExplode(',', $selectedProducts);
$products = $this->productRepository->getListByUids($productUids);
if ($products) {
foreach ($products as $product)
{
/** @var Product $product */
$hotel = $product->getHotels()->current();
if (null === $hotel || false === $hotel->isShowAsTeaser()) {
continue;
}
$markerData[] = [
'name' => $product->getName(),
'uri' => $this->getUriForPageUid($product->getDetailPage()),
'externalLink' => $hotel->getExternalLink(),
'teaser' => preg_replace("/[\r\n\t]/", "", $product->getTeaser()),
'lat' => $hotel->getLatitude(),
'lng' => $hotel->getLongitude(),
];
}
}
$data = $this->request->getAttribute('currentContentObject')->data;
$this->view->assign('data', $data);
$this->view->assign('markerData', json_encode($markerData, JSON_THROW_ON_ERROR | JSON_HEX_APOS));
return $this->htmlResponse();
}
/**
* @param int $pageUid
* @return string
*/
protected function getUriForPageUid($pageUid)
{
/** @var ContentObjectRenderer $contentObject */
$contentObject = GeneralUtility::makeInstance(ContentObjectRenderer::class);
return $contentObject->typoLink_URL(
[
'parameter' => $pageUid,
]
);
}
}
@@ -0,0 +1,42 @@
<?php
namespace EP\EpProducts\Controller;
/***************************************************************
*
* Copyright notice
*
* (c) 2016 Björn Fromme <[email protected]>, dreipunktnull
*
* All rights reserved
*
* This script is part of the TYPO3 project. The TYPO3 project is
* free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* The GNU General Public License can be found at
* http://www.gnu.org/copyleft/gpl.html.
*
* This script is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
use Psr\Http\Message\ResponseInterface;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
class PricetableController extends ActionController
{
public function eventAction(): ResponseInterface
{
$productUid = ($this->settings['productUid'] ?? '');
$this->view->assign('productUid', $productUid);
return $this->htmlResponse();
}
}
@@ -0,0 +1,97 @@
<?php
namespace EP\EpProducts\Controller;
/***************************************************************
*
* Copyright notice
*
* (c) 2016 Björn Fromme <[email protected]>, dreipunktnull
*
* All rights reserved
*
* This script is part of the TYPO3 project. The TYPO3 project is
* free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* The GNU General Public License can be found at
* http://www.gnu.org/copyleft/gpl.html.
*
* This script is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
use Psr\Http\Message\ResponseInterface;
use EP\EpProducts\Domain\Model\Region;
use EP\EpProducts\Domain\Repository\RegionRepository;
use EP\EpProducts\Service\ProductDataService;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
class RegionController extends ActionController
{
/**
* @var RegionRepository
*/
protected $regionRepository;
/**
* @var ProductDataService
*/
protected $productDataService;
/**
* @param RegionRepository $regionRepository
* @param ProductDataService $productDataService
*/
public function __construct(RegionRepository $regionRepository, ProductDataService $productDataService)
{
$this->regionRepository = $regionRepository;
$this->productDataService = $productDataService;
}
/**
* @param Region $region
*/
public function detailAction(?Region $region = null): ResponseInterface
{
if ($region === null) {
$regionUid = ($this->settings['regionUid'] ?? '');
$region = $this->regionRepository->findByIdentifier($regionUid);
}
$additionalRegionUids = GeneralUtility::trimExplode(',', ($this->settings['additionalRegionUids'] ?? ''), true);
$additionalRegionUids = array_map(function ($uid) {
return (int)$uid;
}, $additionalRegionUids);
$teaserRegionUids = array_merge([$region->getUid()], $additionalRegionUids);
$filterSettings = [
'regionUids' => $teaserRegionUids,
];
$excludedConceptUids = GeneralUtility::trimExplode(',', ($this->settings['excludedConceptUids'] ?? ''), true);
$limit = ($this->settings['hideMoreLink'] ?? '') ? 0 : 6;
$teasers = $this->productDataService->getTeasergroup($filterSettings, $excludedConceptUids, $limit);
$this->view->assign('teasers', $teasers);
$this->view->assign('region', $region);
$this->view->assign('filterSettings', $filterSettings);
return $this->htmlResponse();
}
public function teasergroupAction(): ResponseInterface
{
$countryUid = (int)($this->settings['countryUid'] ?? '');
$season = ($this->settings['season'] ?? '');
$regionsPid = (int)($this->settings['regionsStoragePid'] ?? '');
$regions = $this->regionRepository->getTeasersByCountryAndSeason($countryUid, $season, $regionsPid);
$data = $this->request->getAttribute('currentContentObject')->data;
$this->view->assign('data', $data);
$this->view->assign('teasers', $regions);
return $this->htmlResponse();
}
}
@@ -0,0 +1,98 @@
<?php
namespace EP\EpProducts\Controller;
/***************************************************************
*
* Copyright notice
*
* (c) 2016 Björn Fromme <[email protected]>, dreipunktnull
*
* All rights reserved
*
* This script is part of the TYPO3 project. The TYPO3 project is
* free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* The GNU General Public License can be found at
* http://www.gnu.org/copyleft/gpl.html.
*
* This script is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
use Psr\Http\Message\ResponseInterface;
use EP\EpProducts\Domain\Model\Teammember;
use EP\EpProducts\Domain\Repository\TeammemberRepository;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
class TeamController extends ActionController
{
/**
* @var TeammemberRepository
*/
protected $teammemberRepository;
/**
* @param TeammemberRepository $teammemberRepository
*/
public function __construct(TeammemberRepository $teammemberRepository)
{
$this->teammemberRepository = $teammemberRepository;
}
public function listAction(): ResponseInterface
{
if (isset($this->settings['teamCategories']) && count(GeneralUtility::trimExplode(',', ($this->settings['teamCategories'] ?? ''), true)) > 0) {
$members = $this->teammemberRepository->findByCategories(GeneralUtility::trimExplode(',', ($this->settings['teamCategories'] ?? ''), true));
} else {
$members = $this->teammemberRepository->findAll();
}
$this->view->assign('members', $members);
return $this->htmlResponse();
}
/**
* @param Teammember $member
* @throws \TYPO3\CMS\Extbase\Mvc\Exception\StopActionException
* @throws \TYPO3\CMS\Extbase\Mvc\Exception\UnsupportedRequestTypeException
*/
public function showAction(?Teammember $member = null): ResponseInterface
{
if ($member === null) {
return $this->redirect('list', null, null, null, null, 0, 302);
}
$this->view->assign('member', $member);
$this->view->assign('data', $this->request->getAttribute('currentContentObject')->data);
$this->view->assign('header', $this->coalesceHeader($member));
return $this->htmlResponse();
}
/**
* @param Teammember $member
*
* @return string
*/
public function coalesceHeader(Teammember $member)
{
$data = $this->request->getAttribute('currentContentObject')->data;
if (isset($data['header']) && $data['header'] !== '') {
return $data['header'];
}
$firstCategory = current($member->getCategories()->toArray());
if ($firstCategory !== null && $firstCategory !== false) {
return $firstCategory->getTitle();
}
return '';
}
}
@@ -96,7 +96,7 @@ abstract class AbstractRepository extends Repository
protected function addHotelFilterConditions(QueryBuilder $qb, array $filterSettings): void
{
// Hotel
if ($filterSettings['hotelUid'] > 0) {
if (($filterSettings['hotelUid'] ?? 0) > 0) {
$qb->andWhere($qb->expr()->eq(
'date.hotel',
$qb->createNamedParameter((int)$filterSettings['hotelUid'], Connection::PARAM_INT)
@@ -0,0 +1,63 @@
<?php
namespace EP\EpProducts\Domain\Repository;
/***************************************************************
*
* Copyright notice
*
* (c) 2016 Björn Fromme <[email protected]>, dreipunktnull
*
* All rights reserved
*
* This script is part of the TYPO3 project. The TYPO3 project is
* free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* The GNU General Public License can be found at
* http://www.gnu.org/copyleft/gpl.html.
*
* This script is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
use EP\EpProducts\Domain\Model\Faq;
use Doctrine\DBAL\ArrayParameterType;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper;
class FaqRepository extends AbstractRepository
{
/**
* @param string $uids
* @return array
* @throws \Doctrine\DBAL\DBALException
*/
public function findByUids($uids)
{
/** @var DataMapper $dataMapper */
$dataMapper = GeneralUtility::makeInstance(DataMapper::class);
$uids = GeneralUtility::intExplode(',', (string)$uids, true);
if ($uids === []) {
return [];
}
$qb = $this->getDbConnection()->createQueryBuilder();
$qb
->select('*')
->from('tx_epproducts_domain_model_faq')
->where('uid IN (:uids)')
->setParameter('uids', $uids, ArrayParameterType::INTEGER);
$qb->getConcreteQueryBuilder()->orderBy('FIELD(uid, ' . implode(',', $uids) . ')');
$rows = $qb->executeQuery()->fetchAllAssociative();
return $dataMapper->map(Faq::class, $rows);
}
}
@@ -0,0 +1,54 @@
<?php
namespace EP\EpProducts\Domain\Repository;
use TYPO3\CMS\Extbase\Persistence\QueryResultInterface;
use TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException;
/***************************************************************
*
* Copyright notice
*
* (c) 2016 Björn Fromme <[email protected]>, dreipunktnull
*
* All rights reserved
*
* This script is part of the TYPO3 project. The TYPO3 project is
* free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* The GNU General Public License can be found at
* http://www.gnu.org/copyleft/gpl.html.
*
* This script is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
class TeammemberRepository extends AbstractRepository
{
/**
* @var array
*/
protected $defaultOrderings = [
'sorting' => 'ASC',
];
/**
* @param array $categories
* @return array|QueryResultInterface
* @throws InvalidQueryException
*/
public function findByCategories(array $categories = [])
{
$qb = $this->createQuery();
$qb->matching($qb->in('categories.uid', $categories));
return $qb->execute();
}
}
@@ -79,8 +79,7 @@ class HotelDataService implements SingletonInterface
$hotelData['available'] = -1; // TODO: Needs improvement. '-1' actually means: no price/date info available
}
$hotelCategory = array_key_exists($hotelData['hotelCategory'], Hotel::$categoryLabels) ?
Hotel::$categoryLabels[$hotelData['hotelCategory']] : null;
$hotelCategory = Hotel::$categoryLabels[$hotelData['hotelCategory'] ?? ''] ?? null;
$dateStart = new \DateTime($hotelData['dateStart'] ?? 'now');
$dateEnd = new \DateTime($hotelData['dateEnd'] ?? 'now');
@@ -147,7 +146,7 @@ class HotelDataService implements SingletonInterface
'minDateStart' => null,
'maxDateEnd' => null,
'minPrice' => null,
'pseudoPrice' => $row['pseudoPrice'],
'pseudoPrice' => $row['pseudoPrice'] ?? null,
'available' => 0,
'detailPage' => $row['hotelDetailPage'],
'name' => $row['hotelName'],
@@ -159,16 +158,18 @@ class HotelDataService implements SingletonInterface
'code' => $row['countryCode'],
],
'region' => [
'name' => $row['regionName'],
'name' => $row['regionName'] ?? null,
]
];
}
$teaser =& $teasers[$hotelUid];
$teaser['available'] += $row['available'];
// Hotels without dates (date-independent teasers) have no date columns: as PHP 7.4 read
// them, they count as not available, with today as date and no price
$teaser['available'] += $row['available'] ?? 0;
$dateStart = new \DateTime($row['dateStart']);
$dateEnd = new \DateTime($row['dateEnd']);
$dateStart = new \DateTime($row['dateStart'] ?? 'now');
$dateEnd = new \DateTime($row['dateEnd'] ?? 'now');
if ($teaser['minDateStart'] === null || $teaser['minDateStart'] > $dateStart) {
$teaser['minDateStart'] = $dateStart;
@@ -178,8 +179,8 @@ class HotelDataService implements SingletonInterface
$teaser['maxDateEnd'] = $dateEnd;
}
if ($teaser['minPrice'] === null || $teaser['minPrice'] > $row['minPrice']) {
$teaser['minPrice'] = $row['minPrice'];
if ($teaser['minPrice'] === null || $teaser['minPrice'] > ($row['minPrice'] ?? null)) {
$teaser['minPrice'] = $row['minPrice'] ?? null;
}
}
@@ -0,0 +1,35 @@
<?xml version="1.0"?>
<T3DataStructure>
<meta>
<langDisable>1</langDisable>
</meta>
<sheets>
<sDEF>
<ROOT>
<sheetTitle>Konfiguration</sheetTitle>
<type>array</type>
<el>
<settings.cityUid>
<exclude>0</exclude>
<label>Ort</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<foreign_table>tx_epproducts_domain_model_city</foreign_table>
<foreign_table_where>AND tx_epproducts_domain_model_city.hidden = 0 AND tx_epproducts_domain_model_city.deleted = 0 ORDER BY tx_epproducts_domain_model_city.name</foreign_table_where>
<minitems>1</minitems>
<maxitems>1</maxitems>
</config>
</settings.cityUid>
<settings.hideMoreLink>
<exclude>0</exclude>
<label>Link zum Suchergebnis ausblenden:</label>
<config>
<type>check</type>
</config>
</settings.hideMoreLink>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>
@@ -0,0 +1,72 @@
<?xml version="1.0"?>
<T3DataStructure>
<meta>
<langDisable>1</langDisable>
</meta>
<sheets>
<sDEF>
<ROOT>
<sheetTitle>Konfiguration</sheetTitle>
<type>array</type>
<el>
<settings.countryUid>
<exclude>0</exclude>
<label>Land</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<foreign_table>tx_epproducts_domain_model_country</foreign_table>
<foreign_table_where>ORDER BY name</foreign_table_where>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0"/>
<numIndex index="1">0</numIndex>
</numIndex>
</items>
<minitems>0</minitems>
<maxitems>1</maxitems>
</config>
</settings.countryUid>
<settings.regionUid>
<exclude>0</exclude>
<label>Gebiet</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<foreign_table>tx_epproducts_domain_model_region</foreign_table>
<foreign_table_where>ORDER BY name</foreign_table_where>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0"/>
<numIndex index="1">0</numIndex>
</numIndex>
</items>
<minitems>0</minitems>
<maxitems>1</maxitems>
</config>
</settings.regionUid>
<settings.season>
<exclude>0</exclude>
<label>Saison:</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Winter</numIndex>
<numIndex index="1">w</numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">Sommer</numIndex>
<numIndex index="1">s</numIndex>
</numIndex>
</items>
<minitems>1</minitems>
<maxitems>1</maxitems>
</config>
</settings.season>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>
@@ -0,0 +1,60 @@
<?xml version="1.0"?>
<T3DataStructure>
<meta>
<langDisable>1</langDisable>
</meta>
<sheets>
<sDEF>
<ROOT>
<sheetTitle>Konfiguration</sheetTitle>
<type>array</type>
<el>
<settings.conceptUid>
<exclude>0</exclude>
<label>Konzept:</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<foreign_table>tx_epproducts_domain_model_concept</foreign_table>
<foreign_table_where>AND tx_epproducts_domain_model_concept.hidden = 0 AND tx_epproducts_domain_model_concept.deleted = 0 ORDER BY tx_epproducts_domain_model_concept.name</foreign_table_where>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Alle</numIndex>
<numIndex index="1">0</numIndex>
</numIndex>
</items>
<minitems>1</minitems>
<maxitems>1</maxitems>
</config>
</settings.conceptUid>
<settings.additionalConceptUids>
<label>Weitere Konzepte f&#xFC;r Teaser:</label>
<config>
<type>select</type>
<renderType>selectSingleBox</renderType>
<foreign_table>tx_epproducts_domain_model_concept</foreign_table>
<foreign_table_where>AND tx_epproducts_domain_model_concept.hidden = 0 AND tx_epproducts_domain_model_concept.deleted = 0 ORDER BY tx_epproducts_domain_model_concept.name</foreign_table_where>
<size>5</size>
<minitems>0</minitems>
<maxitems>10</maxitems>
</config>
</settings.additionalConceptUids>
<settings.hideMoreLink>
<exclude>0</exclude>
<label>Link zum Suchergebnis ausblenden:</label>
<config>
<type>check</type>
</config>
</settings.hideMoreLink>
<settings.hideHeader>
<exclude>0</exclude>
<label>Header ausblenden:</label>
<config>
<type>check</type>
</config>
</settings.hideHeader>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>
@@ -0,0 +1,41 @@
<?xml version="1.0"?>
<T3DataStructure>
<meta>
<langDisable>1</langDisable>
</meta>
<sheets>
<sDEF>
<ROOT>
<sheetTitle>Konfiguration</sheetTitle>
<type>array</type>
<el>
<settings.countryUid>
<exclude>0</exclude>
<label>Land</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<foreign_table>tx_epproducts_domain_model_country</foreign_table>
<foreign_table_where>AND tx_epproducts_domain_model_country.hidden = 0 AND tx_epproducts_domain_model_country.deleted = 0 ORDER BY tx_epproducts_domain_model_country.name</foreign_table_where>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0"/>
<numIndex index="1">0</numIndex>
</numIndex>
</items>
<minitems>0</minitems>
<maxitems>1</maxitems>
</config>
</settings.countryUid>
<settings.hideMoreLink>
<exclude>0</exclude>
<label>Link zum Suchergebnis ausblenden:</label>
<config>
<type>check</type>
</config>
</settings.hideMoreLink>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>
@@ -0,0 +1,29 @@
<?xml version="1.0"?>
<T3DataStructure>
<meta>
<langDisable>1</langDisable>
</meta>
<sheets>
<sDEF>
<ROOT>
<sheetTitle>Konfiguration</sheetTitle>
<type>array</type>
<el>
<settings.faqUids>
<exclude>0</exclude>
<label>Fragen/Antworten</label>
<config>
<type>select</type>
<renderType>selectMultipleSideBySide</renderType>
<foreign_table>tx_epproducts_domain_model_faq</foreign_table>
<foreign_table_where>AND tx_epproducts_domain_model_faq.hidden = 0 AND tx_epproducts_domain_model_faq.deleted = 0 ORDER BY tx_epproducts_domain_model_faq.label</foreign_table_where>
<minitems>1</minitems>
<maxitems>50</maxitems>
<size>10</size>
</config>
</settings.faqUids>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>
@@ -0,0 +1,41 @@
<?xml version="1.0"?>
<T3DataStructure>
<meta>
<langDisable>1</langDisable>
</meta>
<sheets>
<sDEF>
<ROOT>
<sheetTitle>Konfiguration</sheetTitle>
<type>array</type>
<el>
<settings.hotelUid>
<exclude>0</exclude>
<label>Hotel:</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<foreign_table>tx_epproducts_domain_model_hotel</foreign_table>
<foreign_table_where>AND tx_epproducts_domain_model_hotel.hidden = 0 AND tx_epproducts_domain_model_hotel.deleted = 0 ORDER BY tx_epproducts_domain_model_hotel.name</foreign_table_where>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Alle</numIndex>
<numIndex index="1">0</numIndex>
</numIndex>
</items>
<minitems>0</minitems>
<maxitems>1</maxitems>
</config>
</settings.hotelUid>
<settings.hideMoreLink>
<exclude>0</exclude>
<label>Link zum Suchergebnis ausblenden:</label>
<config>
<type>check</type>
</config>
</settings.hideMoreLink>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>
@@ -0,0 +1,46 @@
<?xml version="1.0"?>
<T3DataStructure>
<meta>
<langDisable>1</langDisable>
</meta>
<sheets>
<sDEF>
<ROOT>
<sheetTitle>Konfiguration</sheetTitle>
<type>array</type>
<el>
<settings.productUid>
<exclude>0</exclude>
<label>Produkt:</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<foreign_table>tx_epproducts_domain_model_product</foreign_table>
<foreign_table_where>AND tx_epproducts_domain_model_product.hidden = 0 AND tx_epproducts_domain_model_product.deleted = 0 ORDER BY tx_epproducts_domain_model_product.name_internal</foreign_table_where>
<minitems>1</minitems>
<maxitems>1</maxitems>
</config>
</settings.productUid>
<settings.hotelUid>
<exclude>0</exclude>
<label>Hotel:</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<foreign_table>tx_epproducts_domain_model_hotel</foreign_table>
<foreign_table_where>AND tx_epproducts_domain_model_hotel.hidden = 0 AND tx_epproducts_domain_model_hotel.deleted = 0 ORDER BY tx_epproducts_domain_model_hotel.name</foreign_table_where>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Alle</numIndex>
<numIndex index="1">0</numIndex>
</numIndex>
</items>
<minitems>1</minitems>
<maxitems>1</maxitems>
</config>
</settings.hotelUid>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>
@@ -0,0 +1,200 @@
<?xml version="1.0"?>
<T3DataStructure>
<meta>
<langDisable>1</langDisable>
</meta>
<sheets>
<sDEF>
<ROOT>
<sheetTitle>Konfiguration</sheetTitle>
<type>array</type>
<el>
<settings.columns>
<exclude>0</exclude>
<label>Spalten:</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">vierspaltig</numIndex>
<numIndex index="1">4</numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">dreispaltig</numIndex>
<numIndex index="1">3</numIndex>
</numIndex>
<numIndex index="2" type="array">
<numIndex index="0">zweispaltig</numIndex>
<numIndex index="1">2</numIndex>
</numIndex>
</items>
<minitems>1</minitems>
<maxitems>1</maxitems>
</config>
</settings.columns>
<settings.countryUid>
<exclude>0</exclude>
<label>Land:</label>
<displayCond>FIELD:settings.productUid:REQ:FALSE</displayCond>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<foreign_table>tx_epproducts_domain_model_country</foreign_table>
<foreign_table_where>ORDER BY name</foreign_table_where>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Keine Zuordnung</numIndex>
<numIndex index="1">0</numIndex>
</numIndex>
</items>
<minitems>0</minitems>
<maxitems>1</maxitems>
</config>
</settings.countryUid>
<settings.regionUid>
<exclude>0</exclude>
<label>Gebiet:</label>
<displayCond>FIELD:settings.productUid:REQ:FALSE</displayCond>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<foreign_table>tx_epproducts_domain_model_region</foreign_table>
<foreign_table_where>ORDER BY name</foreign_table_where>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Keine Zuordnung</numIndex>
<numIndex index="1">0</numIndex>
</numIndex>
</items>
<minitems>0</minitems>
<maxitems>1</maxitems>
</config>
</settings.regionUid>
<settings.cityUid>
<exclude>0</exclude>
<label>Ort:</label>
<displayCond>FIELD:settings.productUid:REQ:FALSE</displayCond>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<foreign_table>tx_epproducts_domain_model_city</foreign_table>
<foreign_table_where>ORDER BY name</foreign_table_where>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Keine Zuordnung</numIndex>
<numIndex index="1">0</numIndex>
</numIndex>
</items>
<minitems>0</minitems>
<maxitems>1</maxitems>
</config>
</settings.cityUid>
<settings.conceptUid>
<label>Konzept:</label>
<displayCond>FIELD:settings.productUid:REQ:FALSE</displayCond>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<foreign_table>tx_epproducts_domain_model_concept</foreign_table>
<foreign_table_where>ORDER BY name</foreign_table_where>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Keine Zuordnung</numIndex>
<numIndex index="1">0</numIndex>
</numIndex>
</items>
<minitems>0</minitems>
<maxitems>1</maxitems>
</config>
</settings.conceptUid>
<settings.productUid>
<label>Produkt:</label>
<onChange>reload</onChange>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<foreign_table>tx_epproducts_domain_model_product</foreign_table>
<foreign_table_where>ORDER BY name_internal</foreign_table_where>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Keine Zuordnung</numIndex>
<numIndex index="1">0</numIndex>
</numIndex>
</items>
<minitems>0</minitems>
<maxitems>1</maxitems>
</config>
</settings.productUid>
<settings.category>
<label>Kategorie:</label>
<displayCond>FIELD:settings.productUid:REQ:TRUE</displayCond>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Alle</numIndex>
<numIndex index="1">0</numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">Standard</numIndex>
<numIndex index="1">1</numIndex>
</numIndex>
<numIndex index="2" type="array">
<numIndex index="0">Basic</numIndex>
<numIndex index="1">5</numIndex>
</numIndex>
<numIndex index="3" type="array">
<numIndex index="0">Komfort</numIndex>
<numIndex index="1">2</numIndex>
</numIndex>
<numIndex index="4" type="array">
<numIndex index="0">Deluxe</numIndex>
<numIndex index="1">3</numIndex>
</numIndex>
<numIndex index="5" type="array">
<numIndex index="0">Superdeluxe</numIndex>
<numIndex index="1">4</numIndex>
</numIndex>
</items>
<minitems>0</minitems>
<maxitems>1</maxitems>
</config>
</settings.category>
<settings.type>
<label>Unterkunftsart:</label>
<config>
<type>select</type>
<renderType>selectCheckBox</renderType>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Ferienwohnung</numIndex>
<numIndex index="1">1</numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">Sportclub</numIndex>
<numIndex index="1">2</numIndex>
</numIndex>
<numIndex index="2" type="array">
<numIndex index="0">Apartment</numIndex>
<numIndex index="1">3</numIndex>
</numIndex>
<numIndex index="3" type="array">
<numIndex index="0">G&#xE4;sterhaus</numIndex>
<numIndex index="1">4</numIndex>
</numIndex>
<numIndex index="4" type="array">
<numIndex index="0">Pension</numIndex>
<numIndex index="1">5</numIndex>
</numIndex>
</items>
<minitems>0</minitems>
<maxitems>10</maxitems>
</config>
</settings.type>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>
@@ -0,0 +1,163 @@
<?xml version="1.0"?>
<T3DataStructure>
<meta>
<langDisable>1</langDisable>
</meta>
<sheets>
<sDEF>
<ROOT>
<sheetTitle>Konfiguration</sheetTitle>
<type>array</type>
<el>
<settings.columns>
<exclude>0</exclude>
<label>Spalten:</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">vierspaltig</numIndex>
<numIndex index="1">4</numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">dreispaltig</numIndex>
<numIndex index="1">3</numIndex>
</numIndex>
<numIndex index="2" type="array">
<numIndex index="0">zweispaltig</numIndex>
<numIndex index="1">2</numIndex>
</numIndex>
</items>
<minitems>1</minitems>
<maxitems>1</maxitems>
</config>
</settings.columns>
<settings.countryUid>
<exclude>0</exclude>
<label>Land:</label>
<displayCond>FIELD:settings.productUid:REQ:FALSE</displayCond>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<foreign_table>tx_epproducts_domain_model_country</foreign_table>
<foreign_table_where>ORDER BY name</foreign_table_where>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Keine Zuordnung</numIndex>
<numIndex index="1">0</numIndex>
</numIndex>
</items>
<minitems>0</minitems>
<maxitems>1</maxitems>
</config>
</settings.countryUid>
<settings.regionUid>
<exclude>0</exclude>
<label>Gebiet:</label>
<displayCond>FIELD:settings.productUid:REQ:FALSE</displayCond>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<foreign_table>tx_epproducts_domain_model_region</foreign_table>
<foreign_table_where>ORDER BY name</foreign_table_where>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Keine Zuordnung</numIndex>
<numIndex index="1">0</numIndex>
</numIndex>
</items>
<minitems>0</minitems>
<maxitems>1</maxitems>
</config>
</settings.regionUid>
<settings.productUid>
<label>Produkt:</label>
<onChange>reload</onChange>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<foreign_table>tx_epproducts_domain_model_product</foreign_table>
<foreign_table_where>ORDER BY name_internal</foreign_table_where>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Keine Zuordnung</numIndex>
<numIndex index="1">0</numIndex>
</numIndex>
</items>
<minitems>0</minitems>
<maxitems>1</maxitems>
</config>
</settings.productUid>
<settings.category>
<label>Kategorie:</label>
<displayCond>FIELD:settings.productUid:REQ:TRUE</displayCond>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Alle</numIndex>
<numIndex index="1">0</numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">Standard</numIndex>
<numIndex index="1">1</numIndex>
</numIndex>
<numIndex index="2" type="array">
<numIndex index="0">Basic</numIndex>
<numIndex index="1">5</numIndex>
</numIndex>
<numIndex index="3" type="array">
<numIndex index="0">Komfort</numIndex>
<numIndex index="1">2</numIndex>
</numIndex>
<numIndex index="4" type="array">
<numIndex index="0">Deluxe</numIndex>
<numIndex index="1">3</numIndex>
</numIndex>
<numIndex index="5" type="array">
<numIndex index="0">Superdeluxe</numIndex>
<numIndex index="1">4</numIndex>
</numIndex>
</items>
<minitems>0</minitems>
<maxitems>1</maxitems>
</config>
</settings.category>
<settings.type>
<label>Unterkunftsart:</label>
<config>
<type>select</type>
<renderType>selectCheckBox</renderType>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Ferienwohnung</numIndex>
<numIndex index="1">1</numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">Sportclub</numIndex>
<numIndex index="1">2</numIndex>
</numIndex>
<numIndex index="2" type="array">
<numIndex index="0">Apartment</numIndex>
<numIndex index="1">3</numIndex>
</numIndex>
<numIndex index="3" type="array">
<numIndex index="0">G&#xE4;sterhaus</numIndex>
<numIndex index="1">4</numIndex>
</numIndex>
<numIndex index="4" type="array">
<numIndex index="0">Pension</numIndex>
<numIndex index="1">5</numIndex>
</numIndex>
</items>
<minitems>0</minitems>
<maxitems>10</maxitems>
</config>
</settings.type>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>
@@ -0,0 +1,42 @@
<?xml version="1.0"?>
<T3DataStructure>
<meta>
<langDisable>1</langDisable>
</meta>
<sheets>
<sDEF>
<ROOT>
<sheetTitle>Konfiguration</sheetTitle>
<type>array</type>
<el>
<settings.hotelUids>
<exclude>0</exclude>
<label>Unterk&#xFC;nfte</label>
<config>
<type>select</type>
<renderType>selectMultipleSideBySide</renderType>
<foreign_table>tx_epproducts_domain_model_hotel</foreign_table>
<foreign_table_where>AND tx_epproducts_domain_model_hotel.latitude != "" AND tx_epproducts_domain_model_hotel.longitude != "" ORDER BY name</foreign_table_where>
<minitems>0</minitems>
<maxitems>50</maxitems>
<size>10</size>
</config>
</settings.hotelUids>
<settings.productUids>
<exclude>0</exclude>
<label>Produkte</label>
<config>
<type>select</type>
<renderType>selectMultipleSideBySide</renderType>
<foreign_table>tx_epproducts_domain_model_product</foreign_table>
<foreign_table_where>AND tx_epproducts_domain_model_product.detail_page != 0 ORDER BY name_internal</foreign_table_where>
<minitems>0</minitems>
<maxitems>50</maxitems>
<size>10</size>
</config>
</settings.productUids>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>
@@ -0,0 +1,56 @@
<?xml version="1.0"?>
<T3DataStructure>
<meta>
<langDisable>1</langDisable>
</meta>
<sheets>
<sDEF>
<ROOT>
<sheetTitle>Konfiguration</sheetTitle>
<type>array</type>
<el>
<switchableControllerActions>
<label>Modus</label>
<onChange>reload</onChange>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<default>Pricetable->event</default>
<items type="array">
<numIndex index="1" type="array">
<numIndex index="0">Preistabelle Eventreise</numIndex>
<numIndex index="1">Pricetable->event</numIndex>
</numIndex>
</items>
</config>
</switchableControllerActions>
<settings.forcePartnerIdSelect>
<label>Partner ID Auswahl anzeigen:</label>
<config>
<type>check</type>
<default>0</default>
</config>
</settings.forcePartnerIdSelect>
<settings.partnerIdSelectLabel>
<label>Partner ID Auswahl Text:</label>
<config>
<type>input</type>
<eval>trim</eval>
</config>
</settings.partnerIdSelectLabel>
<settings.productUid>
<label>Produkt:</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<foreign_table>tx_epproducts_domain_model_product</foreign_table>
<foreign_table_where>AND tx_epproducts_domain_model_product.hidden = 0 AND tx_epproducts_domain_model_product.deleted = 0 ORDER BY tx_epproducts_domain_model_product.name_internal</foreign_table_where>
<minitems>1</minitems>
<maxitems>1</maxitems>
</config>
</settings.productUid>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>
@@ -0,0 +1,47 @@
<?xml version="1.0"?>
<T3DataStructure>
<meta>
<langDisable>1</langDisable>
</meta>
<sheets>
<sDEF>
<ROOT>
<sheetTitle>Konfiguration</sheetTitle>
<type>array</type>
<el>
<settings.regionUid>
<exclude>0</exclude>
<label>Gebiet:</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<foreign_table>tx_epproducts_domain_model_region</foreign_table>
<foreign_table_where>AND tx_epproducts_domain_model_region.hidden = 0 AND tx_epproducts_domain_model_region.deleted = 0 ORDER BY tx_epproducts_domain_model_region.name</foreign_table_where>
<minitems>1</minitems>
<maxitems>1</maxitems>
</config>
</settings.regionUid>
<settings.additionalRegionUids>
<exclude>0</exclude>
<label>Weitere Gebiete f&#xFC;r Teaser:</label>
<config>
<type>select</type>
<renderType>selectMultipleSideBySide</renderType>
<foreign_table>tx_epproducts_domain_model_region</foreign_table>
<foreign_table_where>AND tx_epproducts_domain_model_region.hidden = 0 AND tx_epproducts_domain_model_region.deleted = 0 ORDER BY tx_epproducts_domain_model_region.name</foreign_table_where>
<minitems>0</minitems>
<maxitems>5</maxitems>
</config>
</settings.additionalRegionUids>
<settings.hideMoreLink>
<exclude>0</exclude>
<label>Link zum Suchergebnis ausblenden:</label>
<config>
<type>check</type>
</config>
</settings.hideMoreLink>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>
@@ -0,0 +1,48 @@
<?xml version="1.0"?>
<T3DataStructure>
<meta>
<langDisable>1</langDisable>
</meta>
<sheets>
<sDEF>
<ROOT>
<sheetTitle>Konfiguration</sheetTitle>
<type>array</type>
<el>
<settings.countryUid>
<exclude>0</exclude>
<label>Land:</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<foreign_table>tx_epproducts_domain_model_country</foreign_table>
<foreign_table_where>ORDER BY name</foreign_table_where>
<minitems>1</minitems>
<maxitems>1</maxitems>
</config>
</settings.countryUid>
<settings.season>
<exclude>0</exclude>
<label>Saison:</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Winter</numIndex>
<numIndex index="1">w</numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">Sommer</numIndex>
<numIndex index="1">s</numIndex>
</numIndex>
</items>
<minitems>1</minitems>
<maxitems>1</maxitems>
</config>
</settings.season>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>
@@ -0,0 +1,46 @@
<?xml version="1.0"?>
<T3DataStructure>
<meta>
<langDisable>1</langDisable>
</meta>
<sheets>
<sDEF>
<ROOT>
<sheetTitle>Konfiguration</sheetTitle>
<type>array</type>
<el>
<settings.teamListPID>
<exclude>0</exclude>
<label>Listenansicht PID</label>
<config>
<type>input</type>
<size>20</size>
<required>1</required>
</config>
</settings.teamListPID>
<settings.teamShowPID>
<exclude>0</exclude>
<label>Einzelansicht PID</label>
<config>
<type>input</type>
<size>20</size>
<required>1</required>
</config>
</settings.teamShowPID>
<settings.teamCategories>
<exclude>0</exclude>
<label>Auf Kategorie beschr&#xE4;nken</label>
<config>
<type>select</type>
<renderType>selectMultipleSideBySide</renderType>
<enableMultiSelectFilterTextfield>1</enableMultiSelectFilterTextfield>
<foreign_table>sys_category</foreign_table>
<minitems>0</minitems>
<maxitems>99</maxitems>
</config>
</settings.teamCategories>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>
@@ -49,6 +49,96 @@ call_user_func(function () {
'Schneehöhen'
);
ExtensionUtility::registerPlugin(
'EpProducts',
'country_detail',
'Land'
);
ExtensionUtility::registerPlugin(
'EpProducts',
'region_teasergroup',
'Gebiet: Teaser'
);
ExtensionUtility::registerPlugin(
'EpProducts',
'region_detail',
'Gebiet: Details'
);
ExtensionUtility::registerPlugin(
'EpProducts',
'city_teasergroup',
'Ort: Teaser'
);
ExtensionUtility::registerPlugin(
'EpProducts',
'city_detail',
'Ort: Details'
);
ExtensionUtility::registerPlugin(
'EpProducts',
'hotel_teasergroup',
'Hotel: Teaser'
);
ExtensionUtility::registerPlugin(
'EpProducts',
'hotel_teasergroup_nodate',
'Hotel: Teaser (terminunabhängig)'
);
ExtensionUtility::registerPlugin(
'EpProducts',
'hotel_detail',
'Hotel: Details'
);
ExtensionUtility::registerPlugin(
'EpProducts',
'hotel_detail_event',
'Hotel: Details (Event)'
);
ExtensionUtility::registerPlugin(
'EpProducts',
'concept_teasergroup',
'Konzept: Teaser'
);
ExtensionUtility::registerPlugin(
'EpProducts',
'concept_detail',
'Konzept: Details'
);
ExtensionUtility::registerPlugin(
'EpProducts',
'teammembers',
'Team'
);
ExtensionUtility::registerPlugin(
'EpProducts',
'faq',
'FAQ'
);
ExtensionUtility::registerPlugin(
'EpProducts',
'maps',
'Übersichtskarte Hotels/Produkte'
);
ExtensionUtility::registerPlugin(
'EpProducts',
'pricetable',
'Preistabelle'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['epproducts_product_detail'] = 'pi_flexform';
ExtensionManagementUtility::addPiFlexFormValue(
'epproducts_product_detail',
@@ -73,4 +163,88 @@ call_user_func(function () {
'FILE:EXT:ep_products/Configuration/FlexForms/flexform_snowreport.xml'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['epproducts_country_detail'] = 'pi_flexform';
ExtensionManagementUtility::addPiFlexFormValue(
'epproducts_country_detail',
'FILE:EXT:ep_products/Configuration/FlexForms/flexform_country.xml'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['epproducts_region_teasergroup'] = 'pi_flexform';
ExtensionManagementUtility::addPiFlexFormValue(
'epproducts_region_teasergroup',
'FILE:EXT:ep_products/Configuration/FlexForms/flexform_region_teaser.xml'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['epproducts_region_detail'] = 'pi_flexform';
ExtensionManagementUtility::addPiFlexFormValue(
'epproducts_region_detail',
'FILE:EXT:ep_products/Configuration/FlexForms/flexform_region_detail.xml'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['epproducts_city_teasergroup'] = 'pi_flexform';
ExtensionManagementUtility::addPiFlexFormValue(
'epproducts_city_teasergroup',
'FILE:EXT:ep_products/Configuration/FlexForms/flexform_city_teaser.xml'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['epproducts_city_detail'] = 'pi_flexform';
ExtensionManagementUtility::addPiFlexFormValue(
'epproducts_city_detail',
'FILE:EXT:ep_products/Configuration/FlexForms/flexform_city_detail.xml'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['epproducts_hotel_teasergroup'] = 'pi_flexform';
ExtensionManagementUtility::addPiFlexFormValue(
'epproducts_hotel_teasergroup',
'FILE:EXT:ep_products/Configuration/FlexForms/flexform_hotel_teaser.xml'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['epproducts_hotel_teasergroup_nodate'] = 'pi_flexform';
ExtensionManagementUtility::addPiFlexFormValue(
'epproducts_hotel_teasergroup_nodate',
'FILE:EXT:ep_products/Configuration/FlexForms/flexform_hotel_teaser_date_independent.xml'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['epproducts_hotel_detail'] = 'pi_flexform';
ExtensionManagementUtility::addPiFlexFormValue(
'epproducts_hotel_detail',
'FILE:EXT:ep_products/Configuration/FlexForms/flexform_hotel_detail.xml'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['epproducts_hotel_detail_event'] = 'pi_flexform';
ExtensionManagementUtility::addPiFlexFormValue(
'epproducts_hotel_detail_event',
'FILE:EXT:ep_products/Configuration/FlexForms/flexform_hotel_detail_event.xml'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['epproducts_concept_detail'] = 'pi_flexform';
ExtensionManagementUtility::addPiFlexFormValue(
'epproducts_concept_detail',
'FILE:EXT:ep_products/Configuration/FlexForms/flexform_concept_detail.xml'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['epproducts_faq'] = 'pi_flexform';
ExtensionManagementUtility::addPiFlexFormValue(
'epproducts_faq',
'FILE:EXT:ep_products/Configuration/FlexForms/flexform_faq.xml'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['epproducts_maps'] = 'pi_flexform';
ExtensionManagementUtility::addPiFlexFormValue(
'epproducts_maps',
'FILE:EXT:ep_products/Configuration/FlexForms/flexform_maps.xml'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['epproducts_pricetable'] = 'pi_flexform';
ExtensionManagementUtility::addPiFlexFormValue(
'epproducts_pricetable',
'FILE:EXT:ep_products/Configuration/FlexForms/flexform_pricetable.xml'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['epproducts_teammembers'] = 'pi_flexform';
ExtensionManagementUtility::addPiFlexFormValue(
'epproducts_teammembers',
'FILE:EXT:ep_products/Configuration/FlexForms/flexform_teammembers.xml'
);
});
+129
View File
@@ -1,6 +1,15 @@
<?php
use TYPO3\CMS\Extbase\Utility\ExtensionUtility;
use EP\EpProducts\Controller\ProductController;
use EP\EpProducts\Controller\CityController;
use EP\EpProducts\Controller\ConceptController;
use EP\EpProducts\Controller\CountryController;
use EP\EpProducts\Controller\FaqController;
use EP\EpProducts\Controller\HotelController;
use EP\EpProducts\Controller\MapController;
use EP\EpProducts\Controller\PricetableController;
use EP\EpProducts\Controller\RegionController;
use EP\EpProducts\Controller\TeamController;
use EP\EpProducts\Controller\SearchController;
use EP\EpProducts\Controller\SearchbarController;
use EP\EpProducts\Controller\SnowreportController;
@@ -56,6 +65,126 @@ $boot = function () {
]
);
ExtensionUtility::configurePlugin(
'EpProducts',
'country_detail',
[
CountryController::class => 'detail',
]
);
ExtensionUtility::configurePlugin(
'EpProducts',
'region_teasergroup',
[
RegionController::class => 'teasergroup',
]
);
ExtensionUtility::configurePlugin(
'EpProducts',
'region_detail',
[
RegionController::class => 'detail',
]
);
ExtensionUtility::configurePlugin(
'EpProducts',
'city_teasergroup',
[
CityController::class => 'teasergroup',
]
);
ExtensionUtility::configurePlugin(
'EpProducts',
'city_detail',
[
CityController::class => 'detail',
]
);
ExtensionUtility::configurePlugin(
'EpProducts',
'hotel_teasergroup',
[
HotelController::class => 'teasergroup',
]
);
ExtensionUtility::configurePlugin(
'EpProducts',
'hotel_teasergroup_nodate',
[
HotelController::class => 'dateIndependentTeasergroup',
]
);
ExtensionUtility::configurePlugin(
'EpProducts',
'hotel_detail',
[
HotelController::class => 'detail',
]
);
ExtensionUtility::configurePlugin(
'EpProducts',
'hotel_detail_event',
[
HotelController::class => 'detailEvent',
]
);
ExtensionUtility::configurePlugin(
'EpProducts',
'faq',
[
FaqController::class => 'detail',
]
);
ExtensionUtility::configurePlugin(
'EpProducts',
'concept_teasergroup',
[
ConceptController::class => 'teasergroup',
]
);
ExtensionUtility::configurePlugin(
'EpProducts',
'concept_detail',
[
ConceptController::class => 'detail',
]
);
ExtensionUtility::configurePlugin(
'EpProducts',
'teammembers',
[
TeamController::class => 'list,show',
]
);
ExtensionUtility::configurePlugin(
'EpProducts',
'maps',
[
MapController::class => 'general',
]
);
ExtensionUtility::configurePlugin(
'EpProducts',
'pricetable',
[
PricetableController::class => 'event',
]
);
ExtensionUtility::configurePlugin(
'EpProducts',
'searchresult',
@@ -74,7 +74,7 @@ class ContainerViewHelper extends AbstractViewHelper
$content = $this->arguments['content'];
}
$classes = [];
if (\in_array($this->arguments['data']['colPos'], static::$columnsWithoutContainers, false)) {
if (\in_array($this->arguments['data']['colPos'] ?? null, static::$columnsWithoutContainers, false)) {
$classes[] = 'container';
}
if ($this->arguments['cssClasses'] !== null) {
@@ -88,8 +88,8 @@ class ContainerViewHelper extends AbstractViewHelper
$scaleBottom = static::$scale[$this->arguments['data']['space_after_class']];
$classes[] = sprintf('pb-%d', $scaleBottom);
}
if ('default' !== $this->arguments['data']['frame_class']) {
$classes[] = $this->arguments['data']['frame_class'];
if ('default' !== ($this->arguments['data']['frame_class'] ?? null)) {
$classes[] = $this->arguments['data']['frame_class'] ?? null;
}
if (count($classes) > 0) {
return sprintf('<div class="%s"%s>%s</div>', implode(' ', $classes), $this->arguments['rteContent'] ? ' data-rte-content' : '', $content);
@@ -1,64 +1,59 @@
<?xml version="1.0"?>
<T3DataStructure>
<meta>
<langDisable>1</langDisable>
</meta>
<sheets>
<sDEF>
<ROOT>
<TCEforms>
<sheetTitle>Konfiguration</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<buttons>
<section>1</section>
<type>array</type>
<el>
<container>
<title>Button</title>
<type>array</type>
<el>
<label>
<TCEforms>
<label>Label</label>
<config>
<type>input</type>
<size>32</size>
</config>
</TCEforms>
</label>
<link>
<TCEforms>
<exclude>1</exclude>
<label>Button</label>
<config>
<type>input</type>
<eval>trim</eval>
<size>30</size>
<wizards type="array">
<_PADDING type="integer">2</_PADDING>
<link type="array">
<type>popup</type>
<title>Link</title>
<icon>EXT:backend/Resources/Public/Images/FormFieldWizard/wizard_link.gif</icon>
<module>
<name>wizard_link</name>
<urlParameters>
<mode>wizard</mode>
</urlParameters>
</module>
<JSopenParams>height=300,width=500,status=0,menubar=0,scrollbars=1</JSopenParams>
</link>
</wizards>
</config>
</TCEforms>
</link>
</el>
</container>
</el>
</buttons>
</el>
</ROOT>
</sDEF>
</sheets>
<meta>
<langDisable>1</langDisable>
</meta>
<sheets>
<sDEF>
<ROOT>
<sheetTitle>Konfiguration</sheetTitle>
<type>array</type>
<el>
<buttons>
<section>1</section>
<type>array</type>
<el>
<container>
<title>Button</title>
<type>array</type>
<el>
<label>
<label>Label</label>
<config>
<type>input</type>
<size>32</size>
</config>
</label>
<link>
<exclude>1</exclude>
<label>Button</label>
<config>
<type>input</type>
<eval>trim</eval>
<size>30</size>
<wizards type="array">
<_PADDING type="integer">2</_PADDING>
<link type="array">
<type>popup</type>
<title>Link</title>
<icon>EXT:backend/Resources/Public/Images/FormFieldWizard/wizard_link.gif</icon>
<module>
<name>wizard_link</name>
<urlParameters>
<mode>wizard</mode>
</urlParameters>
</module>
<JSopenParams>height=300,width=500,status=0,menubar=0,scrollbars=1</JSopenParams>
</link>
</wizards>
</config>
</link>
</el>
</container>
</el>
</buttons>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>
@@ -0,0 +1,68 @@
<html data-namespace-typo3-fluid="true" lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
<div class="herounit h-80 lg:h-96 mb-8">
<f:alias map="{headerImage: images.0}">
<f:if condition="{headerImage}">
<picture>
<source srcset="{f:uri.image(image: headerImage, width: '1370c', height: '360')}" media="(min-width: 768px)">
<source srcset="{f:uri.image(image: headerImage, width: '640c', height: '320')}" media="(max-width: 767px)">
<f:image class="block w-full h-full object-cover"
image="{headerImage}"
height="640"
alt="{headerImage.alternative}"/>
</picture>
</f:if>
</f:alias>
<div class="absolute bottom-0 left-0 inset-x-0 px-8 md:bottom-1/2 md:translate-y-1/2">
<div class="lg:container px-0">
<div class="bg-ep-primary/80 sbw:bg-sbw-primary/80 snz:bg-snz-primary/80 uch:bg-uch-primary/80 py-4 lg:py-8 px-4 mb-8 md:max-w-1/2 p-16">
<span class="block text-xl md:text-2xl font-light text-white uppercase">
{topline}
</span>
<span class="block text-2xl md:text-3xl lg:text-4xl text-white uppercase">
{headline}
</span>
</div>
</div>
</div>
<f:if condition="{headerImage.originaldescription}">
<div class="pagehead__picturecredit">{headerImage.description -> f:format.htmlspecialchars()}</div>
</f:if>
<f:if condition="{settings.showSkipassBadge} || {badge}">
<div class="herounit__badge-wrapper">
<f:if condition="{settings.showSkipassBadge}">
<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>
</div>
</f:link.typolink>
</f:if>
<f:if condition="{badge}">
<f:alias map="{badgeData: badge.0.data}">
<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"
preserveAspectRatio="xMinYMin meet"
class="w-full h-full">
<circle fill="currentColor" class="text-ep-primary-dark/50" cx="100" cy="100" r="100"/>
<circle fill="currentColor" class="text-ep-primary-dark" cx="100" cy="100" r="70"/>
</svg>
<div class="absolute top-0 left-0 inset-0 flex flex-col items-center justify-center p-8">
<span class="block text-center text-white uppercase font-bold leading-none text-xl">{badgeData.title -> f:format.raw()}</span>
<f:if condition="{badgeData.subtitle}">
<span class="block text-center text-white uppercase font-bold leading-none">{badgeData.subtitle -> f:format.raw()}</span>
</f:if>
</div>
</div>
</f:link.typolink>
</f:alias>
</f:if>
</div>
</f:if>
</div>
</html>
@@ -0,0 +1,31 @@
<html data-namespace-typo3-fluid="true" lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers"
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers"
xmlns:v="http://typo3.org/ns/FluidTYPO3/Vhs/ViewHelpers">
<f:layout name="Default"/>
<f:section name="Main">
<f:render partial="SubpageHeader"
arguments="{images: city.headerImages, topline: city.headerSubtitle, headline: city.headerTitle, settings: settings}"/>
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
<div class="container">
<f:render partial="Header/Header"
arguments="{layout: 8, subheader: city.name, header: city.headline}"/>
<div class="grid grid-cols-3 gap-8">
<div class="col-span-3 lg:col-span-2">
<f:render partial="City/Details" arguments="{city: city, teasers: teasers}"/>
</div>
<div class="col-span-3 lg:col-span-1">
<f:render partial="Facts" arguments="{facts: city.facts, title: city.name}"/>
<f:if condition="{city.region.winter}">
<f:render partial="Snowreport" arguments="{snowreport: city.region.snowreport}"/>
<f:render partial="Regioninfo" arguments="{region: city.region}"/>
</f:if>
</div>
</div>
</div>
</f:section>
</html>
@@ -0,0 +1,46 @@
<html data-namespace-typo3-fluid="true" lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers"
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers">
<f:layout name="Default"/>
<f:section name="Main">
<ep:container data="{data}">
<f:if condition="{teasers}">
<div data-controller="teasergrid"
data-teasergrid-grid-class="grid-cols-2"
data-teasergrid-disabled-value="false">
<f:render partial="Header/Header"
arguments="{header: data.header, subheader: data.subheader, layout: data.header_layout, link: data.header_link, default: settings.defaultHeaderType}" />
<div class="flex items-center space-x-1 mb-2 sm:hidden">
<button type="button"
class="opacity-50"
aria-label="kompakte Ansicht"
data-action="teasergrid#grid"
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>
</svg>
</button>
<button type="button"
aria-label="vergrößerte Ansicht"
data-action="teasergrid#block"
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>
</svg>
</button>
</div>
<div class="grid grid-cols-2 lg:grid-cols-3 gap-4 md:gap-8"
data-teasergrid-target="container">
<f:for each="{teasers}" as="city">
<f:render partial="City/Teaser" section="Teaser" arguments="{_all}"/>
</f:for>
</div>
</div>
</f:if>
</ep:container>
</f:section>
</html>
@@ -0,0 +1,123 @@
<html data-namespace-typo3-fluid="true" lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers"
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers">
<f:layout name="Default"/>
<f:section name="Main">
<f:if condition="{settings.hideHeader}">
<f:else>
<f:render partial="SubpageHeader"
arguments="{images: concept.headerImages, topline: concept.headerSubtitle, headline: concept.headerTitle, settings: settings}"/>
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
</f:else>
</f:if>
<div class="container">
<f:render partial="Header/Header"
arguments="{layout: 8, subheader: concept.name, header: concept.headline}"/>
<div class="grid grid-cols-3 gap-8">
<div class="col-span-3 lg:col-span-2">
<div data-rte-content>
{concept.description -> f:format.html()}
</div>
<f:if condition="{teasers}">
<f:then>
<a class="anchor" id="teasers"></a>
<div class="bg-zinc-50 p-4 mb-4"
data-controller="teasergrid"
data-teasergrid-grid-class="grid-cols-2"
data-teasergrid-disabled-value="false">
<div class="flex items-center space-x-1 mb-2 sm:hidden">
<button type="button"
class="opacity-50"
aria-label="kompakte Ansicht"
data-action="teasergrid#grid"
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>
</svg>
</button>
<button type="button"
aria-label="vergrößerte Ansicht"
data-action="teasergrid#block"
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>
</svg>
</button>
</div>
<div class="grid grid-cols-2 xl:grid-cols-3 gap-4 md:gap-8"
data-teasergrid-target="container">
<f:for each="{teasers}" as="teaser" iteration="iteration">
<f:render partial="Product/Teaser" section="Teaser" arguments="{
concept: teaser.concept,
hotel: teaser.hotel,
product: teaser.product,
country: teaser.country,
region: teaser.region,
productImage: teaser.product.images.original.0,
nights: teaser.nights,
board: teaser.board,
minPrice: teaser.minPrice,
daytrip: teaser.daytrip,
season: teaser.season,
forceHotelUid: teaser.forceHotelUid,
dateFrom: dateFrom,
dateTo: dateTo,
index: iteration.index,
skiPassIncluded: teaser.skiPassIncluded
}"/>
</f:for>
</div>
<f:if condition="{settings.hideMoreLink}">
<f:else>
<div class="text-right mt-4">
<f:link.typolink class="button bg-button"
parameter="{settings.defaultSearchPageUid}"
additionalParams="f={filterSettings -> ep:filterSettingsEncoder()}">
Alle anzeigen
</f:link.typolink>
</div>
</f:else>
</f:if>
</div>
</f:then>
<f:else>
<f:if condition="{concept.images -> f:count()} > 0">
<f:render partial="ImageGallery" arguments="{images: concept.images, id: 'concept-{concept.uid}', thumbnails: 1}"/>
</f:if>
</f:else>
</f:if>
<f:if condition="{concept.descriptionExtended}">
<div data-rte-content>
{concept.descriptionExtended -> f:format.html()}
</div>
</f:if>
<f:if condition="{teasers}">
<f:if condition="{concept.images -> f:count()} > 0">
<f:render partial="ImageGallery" arguments="{images: concept.images, id: 'concept-{concept.uid}', thumbnails: 1}"/>
</f:if>
</f:if>
</div>
<div class="col-span-3 lg:col-span-1">
<ul class="list-none p-0 m-0 space-y-2">
<f:for each="{pages}" as="page">
<f:if condition="{page.hidden}">
<f:else>
<li>
<f:link.typolink parameter="{page.uid}"
class="button bg-button {f:if(condition: '{data.pid} == {page.uid}', then: 'bg-button--active', else: 'bg-button--light')} w-full">
{page.title}
</f:link.typolink>
</li>
</f:else>
</f:if>
</f:for>
</ul>
</div>
</div>
</div>
</f:section>
</html>
@@ -0,0 +1,46 @@
<html data-namespace-typo3-fluid="true" lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers"
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers">
<f:layout name="Default"/>
<f:section name="Main">
<f:if condition="{teasers}">
<ep:container data="{data}">
<f:render partial="Header/Header"
arguments="{header: data.header, subheader: data.subheader, layout: data.header_layout, link: data.header_link, default: settings.defaultHeaderType}" />
<div data-controller="teasergrid"
data-teasergrid-grid-class="grid-cols-2"
data-teasergrid-disabled-value="false">
<div class="flex items-center space-x-1 mb-2 sm:hidden">
<button type="button"
class="opacity-50"
aria-label="kompakte Ansicht"
data-action="teasergrid#grid"
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>
</svg>
</button>
<button type="button"
aria-label="vergrößerte Ansicht"
data-action="teasergrid#block"
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>
</svg>
</button>
</div>
<div class="grid grid-cols-2 lg:grid-cols-3 gap-4 md:gap-8"
data-teasergrid-target="container">
<f:for each="{teasers}" as="city">
<f:render partial="Concept/Teaser" section="Teaser" arguments="{_all}"/>
</f:for>
</div>
</div>
</ep:container>
</f:if>
</f:section>
</html>
@@ -0,0 +1,130 @@
<html data-namespace-typo3-fluid="true" lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers"
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers"
xmlns:v="http://typo3.org/ns/FluidTYPO3/Vhs/ViewHelpers">
<f:layout name="Default"/>
<f:section name="Main">
<f:render partial="SubpageHeader"
arguments="{images: country.headerImages, topline: country.headerSubtitle, headline: country.headerTitle, settings: settings}"/>
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
<div class="container">
<f:render partial="Header/Header"
arguments="{layout: 8, subheader: country.name, header: country.headline}"/>
<div class="grid grid-cols-3 gap-8">
<div class="col-span-3 lg:col-span-2" id="teasers">
<div data-rte-content>
{country.description -> f:format.html()}
</div>
<f:if condition="{teasers}">
<div class="bg-zinc-50 p-4 mb-4"
data-controller="teasergrid"
data-teasergrid-grid-class="grid-cols-2"
data-teasergrid-disabled-value="false">
<f:if condition="{teasers -> f:count()} <= 2">
<f:then>
<div class="grid gap-4 md:gap-8">
<f:for each="{teasers}" as="teaser" iteration="iteration">
<f:render partial="Product/Teaser" section="Teaser" arguments="{
landscape: 1,
concept: teaser.concept,
hotel: teaser.hotel,
product: teaser.product,
country: teaser.country,
region: teaser.region,
productImage: teaser.product.images.original.0,
nights: teaser.nights,
board: teaser.board,
minPrice: teaser.minPrice,
daytrip: teaser.daytrip,
season: teaser.season,
forceHotelUid: teaser.forceHotelUid,
dateFrom: dateFrom,
dateTo: dateTo,
index: iteration.index,
globalConceptCode: settings.globalConceptCode,
skiPassIncluded: teaser.skiPassIncluded
}"/>
</f:for>
</div>
</f:then>
<f:else>
<div class="flex items-center space-x-1 mb-2 sm:hidden">
<button type="button"
class="opacity-50"
aria-label="kompakte Ansicht"
data-action="teasergrid#grid"
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>
</svg>
</button>
<button type="button"
aria-label="vergrößerte Ansicht"
data-action="teasergrid#block"
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>
</svg>
</button>
</div>
<div class="grid grid-cols-2 xl:grid-cols-3 gap-4 md:gap-8"
data-teasergrid-target="container">
<f:for each="{teasers}" as="teaser" iteration="iteration">
<f:render partial="Product/Teaser" section="Teaser" arguments="{
concept: teaser.concept,
hotel: teaser.hotel,
product: teaser.product,
country: teaser.country,
region: teaser.region,
productImage: teaser.product.images.original.0,
nights: teaser.nights,
board: teaser.board,
minPrice: teaser.minPrice,
daytrip: teaser.daytrip,
season: teaser.season,
forceHotelUid: teaser.forceHotelUid,
dateFrom: dateFrom,
dateTo: dateTo,
index: iteration.index,
globalConceptCode: settings.globalConceptCode,
skiPassIncluded: teaser.skiPassIncluded
}"/>
</f:for>
</div>
</f:else>
</f:if>
<f:if condition="{settings.hideMoreLink}">
<f:else>
<div class="text-right mt-4">
<f:link.typolink class="button bg-button"
parameter="{settings.defaultSearchPageUid}"
additionalParams="f={filterSettings -> ep:filterSettingsEncoder()}">
Alle anzeigen
</f:link.typolink>
</div>
</f:else>
</f:if>
</div>
</f:if>
<f:if condition="{country.descriptionExtended}">
<div data-rte-content>
{country.descriptionExtended -> f:format.html()}
</div>
</f:if>
<f:if condition="{country.images -> f:count()} > 0">
<f:render partial="ImageGallery" arguments="{images: country.images, id: 'country-{country.uid}'}"/>
</f:if>
</div>
<div class="col-span-3 lg:col-span-1">
<f:render partial="Facts" arguments="{facts: country.facts, title: country.name}"/>
<f:render partial="Officetip" arguments="{officetip: country.officetip}"/>
<f:render partial="Snowreport" arguments="{snowreport: country.snowreport}"/>
</div>
</div>
</div>
</f:section>
</html>
@@ -0,0 +1,13 @@
<html data-namespace-typo3-fluid="true" lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers"
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers"
xmlns:v="http://typo3.org/ns/FluidTYPO3/Vhs/ViewHelpers">
<f:layout name="Default"/>
<f:section name="Main">
<f:render partial="Faq" arguments="{settings: settings, faqs: faqs, filter: 1}"/>
</f:section>
</html>
@@ -0,0 +1,27 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="en"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers"
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers">
<f:layout name="Default"/>
<f:section name="Main">
<div>
<ep:container data="{data}">
<div class="splide"
data-controller="slider"
data-slider-preset-value="teasers">
<div class="splide__track">
<ul class="splide__list">
<f:for each="{teasers}" as="hotel">
<li class="splide__slide">
<f:render partial="Hotel/TeaserSimple" section="Teaser" arguments="{_all}"/>
</li>
</f:for>
</ul>
</div>
</div>
</ep:container>
</div>
</f:section>
</html>
@@ -0,0 +1,37 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="en"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers"
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers"
xmlns:v="http://typo3.org/ns/FluidTYPO3/Vhs/ViewHelpers">
<f:layout name="Default"/>
<f:section name="Main">
<f:render partial="SubpageHeader"
arguments="{images: hotel.headerImages, topline: hotel.headerSubtitle, headline: hotel.headerTitle, settings: settings}"/>
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
<div class="container">
<f:render partial="Header/Header"
arguments="{layout: 8, subheader: hotel.name, header: hotel.headline}"/>
<div class="grid grid-cols-3 gap-8">
<div class="col-span-3 md:col-span-2">
<f:render partial="Hotel/Details"
arguments="{hotel: hotel, teasers: teasers, filterSettings: filterSettings, showNonBookableHint: 1}"/>
</div>
<div class="col-span-3 md:col-span-1">
<f:render partial="Facts" arguments="{facts: hotel.facts, title: hotel.name}"/>
<f:if condition="{hotel.region.winter}">
<f:render partial="Snowreport" arguments="{snowreport: hotel.region.snowreport}"/>
<f:render partial="Regioninfo" arguments="{region: hotel.region}"/>
</f:if>
<div class="bg-zinc-50 p-4">
<p><strong>Lage</strong></p>
<div>
<f:render partial="Map/Osm" arguments="{settings: settings, lat: hotel.latitude, lng: hotel.longitude, externalLink: '{f:uri.typolink(parameter: hotel.externalLink)}'}"/>
</div>
</div>
</div>
</div>
</div>
</f:section>
</html>
@@ -0,0 +1,39 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="en"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers"
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers">
<f:layout name="Default"/>
<f:section name="Main">
<f:render partial="Header/Header"
arguments="{layout: 8, subheader: hotel.name, header: hotel.headline}"/>
<div class="grid grid-cols-2 gap-8">
<div class="col-span-2 md:col-span-1">
<f:render partial="ImageGallery"
arguments="{id: hotel.uid, images: hotel.images, thumbnails: 0}"/>
</div>
<div class="col-span-2 md:col-span-1">
{hotel.description -> f:format.html()}
</div>
</div>
<div data-rte-content>
<f:if condition="{product.bookable}">
<h2>Buchungsoptionen</h2>
<div class="ajax-content-wrapper"
hx-get="{ep:uri.ajax(action: 'pricetableHtml', controller: 'AjaxTable', pageUid: settings.defaultAjaxUid, arguments: '{product: product, hotel: hotel, bookingUrlTemplateCode: settings.bookingUrlTemplateCode}', format: 'html')}"
hx-trigger="revealed">
<f:image src="EXT:ep_theme/Resources/Public/images/ajax-loader-white.gif" alt="Loading" title="Loading"/>
</div>
</f:if>
<h2>Ausstattung</h2>
{hotel.features -> f:format.html()}
<h2>Zimmerarten / Apartments</h2>
{hotel.roomTypes -> f:format.html()}
<f:if condition="{hotel.additionalInformation}">
<h2>Zusatzinformationen</h2>
{hotel.additionalInformation -> f:format.html()}
</f:if>
</div>
</f:section>
</html>
@@ -0,0 +1,54 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="en"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers"
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers">
<f:layout name="Default"/>
<f:section name="Main">
<f:if condition="{bookable} || {nonBookable}">
<ep:container data="{data}">
<f:render partial="Header/Header"
arguments="{header: data.header, subheader: data.subheader, layout: data.header_layout, link: data.header_link, default: settings.defaultHeaderType}" />
<div data-controller="teasergrid"
data-teasergrid-grid-class="grid-cols-2"
data-teasergrid-disabled-value="false">
<div class="flex items-center space-x-1 mb-2 sm:hidden">
<button type="button"
class="opacity-50"
aria-label="kompakte Ansicht"
data-action="teasergrid#grid"
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>
</svg>
</button>
<button type="button"
aria-label="vergrößerte Ansicht"
data-action="teasergrid#block"
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>
</svg>
</button>
</div>
<div class="grid grid-cols-2 lg:grid-cols-3 gap-4 md:gap-8"
data-teasergrid-target="container">
<f:for each="{bookable}" as="hotel" iteration="iteration">
<f:render partial="Hotel/Teaser" section="Teaser" arguments="{
hotel: hotel,
index: iteration.index
}"/>
</f:for>
<f:for each="{nonBookable}" as="hotel" iteration="iteration">
<f:render partial="Hotel/Teaser" section="Teaser" arguments="{
hotel: hotel,
index: iteration.index
}"/>
</f:for>
</div>
</div>
</ep:container>
</f:if>
</f:section>
</html>
@@ -0,0 +1,15 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="en"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers"
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers">
<f:layout name="Default"/>
<f:section name="Main">
<f:if condition="{markerData}">
<ep:container data="{data}">
<f:render partial="Map/Osm" arguments="{settings: settings, class: 'mb-8', markers: markerData}"/>
</ep:container>
</f:if>
</f:section>
</html>
@@ -0,0 +1,15 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers"
data-namespace-typo3-fluid="true">
<f:layout name="Default"/>
<f:section name="Main">
<div class="ajax-content-wrapper"
hx-get="{ep:uri.ajax(extensionName: 'epproducts', action: 'eventPricetable', controller: 'AjaxTable', pageUid: settings.defaultAjaxUid, arguments: {product: productUid}, format: 'html')}"
hx-trigger="revealed">
<f:image src="EXT:ep_theme/Resources/Public/images/ajax-loader-white.gif" alt="Loading" title="Loading"/>
</div>
</f:section>
</html>
@@ -0,0 +1,34 @@
<html data-namespace-typo3-fluid="true" lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers"
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers"
xmlns:v="http://typo3.org/ns/FluidTYPO3/Vhs/ViewHelpers">
<f:layout name="Default"/>
<f:section name="Main">
<f:render partial="SubpageHeader"
arguments="{images: region.headerImages, topline: region.headerSubtitle, headline: region.headerTitle, settings: settings, badge: badge}"/>
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
<div class="container">
<f:render partial="Header/Header"
arguments="{layout: 8, subheader: region.name, header: region.headline}"/>
<div class="grid grid-cols-3 gap-8">
<div class="col-span-3 lg:col-span-2">
<f:render partial="Region/Details" arguments="{region: region, teasers: teasers, filterSettings: filterSettings}"/>
</div>
<div class="col-span-3 lg:col-span-1">
<f:if condition="{region.winter}">
<f:render partial="Facts" arguments="{facts: region.facts, title: region.name}"/>
<f:render partial="Snowreport" arguments="{snowreport: region.snowreport}"/>
<f:render partial="Regioninfo" arguments="{region: region}"/>
<f:render partial="Region/Webcam" arguments="{region: region}"/>
<f:render partial="RegionMaps" arguments="{region: region}"/>
<f:render partial="RegionAward" arguments="{region: region}"/>
</f:if>
</div>
</div>
</div>
</f:section>
</html>
@@ -0,0 +1,46 @@
<html data-namespace-typo3-fluid="true" lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers"
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers">
<f:layout name="Default"/>
<f:section name="Main">
<ep:container data="{data}">
<f:if condition="{teasers}">
<div data-controller="teasergrid"
data-teasergrid-grid-class="grid-cols-2"
data-teasergrid-disabled-value="false">
<f:render partial="Header/Header"
arguments="{header: data.header, subheader: data.subheader, layout: data.header_layout, link: data.header_link, default: settings.defaultHeaderType}" />
<div class="flex items-center space-x-1 mb-2 sm:hidden">
<button type="button"
class="opacity-50"
aria-label="kompakte Ansicht"
data-action="teasergrid#grid"
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>
</svg>
</button>
<button type="button"
aria-label="vergrößerte Ansicht"
data-action="teasergrid#block"
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>
</svg>
</button>
</div>
<div class="grid grid-cols-2 lg:grid-cols-3 gap-4 md:gap-8"
data-teasergrid-target="container">
<f:for each="{teasers}" as="region">
<f:render partial="Region/Teaser" section="Teaser" arguments="{_all}"/>
</f:for>
</div>
</div>
</f:if>
</ep:container>
</f:section>
</html>
@@ -0,0 +1,49 @@
<html data-namespace-typo3-fluid="true" lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers"
xmlns:v="http://typo3.org/ns/FluidTYPO3/Vhs/ViewHelpers">
<f:layout name="Default"/>
<f:section name="Main">
<div class="container">
<f:for each="{members -> v:iterator.chunk(count: 4)}" as="group">
<div class="grid grid-cols-4 gap-8 mb-8">
<f:for each="{group}" as="member">
<f:render section="Member" arguments="{member: member}"/>
</f:for>
</div>
</f:for>
</div>
</f:section>
<f:section name="Member">
<div class="col-span-4 sm:col-span-2 md:col-span-1">
<a href="{f:uri.action(
pageUid: settings.teamShowPID,
action: 'show',
extensionName: 'epproducts',
pluginName: 'teammembers',
arguments: '{member: member}'
)}">
<f:if condition="{member.image}">
<f:image image="{member.image}"
loading="lazy"
class="block w-full h-auto rounded-full"
width="400"
height="400c"
alt="{member.name}"/>
</f:if>
<div class="text-center text-zinc-800 pt-2">
<span class="block font-bold text-xl">
{member.name}
</span>
<span class="block">
{member.tasks -> f:format.nl2br()}
</span>
</div>
</a>
</div>
</f:section>
</html>
@@ -0,0 +1,48 @@
<html data-namespace-typo3-fluid="true" lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
<f:layout name="Default"/>
<f:section name="Main">
<div class="container">
<div class="grid grid-cols-3 gap-8">
<div class="col-span-3 md:col-span-1 px-8">
<f:if condition="{member.image}">
<f:image class="rounded-full" image="{member.image}" width="400" height="400c" title="{member.name}" alt="{member.name}"/>
</f:if>
</div>
<div class="col-span-3 md:col-span-2">
<f:render partial="Header/Header" arguments="{header: member.name, subheader: member.tasks, layout: 8}" />
<div data-rte-content>
{member.description -> f:format.html()}
</div>
<f:if condition="{member.email} || {member.phone}">
<div class="mb-8 flex flex-col space-y-2">
<f:if condition="{member.email}">
<f:link.email class="flex items-center space-x-2" email="{member.email}">
<svg class="w-6 h-6 text-ep-primary">
<use href="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/icons_sprite.svg')}#icon-email"></use>
</svg>
<span>{member.email}</span>
</f:link.email>
</f:if>
<f:if condition="{member.phone}">
<a class="flex items-center space-x-2" href="tel:{member.phone -> v:format.pregReplace(pattern: '/[\-\s]/', replacement: '')}" rel="nofollow">
<svg class="w-6 h-6 text-ep-primary">
<use href="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/icons_sprite.svg')}#icon-phone"></use>
</svg>
<span>{member.phone}</span>
</a>
</f:if>
</div>
</f:if>
<a href="javascript:history.back()" class="button bg-button">
zurück
</a>
</div>
</div>
</div>
</f:section>
</html>