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',